我对RSA只有一些非常基本的理论知识.
在阅读关于如何在实践中使用它的不同来源时,似乎PKCS#1 OAEP将是一件好事.
对于测试实现,我使用Python和PyCrypto.例如,这是使用PKCS#1 OAEP的示例.
使用公钥加密然后使用私钥解密工作正常.例如,公众可以使用私钥向人X发送一些数据.
根据我对RSA如何工作的基本理解,我认为我可以交换公钥/私钥,即我可以使用公钥进行加密,使用私钥进行解密.例如,人X可以使用自己的私钥加密某些数据,公众可以使用公钥对其进行解密.如果解密工作正常,则可以提供某种证据证明数据来自人X.
当我尝试使用公钥解密时,PyCrypto会抱怨.
通过阅读PyCrypto源代码,在_RSAKey._decrypt函数(这里)中,似乎关键对象本身知道它是私钥还是公钥并且它们之间有所不同(令我惊讶的是,再次基于我非常基本的RSA理解).
从那里,看起来我可以破解解密功能,以便它使用公钥.或者有些不同:我可以在关键对象中交换公共指数e和私有指数d.
但所有这些似乎并不打算以这种方式使用/攻击.所以我想问一下我的误解.
另外,出于好奇,我生成了一些键(RSA.generate(2048))并查看n,e并且d.在所有情况下,n并且d非常巨大,而e在所有情况下都是恒定的(65537)(我不会预期).
我想从这一切我不应该只是交换e和d.
所以我想我应该使用其他方法进行签名,如PKCS1_PSS.
加密/解密的一些代码,如果有人有兴趣:
def randomString(l):
import random
return ''.join(chr(random.randint(0, 0xFF)) for i in range(l))
def genkeypair():
from Crypto.PublicKey import RSA
key = RSA.generate(2048)
pubkey = key.publickey().exportKey("DER")
privkey = key.exportKey("DER")
return (pubkey,privkey)
def encrypt(v, rsapubkey):
from Crypto.PublicKey import RSA …Run Code Online (Sandbox Code Playgroud) 我想将ascii字符串(确切地说是文本)转换为base64.所以我知道如何做到这一点,我只使用以下代码:
import base64
string = base64.b64encode(bytes("string", 'utf-8'))
print (string)
Run Code Online (Sandbox Code Playgroud)
哪能给我
b'c3RyaW5n'
Run Code Online (Sandbox Code Playgroud)
但问题是,我希望它只是打印
c3RyaW5n
Run Code Online (Sandbox Code Playgroud)
是否可以打印不带"b"和"引号"的字符串?谢谢!
我试图理解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编码版本时,使用私钥或公钥,它们是相同的!这是为什么?
这引发了使用私钥对数据进行数字签名的问题.如果我可以使用公钥签名并获得相同的结果,那么签名如何验证我是谁,我说的是我?这必须是我不理解的加密方法的一些问题.有人可以解释一下吗?
由于使用公钥和私钥进行加密会产生相同的结果,因此无论使用私钥还是公钥进行加密,都可以完成使用私钥进行解密.我完全不知道为什么可以使用私钥加密并得到与使用公钥完成相同的结果.