python实现的jsencryp加密后端无法解密_JSEncrypt到PyCrypto RSA加密不可能

我正在尝试使用RSA(公钥)对Javascript中的字符串进行加密,并且想用我的私钥在Python(2.7)中对该字符串进行解密。

我正在使用的库是JSEncrypt和PyCrypto。这里的问题是PyCrypto在解密加密的字符串时遇到问题

这部分加密字符串:

var encrypted = new JSEncrypt();

encrypted.setPublicKey(key); // key == '-----BEGIN PUBLIC'.....

encrypted = encrypted.encrypt('test');

所产生的加密的字符串如下所示:HJuyZtuUbR4EvjZp0pirbEw0OX8KD7UDNyvSMx3plfzYPjV7r8RBOkouCkvPBG2XOF6E5lPr0ukWClF0u5HB8M6qF8b9xTMnM / j5e41iaPa / oIZyL0JC4h + FZ7cv / P6ygmaSafQ1xc96JltTbuW3u / YYdwmv / 01CnFyaIEWW3gk =

此部分应将其解密:

private_rsa_key = open('rsa_1024_priv.pem', 'r').read()

rsa_key = RSA.importKey(private_rsa_key)

decrypted = rsa_key.decrypt(b64decode(encrypted_string))

现在的结果应该是“测试”,但实际上是:dfc6b9d73a6a48cc6fec2ded03969868.png

正确的字符串总是放在末尾,但是我需要先删除掉它之前的部分。

为了进行测试,我尝试使用以下代码在Python中加密字符串:

public_rsa_key = open('rsa_1024_pub.pem', 'r').read()

rsa_key = RSA.importKey(public_rsa_key)

encrypted = rsa_key.encrypt('test', 'x')

解密时完美显示为“测试”,但加密后看起来却大不相同:

('\x0bY\x1ckk\x7f\xd6\xda$\x05g\xa0\x0bxI\x0cO9\x8b?>M#X\xd2_[\xb7\xf1\xd0f\xb4\x92C\x01z\xa4\x02q\xb9\xb1\x80\x82\xe8\xe4\\E\x85\xa7r\xff\x1aIL,\xd8\xce\xaf\xef\xb4)\x84\x92]\xabA\xc9+\xd6\xef}\x08\xce\xe8\x97\xf8}\x84(\xb3\x9c\xfe7g\xe0\x869\x8b\xe8\xf8\xdf\x85}\xb0\x87\x1a2\xab\xda\xca\xfd\x81\xc0\x98\x12y\x92\x13\xd6\xa5a\xf3\x9aU\xb5\xa4d\xb8\xfc\xa3\xd1\xe2

我想知道为什么这个加密的文本现在是一个带十六进制的元组。在我看来,JS加密的字符串看起来是正确的。如何获得PyCrypto正确解密字符串?

提前致谢

解决方案

您发布的python代码仅进行低级解密,jsencrypt返回的加密数据还包含pkcs1 padding。

您需要使用适当的密码(在本例中为PKCS1_v1_5)来代替使用原始RSA密钥在python代码中进行加密/解密:

...

from Crypto.Cipher import PKCS1_v1_5

private_rsa_key = open('rsa_1024_priv.pem', 'r').read()

rsa_key = RSA.importKey(private_rsa_key)

cipher = PKCS1_v1_5.new(rsa_key)

decrypted = cipher.decrypt(encrypted, "ERROR")

使用公钥加密时也是如此。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值