You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 15:18:01