【问题标题】:Python Cryptography module save/load RSA keys to/from filePython Cryptography 模块将 RSA 密钥保存/加载到/从文件中
【发布时间】:2022-02-08 22:26:09
【问题描述】:

使用 Python 的 Cryptography 模块,

我想将生成的私钥保存在一个文件中,以便以后使用。

但从文档中我无法找到所需的方法。

from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding

# Working RSA encryption you can run for yourself
MESSAGE = 'I am a very secret message'

# Create private key
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
    backend=default_backend()
)

# Create public key
public_key = private_key.public_key()

# Encrypt
ciphertext = public_key.encrypt(
    MESSAGE,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA1()),
        algorithm=hashes.SHA1(),
        label=None
    )
)

# Encrypted text
print ciphertext

# Decrypt
plaintext = private_key.decrypt(
    ciphertext,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA1()),
        algorithm=hashes.SHA1(),
        label=None
    )
)

# Decrypted text
print plaintext

# Print human readable key
pem = private_key.private_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PrivateFormat.TraditionalOpenSSL,
    encryption_algorithm=serialization.NoEncryption()
)
pem_data = pem.splitlines()
print pem_data


# How to Save//Load

我知道如何生成密钥,但是如何正确保存到文件中。只需将pem_data 存储在一个文件中,然后从该文件加载 load_pem_public_key?

由于密码学对我来说还是个新手,我想知道将 RSA 密钥存储在文件中的正确方法。

这是我目前的尝试,但出现错误。

ValueError: Could not deserialize key data.

if os.path.exists('key.pem'):
    print 'file exist'
else:
    f = open(os.path.join(__location__, 'key.pem'), 'w')
    for i in pem_data:
       f.write(i)
    f.close()

with open(os.path.join(__location__, 'key.pem'), "rb") as key_file:
   private_key = serialization.load_pem_private_key(
        key_file.read(),
        password=None,
        backend=default_backend()
    )

【问题讨论】:

    标签: python cryptography rsa


    【解决方案1】:

    您保存私钥的方法会丢弃load_pem_private_key() 期望看到的换行符。我已经稍微修改了你的例子来说明这一点。 save_key_bad() 方法是你的方法,save_key() 方法显示了一个简单正确的方法。

    from cryptography.hazmat.backends import default_backend
    from cryptography.hazmat.primitives.asymmetric import rsa
    from cryptography.hazmat.primitives import serialization
    from cryptography.hazmat.primitives.serialization import load_pem_private_key
    
    
    def gen_key():
        private_key = rsa.generate_private_key(
            public_exponent=65537, key_size=2048, backend=default_backend()
        )
        return private_key
    
    
    def save_key(pk, filename):
        pem = pk.private_bytes(
            encoding=serialization.Encoding.PEM,
            format=serialization.PrivateFormat.TraditionalOpenSSL,
            encryption_algorithm=serialization.NoEncryption()
        )
        with open(filename, 'wb') as pem_out:
            pem_out.write(pem)
    
    
    def save_key_bad(pk, filename):
        pem = pk.private_bytes(
            encoding=serialization.Encoding.PEM,
            format=serialization.PrivateFormat.TraditionalOpenSSL,
            encryption_algorithm=serialization.NoEncryption()
        )
        pem_data = pem.splitlines()
        with open(filename, 'wb') as pem_out:
            for line in pem_data:
                pem_out.write(line)
    
    
    def load_key(filename):
        with open(filename, 'rb') as pem_in:
            pemlines = pem_in.read()
        private_key = load_pem_private_key(pemlines, None, default_backend())
        return private_key
    
    
    if __name__ == '__main__':
        pk = gen_key()
        filename = 'privkey.pem'
        save_key(pk, filename)
        pk2 = load_key(filename)
        save_key_bad(pk, filename)
        pk3 = load_key(filename)
    

    【讨论】:

    • @BenDavis:请在进行编辑之前运行更改后的代码。 pemlines 已经是 bytes 对象,因此无需编码。感谢您仔细阅读答案,我总是很高兴有人找到我的错误或改进我的答案。
    【解决方案2】:
    import rsa
    
    if __name__ == '__main__':
    
      (pubkey, privkey) = rsa.newkeys(512, poolsize=4)
    
      message = b'Say hi!'
      crypto = rsa.encrypt(message, pubkey)
    
      PRIV_KEY_DST = 'your path to file'
      with open(PRIV_KEY_DST, 'wb+') as f:
        pk = rsa.PrivateKey.save_pkcs1(privkey, format='PEM')
        f.write(pk)
    

    【讨论】:

      猜你喜欢
      • 2013-05-05
      • 1970-01-01
      • 2010-12-17
      • 1970-01-01
      • 2021-11-30
      • 1970-01-01
      • 2019-06-26
      • 2012-07-09
      • 1970-01-01
      相关资源
      最近更新 更多