Java RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING迁移Go后无法互通求解
问题根因
互通问题核心是OAEP的MGF1摘要算法参数未对齐:Java侧显式指定了MGF1填充使用SHA1作为摘要算法,而Go标准库默认的EncryptOAEP/DecryptOAEP方法会使用和主哈希相同的算法作为MGF1的摘要,仅替换主哈希为SHA1无法匹配Java的配置。
对齐规则
Java侧的OAEP配置为:
- OAEP主摘要算法:SHA-256
- MGF1填充的摘要算法:SHA-1
- Label值:空(对应
PSource.PSpecified.DEFAULT)
Go侧适配代码(Go 1.18及以上版本)
Go 1.18及以上版本的标准库提供了支持自定义OAEP参数的方法,可以直接对齐Java配置:
import ( "crypto/rand" "crypto/rsa" "crypto" _ "crypto/sha256" _ "crypto/sha1" ) // 加密适配Java RSA OAEP逻辑 func encryptRSA(rsaPublicKey *rsa.PublicKey, secretMessage []byte) ([]byte, error) { oaepOpts := &rsa.OAEPOptions{ Hash: crypto.SHA256, // 对应Java的OAEP主哈希SHA-256 MGFHash: crypto.SHA1, // 对应Java的MGF1ParameterSpec.SHA1 Label: nil, // 对应Java的PSource.PSpecified.DEFAULT空标签 } return rsa.EncryptOAEPWithParams(rand.Reader, rsaPublicKey, secretMessage, oaepOpts) } // 解密适配Java RSA OAEP逻辑 func decryptRSA(rsaPrivateKey *rsa.PrivateKey, ciphertext []byte) ([]byte, error) { oaepOpts := &rsa.OAEPOptions{ Hash: crypto.SHA256, MGFHash: crypto.SHA1, Label: nil, } return rsa.DecryptOAEPWithParams(rand.Reader, rsaPrivateKey, ciphertext, oaepOpts) }
注意事项
- 无需纠结两边密文是否完全一致:OAEP填充会引入随机因子,同一份明文每次加密得到的密文都不相同,只要能互相解密成功即为符合预期
- 密钥解析要对齐:如果Java侧导出的是X.509格式公钥、PKCS8格式私钥,Go侧需要对应使用
x509.ParsePKIXPublicKey、x509.ParsePKCS8PrivateKey解析,避免密钥格式错误导致解密失败 - 若使用低于1.18版本的Go,可以引入
golang.org/x/crypto/rsa扩展包的对应方法实现自定义MGF1参数配置
内容的提问来源于stack exchange,提问作者hmmftg
相关产品推荐
相关产品推荐

