使用node-forge进行加密,使用python和RSA-OAEP进行解密

Encrypting using node-forge and decrypting using python with RSA-OAEP

本文关键字:使用 RSA-OAEP 解密 加密 node-forge python      更新时间:2023-09-26

我在Javascript中有以下代码要加密:

var rsa = forge.pki.rsa;
var keypair = rsa.generateKeyPair({bits: 2048, e: 0x10001});
var ciphertext = keypair.publicKey.encrypt("zz xx yy", 'RSA-OAEP', {
  md: forge.md.sha256.create(),
  mgf1: {
    md: forge.md.sha1.create()
  }
});
keypair.privateKey.decrypt(ciphertext, 'RSA-OAEP', {
  md: forge.md.sha256.create(),
  mgf1: {
    md: forge.md.sha1.create()
  }
});
"zz xx yy"

我使用

forge.pki.privateKeyToPem(keypair.privateKey) // stored in pv.key
forge.pki.publicKeyToPem(keypair.publicKey) // stored in pb.key

我使用

ciphertext_base64 = forge.util.encode64(ciphertext)

我正在尝试使用加密库在python中解密它,如下所示,但出现错误:

>>> key = RSA.importKey(open('pv.key').read())
>>> cipher = PKCS1_OAEP.new(key)
>>> import base64
>>> ciphertext = base64.b64decode(ciphertext_base64)
>>> cipher.decrypt(ciphertext)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/dist-packages/Crypto/Cipher/PKCS1_OAEP.py", line 227, in decrypt
    raise ValueError("Incorrect decryption.")
ValueError: Incorrect decryption.
>>> 

如果我使用 python 中的 pv.key 和 pb.key 中存在的密钥加密和解密一些文本字符串,它可以正常工作。

如何在伪造中获得加密,在python中解密工作?

pyCrypto默认使用SHA1进行哈希处理,MGF1。如果您传入 SHA-256 进行哈希处理,它也会将该哈希用于 MGF1(代码参考)。因此,您需要专门将哈希设置为SHA-256,将MGF1设置为SHA-1:

cipher = PKCS1_OAEP.new(key, Crypto.Hash.SHA256, '
        lambda x,y: Crypto.Signature.PKCS1_PSS.MGF1(x,y, Crypto.Hash.SHA1))