如何将公钥作为字符串打印并加密?

时间:2012-08-02 12:27:12

标签: python django openssl

所以我已经使用OpenSSL生成了自签名证书和私钥。

现在我正在尝试:

a)将公钥作为字符串打印。这样:

f = open(CERT_FILE)
cert_buffer = f.read()
f.close()
cert = crypto.load_certificate(crypto.FILETYPE_PEM, cert_buffer)
pub_key = cert.get_pubkey()
print pub_key

打印类似:

<OpenSSL.crypto.PKey object at 0x7f059864d058>

b)使用此公钥加密字符串

c)使用私钥解密加密的字符串

我想看一些代码示例。请仅使用OpenSSL,不使用包装器。

1 个答案:

答案 0 :(得分:1)

这是你想要的吗?它使用PyCrypto,而不是PyOpenSSL(我不确定当你提到没有包装时,这是否是你想要避免的)

#!/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

密钥文件包含公共/私有部分,因此加密/解密模块将知道该怎么做。

您是否需要两个单独的文件中的公钥/私钥(应该是直截了当的,对吧)?

请注意,使用非对称加密时,您可以加密的最大字符数取决于密钥中使用的modulus。在上面的示例中,如果使用常规RSA密钥(SHA-1,模数为20字节),则对于大于214字节的字符串,您将收到错误。正如cyroxx在评论中指出的那样,算法没有理论上的限制(您可以使用非常长键加密长字符串)但是它需要的计算时间使它成为可能非常实用的。

如果您需要加密大块数据,您可能希望使用对称算法(如AES)加密该数据,并在传输的数据中发送使用RSA(非对称)密钥加密的密码。 ..但这与其他一些问题有很大不同: - )