使用RSA私钥解密API加密内容时遇decryption error问题排查
RSA解密报错排查问题
问题背景
调用一个需提供公钥的API,API返回的向量与token为加密状态(推测用我的公钥加密),需用DER编码的私钥解密,目标是实现标准RSA加解密功能。
测试密钥
- 公钥:
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCbI1SofN/ZPsprBlPAW/c4GDKHo6Idv3J/P5LEEUpAsbVVpq6wY7Tf6lfBSTcirq48oMD34p3z5sX1jYy15OXNxNKBpoOdv8BYQdnK/LfFcZ5720yUNka0xiHUol/Zi0c0PWB6HkAAkT0sbeGLbCuX6yr6SbJBFaI2ofIKk/mGswIDAQAB - 私钥:
MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAJsjVKh839k+ymsGU8Bb9zgYMoejoh2/cn8/ksQRSkCxtVWmrrBjtN/qV8FJNyKurjygwPfinfPmxfWNjLXk5c3E0oGmg52/wFhB2cr8t8VxnnvbTJQ2RrTGIdSiX9mLRzQ9YHoeQACRPSxt4YtsK5frKvpJskEVojah8gqT+YazAgMBAAECgYA5KaeD/Z8tmSlUjhxGAJzzGldkCzMs6uHxaSdW/1fwxooeaTBs5hA7gUmcerHKIbsps8HmlKXGvP2sIN/8Fb9mo1yHaAN2g52+cvpr2QmeeUOwfuZTM/gllT4rUIB7sMC5Uxl7sW55bGhRxqdfHJskow4rPga+irjuYSy5GIZSwQJBANDtfF+VWPKrR8MHYvaGoLLkrA1cFn8g9x1eGA3mgWPNYoH5nMJfe0IBaXo69jlrnBAjK+oxnPSyh/AZzsEehasCQQC+F15dVSjH8tJSXz8RCDpMdp+P9J/eoi7+V0IgwKAaSJCZfYWXeckAAIpvwit7fkj3n83nj0PPm9Xwh22CYGsZAkAAvIWOtLEOken71v/TTKAuYT32AhgWNKCKWvWMvv4/ws6RFLcnvDxr/CNKCgEqLKXtLKKP/cLG3gY6o2ymI5xnAkA8l4JSycRYB8SW0RlvOmoq2Vz/LACRnKzSEcpYWk4uUpcU9ffRUtaJE6MNAJ2Pna9wjxW5C+eXk5rcMq7rcgRxAkAjizE3JbwUu3MX5TDmHfGCvIZ38jnfSUjFrYBLKaNJegOD4zcxRZXfO7iKDa+PtFMRe7ZtnU7WuCM0yUT2Qa0j - 加密消息:
BUy5nR/PuJNCFXeUxQd4oxkCvMo2JiLwH5VkzLz1UdM4M0VXDv4Ba1OaNHbttqETQENy1VfW2V4v9Pw5HmDIcS1sdGN69ceEHJbned46rK1EVtMVQZGP9ha54AXie5v/1TdKYWJ+AFt0FxVj4kfFXGXEzF19Q8LB2AOJCAEJK6s=
代码实现
从环境变量获取公私钥:
public := goDotEnvVariable("publicKey") private := goDotEnvVariable("privateKey")
调用API获取结果后,使用rsa.DecryptOAEP解密时持续报错crypto/rsa: decryption error,调试发现报错出自以下代码段:
k := priv.Size() // private key size if len(ciphertext) > k || //ciphertext is the encrypted text and hash.Size()*2+2 is the hash size that Im using k < hash.Size()*2+2 { return nil, ErrDecryption }
参数结果:
k=128(私钥长度)hash.Size()*2+2=66- 密文长度=172
私钥转换步骤
sEnc, err := b64.StdEncoding.DecodeString(private) // 使用 encoding/base64 包
block := &pem.Block{ Type: "RSA PRIVATE KEY", Bytes: sEnc, } parseResult, err := x509.ParsePKCS8PrivateKey(block.Bytes)
疑问
请问我哪里操作有误?
问题分析与解决
核心问题:密文长度超过私钥允许的最大长度
你的1024位RSA私钥对应的最大加密长度是128字节,但当前密文长度是172字节,直接触发了len(ciphertext) > k的判断,导致解密失败。
具体错误点及修复方案
密文未做Base64解码
你拿到的加密消息是Base64格式,必须先解码为原始字节再解密。当前你可能直接将Base64字符串的长度当作密文长度,解码后实际字节长度会降至129左右(接近128字节上限)。修复代码:ciphertext, err := b64.StdEncoding.DecodeString(encryptedMsg) if err != nil { // 处理解码错误 }私钥解析格式不匹配
你的私钥是PKCS#1格式,而非PKCS#8,应该使用x509.ParsePKCS1PrivateKey解析:priv, err := x509.ParsePKCS1PrivateKey(block.Bytes) if err != nil { // 处理解析错误 }加密算法不匹配
API可能使用RSA PKCS#1 v1.5加密,而非OAEP。如果解密算法不匹配也会报错,可尝试切换解密函数:plaintext, err := rsa.DecryptPKCS1v15(rand.Reader, priv, ciphertext)
验证步骤
- 对加密消息做Base64解码,确认解码后的字节长度≤128;
- 修正私钥解析方法,使用PKCS#1对应的解析函数;
- 尝试切换解密算法,匹配API实际使用的加密方式。
内容的提问来源于stack exchange,提问作者Tghosh
相关产品推荐
相关产品推荐

