获取手机号(getPhoneNumber组件code换取手机号)
数据解密
解密后的数据格式如下:
{ "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)