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 私钥加密结果不一样如何解决
这是特性…… random padding
https://en.wikipedia.org/wiki/Padding_(cryptography)
这个问题我遇到过,核心是Java和Python在RSA加密时默认使用的填充方式不同。Java的Cipher.getInstance("RSA")默认使用RSA/ECB/PKCS1Padding,而Python的PKCS1_v1_5或PKCS1_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)
关键检查点:
- 确认Java使用的具体算法字符串
- 确保Python使用相同的填充方案
- 密钥格式要正确转换(PEM/DER)
一句话建议:统一两端的RSA填充方案就能解决不一致问题。
为什么 java 里边不对 privatekey 的 b64 表示解码, python 不都先 decode 了么
encryptByPrivateKey 这个方法里面会对 primarykey 进行 base64 解码
老哥稳,读了后面那篇已经明白为什么了,下一步就看怎么解决了,灰常感谢!!
服务器只接受 Java 加密出来的密文, python 加密的密文不接受。
好奇怪……
您好 遇到同样的问题 … 请问怎么解决的呢?


