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
相关产品推荐
相关产品推荐

