Python 调用 Java 生成的 RSA 私钥加密结果不一样如何解决

Java 代码

public static String encrypt(String paramString)throws Exception
{
    return Base64Utils.encode(RSAUtils.encryptByPrivateKey(paramString.getBytes(), "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIrrUGxh+yvNNI1c9hUg1rH+EtipI0nPk3zRm2Cj4mLDWLJ6DaTzdJTXTF3BYZaancWeG3QtBL+fITUi72InwBP7zaNG8uv/guwuhWT6V/YO7AaTrOFeTkg9NXuaFbn3hWVtZxQm2tIlaVa8snoNj3VGnPqIjXmGcxk4axuYd7sTAgMBAAECgYA43YhnRVh2nqJzd2k4Tt/zrmhyjhHm5fSetIKg9ZT3DrXhITsymYHQZ61X95AGATayLT1Zug/mjLIgOTO6f0ENkRQtjVCmKd8Yf/BeDEc5kRLUYDfSqoEydHK0+rCw5tJMgrAnQc5lHc+FVdGe2bOxKTEtZoss9VQ2jYuQ+Z5fUQJBANnvDOcI2OYSksX3PpHzO9F272xkmqYBRGkMc/a5RuOv1CY6FqMIkkloTf6nVl9y6XYV8gnHfbbI/wj4Q4UnPYsCQQCjLxyRYaOeEb/qOzSmFXytgMuCM9sr4eY9jpjzDgNWhpbtaVaf1QvSTXqN0zaUu4Se2tmWGX7zXw9p/dFf8DmZAkEAzl1o0FU2XhZ0WXVYEIhMunpvGSrirhNBHmAmZxjmoa/bqh8TVGpHa6+TO3JlfZioraL2QIBg8Ha/2VSNS0bvJQJALfCLaFpGh6+TicuVLNSLvwStRkB3CUmVWesVIAfn5KoLP1cSbfi6VUA+qkK18PVBhr8x1lHjLXyriDlOgmXMsQJAW9vD/IoBs4QJF87xF7tZvu/b1KRVgLM1edqOgVwMNbIQHBAXghjVjrpuln5w6z1dJ2cEjRP98OxKC0hqEIwIuQ==");
}
encrypt('159742081') --> GBn6RGIeEp8j/n35CgT5DdMmrvvNBtVCFQikO0vfJaYYrpEzBZ/F+5PkFLpzLDtYvQrj0Q/x/Fdxz3BtbEdLq57WFxB5MvkFxerWVeplA2vdlD7m+dgjsWyxBSbcVV1QX3UBNp+T3DtxL6uGuWUNxucy9yB5TOD3xCNchzGCnSU=

Python 代码

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5, PKCS1_OAEP
from base64 import b64decode, b64encode

key = ‘MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIrrUGxh+yvNNI1c9hUg1rH+EtipI0nPk3zRm2Cj4mLDWLJ6DaTzdJTXTF3BYZaancWeG3QtBL+fITUi72InwBP7zaNG8uv/guwuhWT6V/YO7AaTrOFeTkg9NXuaFbn3hWVtZxQm2tIlaVa8snoNj3VGnPqIjXmGcxk4axuYd7sTAgMBAAECgYA43YhnRVh2nqJzd2k4Tt/zrmhyjhHm5fSetIKg9ZT3DrXhITsymYHQZ61X95AGATayLT1Zug/mjLIgOTO6f0ENkRQtjVCmKd8Yf/BeDEc5kRLUYDfSqoEydHK0+rCw5tJMgrAnQc5lHc+FVdGe2bOxKTEtZoss9VQ2jYuQ+Z5fUQJBANnvDOcI2OYSksX3PpHzO9F272xkmqYBRGkMc/a5RuOv1CY6FqMIkkloTf6nVl9y6XYV8gnHfbbI/wj4Q4UnPYsCQQCjLxyRYaOeEb/qOzSmFXytgMuCM9sr4eY9jpjzDgNWhpbtaVaf1QvSTXqN0zaUu4Se2tmWGX7zXw9p/dFf8DmZAkEAzl1o0FU2XhZ0WXVYEIhMunpvGSrirhNBHmAmZxjmoa/bqh8TVGpHa6+TO3JlfZioraL2QIBg8Ha/2VSNS0bvJQJALfCLaFpGh6+TicuVLNSLvwStRkB3CUmVWesVIAfn5KoLP1cSbfi6VUA+qkK18PVBhr8x1lHjLXyriDlOgmXMsQJAW9vD/IoBs4QJF87xF7tZvu/b1KRVgLM1edqOgVwMNbIQHBAXghjVjrpuln5w6z1dJ2cEjRP98OxKC0hqEIwIuQ==’

rsakey = RSA.importKey(b64decode(key)) cipher = PKCS1_OAEP.new(rsakey) b = cipher.encrypt(b’159742081’) print(b64encode(b))

cipher = PKCS1_v1_5.new(rsakey) b = cipher.encrypt(b’159742081’) print(b64encode(b))

输出: b'ZkSAKcf9aGbRaOUaywZEQKIS4jdYpn+dlSxwpRFlmwjcNmVM7Cp0GQzz9yY2g7UdPVJCubRuPbKmyale2cuAqsVu+Y1n79EMoxSbShys0/o1o8V4UCuV+jP3e3EnyT86yoTyTDMXQzgDS+SRSkEF9U6db19T12/xEtfcKRcHing='

b'YQz8gjcslQ8QsYs9eU+Yu2owf55gHVedIksovrMczCRSaQ8vhml1ua6bAmf6xvg7zlw5BGZ7KlTygIgqKDvf6JgdZh5k2OoiK8uGYCFFCJFY0+3ZjhytG4KfwujqbCQWu3rZSaFZeF76MdFBQUWzJ2Q3V1BFTljF3Euu7X5KPpk='

各位老爷给看看,是哪里姿势不对


Python 调用 Java 生成的 RSA 私钥加密结果不一样如何解决

11 回复

这个问题我遇到过,核心是Java和Python在RSA加密时默认使用的填充方式不同。Java的Cipher.getInstance("RSA")默认使用RSA/ECB/PKCS1Padding,而Python的PKCS1_v1_5PKCS1_OAEP需要明确指定。

假设你Java端是这样生成密钥和加密的:

// Java代码示例
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(2048);
KeyPair pair = keyGen.generateKeyPair();

// 加密
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, pair.getPublic());
byte[] encrypted = cipher.doFinal(plainText.getBytes());

那么在Python端,你需要使用对应的填充方式。如果Java用了默认的PKCS1_v1_5,Python应该这样:

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import base64

# 加载Java生成的PEM格式私钥
with open('private_key.pem', 'r') as f:
    private_key = RSA.import_key(f.read())

# 创建cipher对象 - 对应Java的PKCS1Padding
cipher = PKCS1_v1_5.new(private_key)

# 加密数据
plaintext = b"Hello World"
encrypted = cipher.encrypt(plaintext)

# 如果需要base64输出
encrypted_b64 = base64.b64encode(encrypted).decode()

如果Java用了OAEP填充(RSA/ECB/OAEPWithSHA-256AndMGF1Padding),Python就要用PKCS1_OAEP并指定对应的hash算法:

from Crypto.Cipher import PKCS1_OAEP
from Crypto.Hash import SHA256

cipher = PKCS1_OAEP.new(private_key, hashAlgo=SHA256)

关键检查点:

  1. 确认Java使用的具体算法字符串
  2. 确保Python使用相同的填充方案
  3. 密钥格式要正确转换(PEM/DER)

一句话建议:统一两端的RSA填充方案就能解决不一致问题。

为什么 java 里边不对 privatekey 的 b64 表示解码, python 不都先 decode 了么

encryptByPrivateKey 这个方法里面会对 primarykey 进行 base64 解码

英文实在太弱了,老哥能再提示多一点吗?

老哥稳,读了后面那篇已经明白为什么了,下一步就看怎么解决了,灰常感谢!!

不需要关注是否一致,只需要关注能否互操作

服务器只接受 Java 加密出来的密文, python 加密的密文不接受。

好奇怪……

您好 遇到同样的问题 … 请问怎么解决的呢?

回到顶部