Mar*_*arc 2 python rsa pycrypto
我试图理解pyCrypto加密和解密公钥和私钥的方法,我看到一些奇怪的东西.假设我有一组私钥和公钥,存储在文件dummy_private.txt和dummy_public.txt中.
我创建一个私钥对象和公钥对象,如下所示:
private_key_file='dummy_private.txt'
f = open(private_key_file, 'r')
privateKey = RSA.importKey(f.read(),None)
f.close()
public_key_file='dummy_public.txt'
f = open(public_key_file, 'r')
publicKey = RSA.importKey(f.read(),None)
f.close()
Run Code Online (Sandbox Code Playgroud)
现在假设我要加密一些消息.我可以这样做:
s='This is a super secret message'
sutf8=s.encode('utf8')
enc=publicKey.encrypt(sutf8,None)[0]
encb64=base64.encodestring(enc)
print "Public key Encoded message is %s" % (encb64,)
Run Code Online (Sandbox Code Playgroud)
这是有道理的,因为我使用公钥加密,我应该能够使用私钥解密.
但是,我也可以使用私钥加密上面的内容,它给了我相同的结果!
enc2=privateKey.encrypt(sutf8,None)[0]
encb642=base64.encodestring(enc2)
print "Private key Encoded message is %s" % (encb642,)
Run Code Online (Sandbox Code Playgroud)
当我打印出加密数据的base64编码版本时,使用私钥或公钥,它们是相同的!这是为什么?
这引发了使用私钥对数据进行数字签名的问题.如果我可以使用公钥签名并获得相同的结果,那么签名如何验证我是谁,我说的是我?这必须是我不理解的加密方法的一些问题.有人可以解释一下吗?
由于使用公钥和私钥进行加密会产生相同的结果,因此无论使用私钥还是公钥进行加密,都可以完成使用私钥进行解密.我完全不知道为什么可以使用私钥加密并得到与使用公钥完成相同的结果.
使用私钥加密时,pycrypto实际上使用公钥(可以从私钥生成).
来源: PyCrypto:仅使用文件中的公钥解密(无私有+公钥)
您会发现pycrypto不允许您使用公钥解密,原因很简单:
>>> publicKey.decrypt(enc2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/site-packages/pycrypto-2.6-py2.7-linux-x86_64.egg/Crypto/PublicKey/RSA.py", line 174, in decrypt
return pubkey.pubkey.decrypt(self, ciphertext)
File "/usr/local/lib/python2.7/site-packages/pycrypto-2.6-py2.7-linux-x86_64.egg/Crypto/PublicKey/pubkey.py", line 93, in decrypt
plaintext=self._decrypt(ciphertext)
File "/usr/local/lib/python2.7/site-packages/pycrypto-2.6-py2.7-linux-x86_64.egg/Crypto/PublicKey/RSA.py", line 239, in _decrypt
mp = self.key._decrypt(cp)
File "/usr/local/lib/python2.7/site-packages/pycrypto-2.6-py2.7-linux-x86_64.egg/Crypto/PublicKey/_slowmath.py", line 52, in _decrypt
raise TypeError("No private key")
TypeError: No private key
Run Code Online (Sandbox Code Playgroud)
在数学上,RSA可以使用私钥加密并使用公钥解密,但您不应该这样做.公钥是PUBLIC - 这是你很容易分享的东西,因此很容易传播.与使用对称密码和共享密钥相比,在这种情况下没有附加值(请参阅:https://crypto.stackexchange.com/questions/2123/rsa-encryption-with-private-key-and-decryption-with-公钥()
从概念上讲,使用私钥"加密"对于签名消息更有用,而使用公钥的"解密"用于验证消息.
更多背景:在PKCS#1 OAEP加密/解密中交换公钥/私钥
| 归档时间: |
|
| 查看次数: |
6911 次 |
| 最近记录: |