【问题标题】:How to encrypt data with RSA private key (not normal signing) in Python?如何在 Python 中使用 RSA 私钥(非正常签名​​)加密数据?
【发布时间】:2019-04-17 05:32:06
【问题描述】:

我想用私钥进行 RSA 加密(不是普通签名),但 PyCryptodome 似乎无法做到。

我需要使用私钥的原因是,我需要获得与不是我编写的 Java 程序相同的结果,该程序错误地使用 javax.crypto.Cipher 和私钥来签署消息...

import java.security.KeyFactory;
import java.security.MessageDigest;
import java.security.PrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;
import javax.crypto.Cipher;

...

String deviceKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASC...";
PKCS8EncodedKeySpec localPKCS8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decode(deviceKey).getBytes("UTF-8"));
PrivateKey localPrivateKey = KeyFactory.getInstance("RSA").generatePrivate(localPKCS8EncodedKeySpec);

byte[] hash = MessageDigest.getInstance("SHA-256").digest("test".getBytes());
Cipher localCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
localCipher.init(Cipher.ENCRYPT_MODE, localPrivateKey);
String sign = new String(Base64.encode(localCipher.doFinal(hash)));
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
from Crypto.Hash import SHA256

...

deviceKey = 'MIIEvgIBADANBgkqhkiG9w0BAQEFAASC...'
privateKey = RSA.importKey(deviceKey)
hash = SHA256.new('test'.encode()).digest()
signer = PKCS1_v1_5.new(privateKey)
sign = b64encode(signer.encrypt(hash))

Java 程序的结果:

  • 哈希:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08

  • 符号:k8y6zMfl0KVuQWWOmRxieXF1aH0dpVUX......(总是一样)

我的 Python 脚本的结果:

  • 哈希:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08

  • 符号:GfLVqZDnu5aLHHbi0tM5OtCBEVKKRcjW……(每次都变)

【问题讨论】:

    标签: python rsa pycrypto pycryptodome


    【解决方案1】:

    您不使用私钥来加密数据。

    • 私钥可以签署数据,可以通过匹配的公钥验证
    • 公钥可以加密数据,可以通过匹配的私钥解密

    如果您真正想要的是签署您的哈希,而不是使用encrypt 函数,您应该使用sign 函数。

    所以,而不是

    from Crypto.Cipher import PKCS1_v1_5
    PKCS1_v1_5.new(privateKey).encrypt(hash)
    

    你可以试试

    from Crypto.Signature import pkcs1_15
    pkcs1_15.new(privateKey).sign(hash)
    

    我写了一点 blog post 关于使用 pycryptodome 进行签名/验证的文章,如果你想看看的话。

    【讨论】:

    • 是的,我知道这一点,但谁编写了 Java 程序却不知道。我想得到与它相同的结果......
    猜你喜欢
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 2012-07-15
    • 2020-03-06
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多