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

Go与Python跨语言RSA-OAEP加解密兼容问题求助

问题根因
  • 核心原因是Go标准库RSA加密的OAEP填充参数和Python侧不匹配:Go 1.18及更早版本的rsa.EncryptOAEP函数,默认将SHA1作为MGF1掩码生成函数的哈希算法,与你传入的OAEP哈希(SHA256)无关;而你提供的Python代码显式指定MGF1使用SHA256,两边填充规则不一致导致解密失败。
解决方案(仅修改Go侧代码)
  • 方案1:升级Go版本到1.19及以上,使用新增的EncryptOAEPWithMGFHash函数,显式指定MGF1的哈希算法为SHA256,和Python侧对齐。修改后的加密逻辑如下:
func encryptString(s string) string {
    publicKey, _ := os.ReadFile("public.pem")
    block, _ := pem.Decode([]byte(publicKey))
    if block.Type != "PUBLIC KEY" {
        log.Fatal("error decoding public key from pem")
    }
    parsedKey, err := x509.ParsePKIXPublicKey(block.Bytes)
    if err != nil {
        log.Fatal("error parsing key")
    }
    var ok bool
    var pubkey *rsa.PublicKey
    if pubkey, ok = parsedKey.(*rsa.PublicKey); !ok {
        log.Fatal("unable to parse public key")
    }
    rng := rand.Reader
    // 替换原有EncryptOAEP调用,显式指定MGF1哈希为SHA256
    ciphertext, err := rsa.EncryptOAEPWithMGFHash(
        sha256.New(),
        sha256.New(),
        rng,
        pubkey,
        []byte(s),
        nil,
    )
    if err != nil {
        log.Fatal(err)
    }
    return base64.StdEncoding.EncodeToString(ciphertext)
}

如果Go侧也需要解密Python生成的密文,对应的解密逻辑也要替换为rsa.DecryptOAEPWithMGFHash,同样指定两个哈希参数都为SHA256即可。

  • 方案2:如果无法升级Go版本,可自行实现符合MGF1-SHA256规则的OAEP填充逻辑,再调用RSA原始加密接口完成加密,确保填充规则和Python侧一致。
可选排查项
  • 确认Go侧使用的公钥和Python侧使用的私钥为配对的RSA密钥对,避免密钥不匹配导致解密失败
  • 确认密文传输过程中没有被篡改、编码转换,比如base64密文中的+、/、=等特殊字符没有被修改或删除

内容的提问来源于stack exchange,提问作者Darren

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 00:48:03