这是你想要的吗?它使用PyCrypto,而不是PyOpenSSL (当你提到no wrappers时,我不确定这是否是你想要避免的)
#!/usr/bin/env python
from Crypto.Cipher import AES
from Crypto.Cipher import PKCS1_OAEP
from Crypto.PublicKey import RSA
def step1():
rsaKey = RSA.importKey(open("./myKey.der", 'r'))
print "Step 1: This is my rsa-key:\n%s" % rsaKey.exportKey()
def step2_encrypt(string):
rsaKey = RSA.importKey(open("./myKey.der", 'r'))
pkcs1CipherTmp = PKCS1_OAEP.new(rsaKey)
encryptedString = pkcs1CipherTmp.encrypt(string)
print "Step 2: encrypted %s is %s" % (string, encryptedString)
return encryptedString
def step3_decrypt(encryptedString):
rsaKey = RSA.importKey(open("./myKey.der", 'r'))
pkcs1CipherTmp = PKCS1_OAEP.new(rsaKey)
decryptedString = pkcs1CipherTmp.decrypt(encryptedString)
print "Step 3: decryptedString %s is %s" % (encryptedString, decryptedString)
return decryptedString
if __name__ == "__main__":
step1()
encryptedString = step2_encrypt("hello, duuude")
decryptedString = step3_decrypt(encryptedString)
print "Tadaaaa: %s" % decryptedString
密钥文件包含公共/私有部分,因此加密/解密模块将知道该做什么。
您是否需要两个单独文件中的公钥/私钥(应该是直截了当的,对吧)?
请注意,使用非对称加密时,可以加密的最大字符数取决于密钥中使用的模数。在上面的示例中,如果您使用常规 RSA 密钥(SHA-1,模数为 20 字节),您将收到大于 214 字节的字符串的错误。正如cyroxx在评论中指出的那样,该算法没有理论上的限制(您可以使用非常长的密钥加密长字符串),但是它所花费的计算时间使得它在实际用途中非常不可行。
如果您需要对大块数据进行加密,您可能需要使用对称算法(如 AES)加密该数据,并在传输的数据中发送使用 RSA(非对称)密钥加密的密码......但这是一个与许多其他问题不同的问题:-)