• OpenAPI 简介
  • 小程序 OpenAPI SDK 总览
  • 签名算法
  • 基础能力
  • 联合授权
  • 视频能力
  • 线索组件
  • 接口调用凭证
  • 登录
  • code2Session
  • 获取手机号(getPhoneNumber组件code换取手机号)
  • Web 化接入
  • 隐私协议
  • 流量主
  • 小程序码与小程序链接
  • 用户信息
  • 抖音号绑定
  • 小程序推广计划
  • 内容安全
  • 任务能力
  • 分享
  • 客服
  • 小程序券
  • 触达与营销
  • 支付
  • 运营
  • 生活服务
  • 垂直行业
  • 其它
  • 获取手机号(getPhoneNumber组件code换取手机号)

    收藏
    我的收藏

    接口说明

    该接口用于getPhoneNumber安全模式下,开发者服务端使用code来换取用户手机号。
    说明:每个code只能使用一次,code的有效期为5min。code来源于getPhoneNumber组件。

    基本信息

    名称描述
    HTTP URL
    HTTP Method
    POST
    Scope
    apps.phonenumber.info
    权限要求

    注意:此能力仅支持小程序通过试运营期后可用,默认获取权限,无需申请;​

    请求参数

    请求头
    access-token必填String
    示例:clt.943da17996fb5cebfbc70c044c3fc25a57T54DcjT6HNKGqnUdxzy1KcxFnZ
    content-type必填String
    示例:application/json
    固定值"application/json"
    Body
    code必填String
    示例:"RWRwy7BZiOaEqEPjZ6j7NdgbBLEDNMLKC6gpnlMrM718yfUaM5FumPOIyq/hk06yZjkSEfdQZ8nL9OWP2ez6z/3kX8wU5dF10wCw7gl+zZ9ZyIA7QOpojPxPLs1kxZBr7uOyMivU6g+ZnfgP"

    获取手机号的凭证code,通过前端getPhoneNumber组件获取:获取手机号(新方式)(值为返回的code参数)

    请求示例
    curl --location 'https://open.douyin.com/api/apps/v1/get_phonenumber_info/' \ --header 'access-token: clt.94c3d060a5c168ec88fe5ee2a30cc2748i5SFB9IrK63vpkzwLe7S2k15QAe_lf' \ --header 'Content-Type: application/json' \ --data '{ "code": "RWRwy7BZiOaEqEPjZ6j7NdgbBLEDNMLKC6gpnlMrM718yfUaM5FumPOIyq/hk06yZjkSEfdQZ8nL9OWP2ez6z/3kX8wU5dF10wCw7gl+zZ9ZyIA7QOpojPxPLs1kxZBr7uOyMivU6g+ZnfgP" }'

    响应参数

    Body
    dataString
    示例:"OkRv0EHhHO+N+9UOKqaovpAo+TinY7gKIl/7iU9+iOXpj4ryZiKGL+AU5hTRlCRzM9nFdg7O5bFu53Auvx7u8rkMrsFvUcUvyhAL4CpbB2igDEqV2i7zcIUDYOw3V0mGcikC30uB90G5PKDCWBGu1xcslSRgbcpN0jwQRZA5Mw6UEuaiCLqvezxh1dYJHMrS3uZbSxCf3LWaPdliUoaYadqUMKJzNENFyDBDaEWvXsaNAUa/XQjz3414TSWo96K3Fhgg/CAoiPYN+LCD9tnauEAupkTLvN3SP8DeqdvHZaFRFpEjp4w0vmtR2PuQVnef69LLM4752y83r+V2eBS43w=="

    通过开发者在「抖音开放平台-控制台-找到对应的小程序-开发-开发配置」配置的应用公钥 进行RSA非对称加密后的密文数据,需要开发者通过对应的应用私钥进行解密。应用公私钥由开发者生成,并将公钥录入在「应用公钥」上,私钥由开发者保管。(注:应用公私钥需要谨慎修改,在平台更新应用公钥后,默认会选择最新的应用公钥加密,开发者需要立马更新代码中用来解密的应用私钥。

    应用公钥配置流程:

    err_msgString
    示例:"换取手机号信息的票据code已过期"

    错误提示

    err_noInt32
    示例:28005187

    错误码

    log_idString
    示例:20241207234608EE99A1CBDE053DA96622

    抖音开放平台统一日志id

    响应示例
    正常响应示例异常响应示例
    { "data": "OkRv0EHhHO+N+9UOKqaovpAo+TinY7gKIl/7iU9+iOXpj4ryZiKGL+AU5hTRlCRzM9nFdg7O5bFu53Auvx7u8rkMrsFvUcUvyhAL4CpbB2igDEqV2i7zcIUDYOw3V0mGcikC30uB90G5PKDCWBGu1xcslSRgbcpN0jwQRZA5Mw6UEuaiCLqvezxh1dYJHMrS3uZbSxCf3LWaPdliUoaYadqUMKJzNENFyDBDaEWvXsaNAUa/XQjz3414TSWo96K3Fhgg/CAoiPYN+LCD9tnauEAupkTLvN3SP8DeqdvHZaFRFpEjp4w0vmtR2PuQVnef69LLM4752y83r+V2eBS43w==", "err_msg": "", "err_no": 0, "log_id": "202412072348489205763E758A14B87141" }
    切换单列布局

    错误码

    HTTP 状态码错误码错误码描述排查建议
    20028001005
    系统内部错误,请重试
    请求重试,若依然无解请向平台提交反馈
    20028001003
    access_token无效
    重新请求生成access_token
    20028001008
    access_token过期,请刷新或重新授权
    重新请求生成access_token
    20028001016
    当前应用已被封禁或下线
    clientKey被封禁或者下线
    20028001006
    网络调用错误,请重试
    重试即可
    20028001014
    应用未授权任何能力
    确认应用是否授权能力
    20028001018
    应用未获得该能力
    开通相关能力
    20028001019
    应用该能力已被封禁
    该能力被封禁,联系平台处理
    20028001007
    参数不合法
    根据错误信息检查请求参数是否填写正常
    20028005185

    换取手机号信息的票据code不合法

    code无法解析。code应该为getPhoneNumber返回,并且直接透传的

    20028005186

    换取手机号信息的票据code和请求信息不匹配

    code对应的小程序,和生成access_token对应的小程序不是同一个。检查code是否是从生成access_token对应的小程序上通过getPhoneNumber获取到的。

    20028005187

    换取手机号信息的票据code已过期

    code通过getPhoneNumber获取后,只能存活5分钟,且只能使用一次

    20028005191

    未获取到「控制台-开发-开发配置」配置的应用公钥

    前往「控制台-找到对应的小程序-开发-开发配置-密钥设置-应用公钥」添加上应用公钥。

    应用公私钥由开发者生成,并将公钥录入在「应用公钥」上,私钥由开发者保管

    数据解密

    解密后的数据格式如下:
    { "phoneNumber": "138xxxxxxxx", // 用户绑定的手机号(国外手机号会有区号) "purePhoneNumber": "138xxxxxxxx", // 没有区号的手机号 "countryCode": "86", // 区号 "watermark": { "appid": "ttxxxxxxxxxxxxxxxx", "timestamp": 15000000000000000 } }

    解密代码示例

      1.该OpenAPI后端使用的是rsa.EncryptPKCS1v15进行加密,使用PKCS1v15填充方式加密的数据。
      2.非对称加密密钥可以复用开发者工具生成,JAVA 适用PKCS8格式,非JAVA语言适用PKCS1格式。

    Go

    package main import ( "crypto/rand" "crypto/rsa" "crypto/x509" "encoding/base64" "fmt" ) func main() { // encryptData rsa加密后的数据 encryptData := "snPPxBDNiYjRB7uRbZl4VFbdLSeQKCcgsX4iwyexIxHIuuYfvjJtWjj2Do+ox7gkZjPaWqjS2voqF9YG7vy033I6MNVaTPZpQr5h3+xjB2S0mM8R74g3j0JaZ2aV586sooS0TfBaOYT7CxYIp5Y2z/USAh10pAyfo88yk75FZK0hDa1fjFI3cd5tEfHMngS3BK3Ybfp2CA8T1mnfKbWDW6AoZj0bJwdp+WdSRhKDo+s4M3gL0PS343eut/TZvAF/3kI4cKsDA0xTqbTkGm14bKhZHWaaejQktgShN+N9/0x3rkvMCh31SkL3+iaW5zgTEEMFHOoXyPAtd18qZU32JQ==" // privateKey 应用私钥 需要把RSA的私钥头部和尾部的标识去掉,并且整合成一行字符串 privateKey := `MIIEowIBAAKCAQEAujNyq6x88ICGCQ5u0CoBiq+nxJfFbNzLNAoklfIox521AZwHcH5ca0dpjDO47BFJcpY26CnkXKxB4zAk8hvDD4mzUN0FulWVNp24/PJRssLi9Fl9rM9nOTBVyjbzuadJAGRIV+c64rEKIG6R/gZfbrgzb6KNSxQNT9do7DacHFn6SupsmEeGrfGrgpBQMjNLAlQSuaVd/FN2l3wjk4YwWZAU6IVCqn3C0ddwwKYZweNs4UGp/yZ80VCRkQwma5Rq6ORPHNr7fbqHi0XBwE+mp8j1lEpp1Y1ZHtSOHQkE0rqRM8KEO70pdkNDfrTXEI+WblsRGikMUiDLAKUEnTYaGQIDAQABAoIBABaHDPOaPc93LUBBP8TtoBwgXmLZnegq2mbkZ0LA9pAYE4MrVncUwqe0DyAITfI5sTIs3F3AW8GekaYj+ARWuYXSuiApbXz6x7/A21W3F41SKNU5Uowq16lCoM6DUX9/rsReXaZM8oHku33rArzCFp+1p3t1JjUUKvwi6q3ReZewUgfUZ+2AAiobMTYIarNv8UFEhsxla1BCczqy4duKNIyfXsp9CTlhi+WSW+3/lz1JStFEDzy3G3OAUXium6N5Lch8V88eqMIU+h7Xrm0f0EELR2AcvSzqtTYBMV7hh8N8Kn0CAXXDiI9r2aqb3RIOJggPiiXMkphWwUppDmBdUQECgYEA8tdOg8WboACa2MPI21BwVTbkJwLlz4Llfa2bM83RVOUmKBdPcdRkJH+37SbpCH/AxHR2/QSH7uZUpil7e++t2H9MNmJBW6YhkYa2pIXb4NUkgQLXn/vCveIbfn0SvLuS4QkOIlkoUqXhJenZ+iRzME2cXsu4fbou0rPthV7A6TkCgYEAxEpt+To/r/rhQfcRC9OAnwixGutWBW2nEkk3m6b3uESZmVQrhpBWFQjbTwbJIokdx3+3MM/s6I8SXA1i34944uGhpNZqfW7eVpe6PYVp8gcXQLQOTbAUu2+odCFm6JYbpWjno2bkUXCTag2vtMryEYfI/TuHXvEDMMu4iX9dF+ECgYEA7Pql2Tv3Ae51LgHpufRGmzIE9fkC8T1o3PuVELnShUlVshwFYC0HSQMGJz0ofi3FnTGWiJVqXf2SL9EdezXLbhHT+uJpq5l0+sH+7JDgoQj/JZLzf2E9ivXjJM3DgkB+NnMSwvxEuFq+W7RZDp2Rd1rVtUCTGsadOOtzaAqusSkCgYATfsTvZN6gbs1ijNRPlWEH6ogUgV0Yyuw1/7mbJvkhfwa2WMq94aX7DtchQS5G1NF1V/TszynbayJKrDWuuIQsHHa+dWE8Nf+1H/qqU47TL+saTQfCpYNZnlxftFWRMh9qzUF8VCLHB+RMOzHBRgrGvPK0W+40+sDzXrhkR5cKYQKBgEcO7PDeS6J/ob9A0BrgMb2Es5llzDbhNVGBE2VUF3k6eqlkzNgR3vdOnAZsIvKG2KHSNEuVb3VvvblHoiO6/o8yS2sI9xdFlPihmLxPN2giqgWmFzPDB92s3jsPqtNWrmIrXZpNu0KTwvYkDX34v1cchsbfXt0sH4/1ALLPb31F` // decryptData 解密后的数据 decryptData, err := RsaDecryptByPrivateKeyStr(encryptData, privateKey) if err != nil { fmt.Printf("[Error] RsaDecryptByPrivateKeyStr err=%v\n", err) return } fmt.Printf("[Info] decryptData=%v", decryptData) } // RsaDecryptByPrivateKeyStr 私钥解密 func RsaDecryptByPrivateKeyStr(ciperData, privateKey string) (originText string, err error) { //读取私钥 privateKeyBytes, err := base64.StdEncoding.DecodeString(privateKey) if err != nil { fmt.Printf("[Error] base64 decode privateKey=%s err=%v", privateKey, err) return "", err } priRSA, err := x509.ParsePKCS1PrivateKey(privateKeyBytes) if err != nil { fmt.Printf("[Error] x509.ParsePKCS1PrivateKey err=%v", err) return "", err } ciperDateBytes, err := base64.StdEncoding.DecodeString(ciperData) if err != nil { fmt.Printf("[Error] base64 decode ciperData=%s, err=%v", ciperData, err) return "", err } originTextBytes, err := rsa.DecryptPKCS1v15(rand.Reader, priRSA, ciperDateBytes) if err != nil { fmt.Printf("[Error] rsa.DecryptPKCS1v15 err=%v", err) return "", err } return string(originTextBytes), nil }

    Java

    import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.Base64; import javax.crypto.Cipher; public class Main { public static void main(String[] args) { try { String encryptedData = "P2ZOo6WypjxyJZiByMqHWJclfYnq3sTXLf3JsJFUb/4QMDPs30urlSH5EykqyWIV9pNq8HpKtZYAyiDQs49gNvmZFk9UVc5gZY4U3iaITDu39UH5UEmAsCFZ3TQSEDZz9ETbhIfqkqSFrSD2hCsZv70x1VfJFkMRHlfG/w/P6O8YJdlgBCrrSncgTwov5utWxD8RSuB0dkkiridSeuUJhuB4EowC9Oh2ikxu7bIyIBUROzIWQk7dHJneeY8tk5SakzMfiy+7Hce5VwkOOioaBflU5xxffd2wXoEXt+rha81gqC9/3RD+4OdB3M+PGj3Gg3hS6dMO1GoIFzIP+tPTug=="; String privateKeyString = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCLO43GjOLtruaRRDReiigSwLH5RMjskwc2fjaj0LehQyVWeETahTQKBlnBsB1ruS5WXTrHbMp52dDZDPa1ag+LEiN2wYYCxrxmtMTvNhz4WXaHhkdqeWXwyvn2qzBpURiX6oFeFomDr+DYwbLoXI7wUtYpAB14rJyl1rL7pqSuRiRXZGXEX7WXshzqqAp+H1BSVFLJlbb2qsS7P3il2ze8FHc5So8a/zYeZ73FFYPQBhXFIs2JsQHv5FwJFzVIer8fpSDTfgQQe9/b6OaeNaVu3nZYkq5lRT8DtmsF5X5RguOkLExyMBjqPCdu6elmpkcwmFG1TxR13xEM+HBlG6I5AgMBAAECggEAf27niVWDkcWl9Ek3oVvT564EdsBVIepEDMUiH3c1ytxY/Tag1lxaT96WIieeFe1sktFLriFNhI8ujqpF168WQNQ+L0Ba9omNAHftU3/0rf279biZ/sLT4br1Y6Y1bf8ygkC5XTNFc4jzQ5CtveyRSzaWGvqm/r8FtOe384oHahUSoMWf0JyWmogx8MohtqhIFuzmkrhIQEqLUq8AB8bRt0aKyzImecHQrSzvrjjoA3NVP6idB+ImeSi3tba+I/UkvMOmshQ79evUyCwNn9PFAknsEx1ZFDR5uVQ8g2mDhq0hLW0otVNPjJRTEADt3VX2T5wSgZxKpfzJaO+NY37PHQKBgQD8Hn6K7NClhshfYqo4tWJbZPsVnnsBG+e4X2kUt4ygLB9TxMKJkljSqURtoRBYY7f061teeTCMP7TwPrELFW2kHVzF92jwCKZJVK98jXmLWd1VvXDxmuRJ+mjZk91uZWSQ4xL3Fn4swZQPWn39qV8YxU+ZDoF1ScZmBGo/AjCSgwKBgQCNYDd76AkPH1J/ZBkspeqh9FkTGxZuCEM6H0iQ17sHM3aLYiQr+q2FxXYFVSu6l3pAO4BNb40G7359AEmhZNj5hgfCN0uxr24xAhwkTrT4kPCGFl6BxaFoG46PXlSzYZSVG93giBOaFoknSxjsjauuykJ+dMfBsIxLxF88gh6rkwKBgGmZdDNIQZQzQhYBw36BKrNRNoG1oZuzTnlBLUhKIRKtqGlzzm/E5oNF9q1cevYqvlBNjDWj2RvFS0odWBZmYUgOLF+W41M2rD+mwuIOd8xQVY6mDHqF//ykb+pCLssgmOC+26C2wR6J7jQIGSF4IabEbjSTiNHRltIAI2hEyId1AoGAUjBhkTMwMQ5wk4bJ6975LPY04pqYy5caHiwZr7r7DBCrFhUUGk09m8tT9X2yUmPFupnc2SfEwQdybZFBPQa37TgyQoKLCt2GHg+v9JudMfRxIELY5nDSiQecNVUNwMs16gmtT99MJgR779AEyWEDMjZ7ubCCgOP2bAXZp/+tfOkCgYEAkH9kglKVNfvAbPqNaMt1pqNZf8KUXWeRjXqhtsNTvb30E6AoO0LRoZlX0v4d1vlPB/LlAqEwMFlvlDLVEqF54xXi6D8XAbiwDRH04UpXi8dU2Wd60nh/f15uY1h/rFs2CbXj8oCCL3aLCn5YwvOMj5uikTDYGqvddPor3Br4VDg="; // Decrypt the data String decryptedData = decrypt(encryptedData, privateKeyString); System.out.println("Decrypted Data: " + decryptedData); } catch (Exception e) { e.printStackTrace(); } } public static String decrypt(String encryptedData, String privateKeyString) throws Exception { // Decode the private key byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyString); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PrivateKey privateKey = keyFactory.generatePrivate(keySpec); // Decrypt the data Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, privateKey); byte[] decryptedDataBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedData)); return new String(decryptedDataBytes); } }

    JavaScript

    const crypto = require('crypto'); // 声明私钥 const privateKey = ` -----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEAujNyq6x88ICGCQ5u0CoBiq+nxJfFbNzLNAoklfIox521AZwH cH5ca0dpjDO47BFJcpY26CnkXKxB4zAk8hvDD4mzUN0FulWVNp24/PJRssLi9Fl9 rM9nOTBVyjbzuadJAGRIV+c64rEKIG6R/gZfbrgzb6KNSxQNT9do7DacHFn6Sups mEeGrfGrgpBQMjNLAlQSuaVd/FN2l3wjk4YwWZAU6IVCqn3C0ddwwKYZweNs4UGp /yZ80VCRkQwma5Rq6ORPHNr7fbqHi0XBwE+mp8j1lEpp1Y1ZHtSOHQkE0rqRM8KE O70pdkNDfrTXEI+WblsRGikMUiDLAKUEnTYaGQIDAQABAoIBABaHDPOaPc93LUBB P8TtoBwgXmLZnegq2mbkZ0LA9pAYE4MrVncUwqe0DyAITfI5sTIs3F3AW8GekaYj +ARWuYXSuiApbXz6x7/A21W3F41SKNU5Uowq16lCoM6DUX9/rsReXaZM8oHku33r ArzCFp+1p3t1JjUUKvwi6q3ReZewUgfUZ+2AAiobMTYIarNv8UFEhsxla1BCczqy 4duKNIyfXsp9CTlhi+WSW+3/lz1JStFEDzy3G3OAUXium6N5Lch8V88eqMIU+h7X rm0f0EELR2AcvSzqtTYBMV7hh8N8Kn0CAXXDiI9r2aqb3RIOJggPiiXMkphWwUpp DmBdUQECgYEA8tdOg8WboACa2MPI21BwVTbkJwLlz4Llfa2bM83RVOUmKBdPcdRk JH+37SbpCH/AxHR2/QSH7uZUpil7e++t2H9MNmJBW6YhkYa2pIXb4NUkgQLXn/vC veIbfn0SvLuS4QkOIlkoUqXhJenZ+iRzME2cXsu4fbou0rPthV7A6TkCgYEAxEpt +To/r/rhQfcRC9OAnwixGutWBW2nEkk3m6b3uESZmVQrhpBWFQjbTwbJIokdx3+3 MM/s6I8SXA1i34944uGhpNZqfW7eVpe6PYVp8gcXQLQOTbAUu2+odCFm6JYbpWjn o2bkUXCTag2vtMryEYfI/TuHXvEDMMu4iX9dF+ECgYEA7Pql2Tv3Ae51LgHpufRG mzIE9fkC8T1o3PuVELnShUlVshwFYC0HSQMGJz0ofi3FnTGWiJVqXf2SL9EdezXL bhHT+uJpq5l0+sH+7JDgoQj/JZLzf2E9ivXjJM3DgkB+NnMSwvxEuFq+W7RZDp2R d1rVtUCTGsadOOtzaAqusSkCgYATfsTvZN6gbs1ijNRPlWEH6ogUgV0Yyuw1/7mb Jvkhfwa2WMq94aX7DtchQS5G1NF1V/TszynbayJKrDWuuIQsHHa+dWE8Nf+1H/qq U47TL+saTQfCpYNZnlxftFWRMh9qzUF8VCLHB+RMOzHBRgrGvPK0W+40+sDzXrhk R5cKYQKBgEcO7PDeS6J/ob9A0BrgMb2Es5llzDbhNVGBE2VUF3k6eqlkzNgR3vdO nAZsIvKG2KHSNEuVb3VvvblHoiO6/o8yS2sI9xdFlPihmLxPN2giqgWmFzPDB92s 3jsPqtNWrmIrXZpNu0KTwvYkDX34v1cchsbfXt0sH4/1ALLPb31F -----END RSA PRIVATE KEY-----`; // 需要解密的加密数据(这里假设是base64编码的字符串) const encryptedData = 'snPPxBDNiYjRB7uRbZl4VFbdLSeQKCcgsX4iwyexIxHIuuYfvjJtWjj2Do+ox7gkZjPaWqjS2voqF9YG7vy033I6MNVaTPZpQr5h3+xjB2S0mM8R74g3j0JaZ2aV586sooS0TfBaOYT7CxYIp5Y2z/USAh10pAyfo88yk75FZK0hDa1fjFI3cd5tEfHMngS3BK3Ybfp2CA8T1mnfKbWDW6AoZj0bJwdp+WdSRhKDo+s4M3gL0PS343eut/TZvAF/3kI4cKsDA0xTqbTkGm14bKhZHWaaejQktgShN+N9/0x3rkvMCh31SkL3+iaW5zgTEEMFHOoXyPAtd18qZU32JQ=='; // 将base64编码的加密数据转换为Buffer const buffer = Buffer.from(encryptedData, 'base64'); // 使用私钥解密数据 const decryptedData = crypto.privateDecrypt( { key: privateKey, padding: crypto.constants.RSA_PKCS1_PADDING, }, buffer ); // 将解密后的数据转换为字符串 const decryptedString = decryptedData.toString('utf8'); console.log('Decrypted data:', decryptedString);

    Python

    from cryptography.hazmat.primitives import serialization from cryptography.hazmat.primitives.asymmetric import rsa, padding from cryptography.hazmat.primitives import hashes import base64 def load_keys(private_key_str): private_key = serialization.load_pem_private_key( private_key_str.encode(), password=None, ) return private_key def decrypt(private_key, ciphertext_str): ciphertext = base64.b64decode(ciphertext_str.encode('utf-8')) plaintext = private_key.decrypt( ciphertext, padding.PKCS1v15() ) return plaintext.decode() if __name__ == "__main__": # 指定的私钥和公钥字符串 private_key_str = """-----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEAujNyq6x88ICGCQ5u0CoBiq+nxJfFbNzLNAoklfIox521AZwH cH5ca0dpjDO47BFJcpY26CnkXKxB4zAk8hvDD4mzUN0FulWVNp24/PJRssLi9Fl9 rM9nOTBVyjbzuadJAGRIV+c64rEKIG6R/gZfbrgzb6KNSxQNT9do7DacHFn6Sups mEeGrfGrgpBQMjNLAlQSuaVd/FN2l3wjk4YwWZAU6IVCqn3C0ddwwKYZweNs4UGp /yZ80VCRkQwma5Rq6ORPHNr7fbqHi0XBwE+mp8j1lEpp1Y1ZHtSOHQkE0rqRM8KE O70pdkNDfrTXEI+WblsRGikMUiDLAKUEnTYaGQIDAQABAoIBABaHDPOaPc93LUBB P8TtoBwgXmLZnegq2mbkZ0LA9pAYE4MrVncUwqe0DyAITfI5sTIs3F3AW8GekaYj +ARWuYXSuiApbXz6x7/A21W3F41SKNU5Uowq16lCoM6DUX9/rsReXaZM8oHku33r ArzCFp+1p3t1JjUUKvwi6q3ReZewUgfUZ+2AAiobMTYIarNv8UFEhsxla1BCczqy 4duKNIyfXsp9CTlhi+WSW+3/lz1JStFEDzy3G3OAUXium6N5Lch8V88eqMIU+h7X rm0f0EELR2AcvSzqtTYBMV7hh8N8Kn0CAXXDiI9r2aqb3RIOJggPiiXMkphWwUpp DmBdUQECgYEA8tdOg8WboACa2MPI21BwVTbkJwLlz4Llfa2bM83RVOUmKBdPcdRk JH+37SbpCH/AxHR2/QSH7uZUpil7e++t2H9MNmJBW6YhkYa2pIXb4NUkgQLXn/vC veIbfn0SvLuS4QkOIlkoUqXhJenZ+iRzME2cXsu4fbou0rPthV7A6TkCgYEAxEpt +To/r/rhQfcRC9OAnwixGutWBW2nEkk3m6b3uESZmVQrhpBWFQjbTwbJIokdx3+3 MM/s6I8SXA1i34944uGhpNZqfW7eVpe6PYVp8gcXQLQOTbAUu2+odCFm6JYbpWjn o2bkUXCTag2vtMryEYfI/TuHXvEDMMu4iX9dF+ECgYEA7Pql2Tv3Ae51LgHpufRG mzIE9fkC8T1o3PuVELnShUlVshwFYC0HSQMGJz0ofi3FnTGWiJVqXf2SL9EdezXL bhHT+uJpq5l0+sH+7JDgoQj/JZLzf2E9ivXjJM3DgkB+NnMSwvxEuFq+W7RZDp2R d1rVtUCTGsadOOtzaAqusSkCgYATfsTvZN6gbs1ijNRPlWEH6ogUgV0Yyuw1/7mb Jvkhfwa2WMq94aX7DtchQS5G1NF1V/TszynbayJKrDWuuIQsHHa+dWE8Nf+1H/qq U47TL+saTQfCpYNZnlxftFWRMh9qzUF8VCLHB+RMOzHBRgrGvPK0W+40+sDzXrhk R5cKYQKBgEcO7PDeS6J/ob9A0BrgMb2Es5llzDbhNVGBE2VUF3k6eqlkzNgR3vdO nAZsIvKG2KHSNEuVb3VvvblHoiO6/o8yS2sI9xdFlPihmLxPN2giqgWmFzPDB92s 3jsPqtNWrmIrXZpNu0KTwvYkDX34v1cchsbfXt0sH4/1ALLPb31F -----END RSA PRIVATE KEY----- """ # 加载密钥 private_key = load_keys(private_key_str) encrypted_msg = 'snPPxBDNiYjRB7uRbZl4VFbdLSeQKCcgsX4iwyexIxHIuuYfvjJtWjj2Do+ox7gkZjPaWqjS2voqF9YG7vy033I6MNVaTPZpQr5h3+xjB2S0mM8R74g3j0JaZ2aV586sooS0TfBaOYT7CxYIp5Y2z/USAh10pAyfo88yk75FZK0hDa1fjFI3cd5tEfHMngS3BK3Ybfp2CA8T1mnfKbWDW6AoZj0bJwdp+WdSRhKDo+s4M3gL0PS343eut/TZvAF/3kI4cKsDA0xTqbTkGm14bKhZHWaaejQktgShN+N9/0x3rkvMCh31SkL3+iaW5zgTEEMFHOoXyPAtd18qZU32JQ==' # 解密 decrypted_msg = decrypt(private_key, encrypted_msg) print("Decrypted message:", decrypted_msg)