如何使用Python中的RSA私钥(不是普通签名)加密数据?

问题描述 投票:1回答:1

我想用私钥(不是普通签名)进行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个回答
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)

如果你想看一下,我写了一些关于使用pycryptodome进行签名/验证的blog post

© www.soinside.com 2019 - 2024. All rights reserved.