簡體   English   中英

如何在Python中使用RSA私鑰(非常規簽名)加密數據?

[英]How to encrypt data with RSA private key (not normal signing) in Python?

我想使用私鑰(不是正常簽名)進行RSA加密,但是PyCryptodome似乎無法做到這一點。

我需要使用私鑰執行此操作的原因是,我需要從不是由我編寫的Java程序中獲得相同的結果,該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 ......(每次都會改變)

您不使用私鑰來加密數據。

  • 私鑰可以對數據簽名 ,可以通過匹配的公鑰進行驗證
  • 公共密鑰可以數據進行加密 ,該數據可以由匹配的私有密鑰解密

如果您真正想要的是對哈希簽名,而不是使用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進行簽名/驗證的小博文

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM