python加密解密库cryptography使用openSSL生成的密匙加密解密
密匙使用步骤一般是:
1.私匙签名,发送签名后的数据,公匙验证。
2.公匙加密,发送加密后的数据,私匙解密。
一般使用情景是通过openssl生成密匙后再操作的。Linux下生成密匙也很简单。
yum安装openssl
yum-yinstallopenssl
生成三个密匙文件。
rsa_private_key.pem私匙文件
rsa_private_key_pkcs8.pem pkcs8格式私匙,
rsa_public_key.pem公匙
opensslgenrsa-outrsa_private_key.pem1024 opensslpkcs8-topk8-informPEM-inrsa_private_key.pem-outformPEM-nocrypt-outrsa_private_key_pkcs8.pem opensslrsa-inrsa_private_key.pem-pubout-outrsa_public_key.pem
导入私匙:
序列化密钥可以选择使用密码在磁盘上进行加密。在这个例子中,我们加载了一个未加密的密钥,因此我们没有提供密码。如果密钥被加密,我们可以传递一个bytes对象作为password参数。
fromcryptography.hazmat.backendsimportdefault_backend fromcryptography.hazmat.primitivesimportserialization #已有sar私匙,导入 withopen('Key.pem','rb')askey_file: private_key=serialization.load_pem_private_key( key_file.read(), password=None, backend=default_backend() )
签名:
私钥可用于签署消息。这允许任何拥有公钥的人验证该消息是由拥有相应私钥的人创建的。RSA签名需要特定的散列函数,并使用填充。以下是message使用RSA进行签名的示例,带有安全散列函数和填充:
fromcryptography.hazmat.backendsimportdefault_backend fromcryptography.hazmat.primitivesimportserialization fromcryptography.hazmat.primitivesimporthashes fromcryptography.hazmat.primitives.asymmetricimportpadding #已有sar私匙,导入 withopen('Key.pem','rb')askey_file: private_key=serialization.load_pem_private_key( key_file.read(), password=None, backend=default_backend() ) message=b"aaaa,bbbb,cccc" #签名操作 signature=private_key.sign( message, padding.PSS( mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH ), hashes.SHA256() ) print('签名后数据:',signature)
有效的签名填充是PSS和PKCS1v15.PSS是任何新协议或应用的推荐选择,PKCS1v15只应用于支持传统协议。
如果您的数据太大而无法在单个调用中传递,则可以分别对其进行散列并使用该值Prehashed。
fromcryptography.hazmat.backendsimportdefault_backend fromcryptography.hazmat.primitivesimportserialization fromcryptography.hazmat.primitivesimporthashes fromcryptography.hazmat.primitives.asymmetricimportpadding fromcryptography.hazmat.primitives.asymmetricimportutils #已有sar私匙,导入 withopen('Key.pem','rb')askey_file: private_key=serialization.load_pem_private_key( key_file.read(), password=None, backend=default_backend() ) #如果您的数据太大而无法在单个调用中传递,则可以分别对其进行散列并使用该值Prehashed。 chosen_hash=hashes.SHA256() hasher=hashes.Hash(chosen_hash,default_backend()) hasher.update(b"data&") hasher.update(b"moredata") digest=hasher.finalize() sig=private_key.sign( digest, padding.PSS( mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH ), utils.Prehashed(chosen_hash) ) print('签名后数据:',sig)
验证:
fromcryptography.hazmat.backendsimportdefault_backend fromcryptography.hazmat.primitivesimportserialization fromcryptography.hazmat.primitivesimporthashes fromcryptography.hazmat.primitives.asymmetricimportpadding #已有sar私匙,导入 withopen('Key.pem','rb')askey_file: private_key=serialization.load_pem_private_key( key_file.read(), password=None, backend=default_backend() ) message=b"123xiao" #签名 signature=private_key.sign( #原始数据 message, padding.PSS( mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH ), hashes.SHA256() ) print('签名后的数据:',signature) #公匙导入 withopen('Key_pub.pem','rb')askey_file: public_key=serialization.load_pem_public_key( key_file.read(), backend=default_backend() ) #签名数据与原始数据不对,抛出异常 #如果验证不匹配,verify()会引发InvalidSignature异常。 public_key.verify( #签名数据 signature, #原始数据 message, padding.PSS( mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH ), hashes.SHA256() )
如果您的数据太大而无法在单个调用中传递,则可以分别对其进行散列并使用该值Prehashed。
fromcryptography.hazmat.backendsimportdefault_backend fromcryptography.hazmat.primitivesimportserialization fromcryptography.hazmat.primitivesimporthashes fromcryptography.hazmat.primitives.asymmetricimportpadding fromcryptography.hazmat.primitives.asymmetricimportutils #已有sar私匙,导入 withopen('Key.pem','rb')askey_file: private_key=serialization.load_pem_private_key( key_file.read(), password=None, backend=default_backend() ) chosen_hash=hashes.SHA256() hasher=hashes.Hash(chosen_hash,default_backend()) hasher.update(b'data&') hasher.update(b'moredata') digest=hasher.finalize() sig=private_key.sign( digest, padding.PSS( mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH ), utils.Prehashed(chosen_hash) ) print('签名后的数据:',sig) #公匙导入 withopen('Key_pub.pem','rb')askey_file: public_key=serialization.load_pem_public_key( key_file.read(), backend=default_backend() ) #如果您的数据太大而无法在单个调用中传递,则可以分别对其进行散列并使用该值Prehashed。 public_key.verify( sig, digest, padding.PSS( mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH ), utils.Prehashed(chosen_hash) )
公匙,加密:
因为是使用进行加密的RSA加密有趣的是公共密钥,这意味着任何人都可以对数据进行加密。数据然后使用私钥解密。
fromcryptography.hazmat.backendsimportdefault_backend fromcryptography.hazmat.primitivesimportserialization fromcryptography.hazmat.primitivesimporthashes fromcryptography.hazmat.primitives.asymmetricimportpadding #公匙导入 withopen('Key_pub.pem','rb')askey_file: public_key=serialization.load_pem_public_key( key_file.read(), backend=default_backend() ) message=b'testdata' ciphertext=public_key.encrypt( message, padding.OAEP( mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None ) ) print('加密数据:',ciphertext)
私匙解密公私加密的信息:
fromcryptography.hazmat.backendsimportdefault_backend fromcryptography.hazmat.primitivesimportserialization fromcryptography.hazmat.primitivesimporthashes fromcryptography.hazmat.primitives.asymmetricimportpadding #已有sar私匙,导入 withopen('Key.pem','rb')askey_file: private_key=serialization.load_pem_private_key( key_file.read(), password=None, backend=default_backend() ) plaintext=private_key.decrypt( #加密的信息 ciphertext, padding.OAEP( mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None ) ) print('解密数据:',plaintext)
完整的公匙加密,私匙解密获取信息。
fromcryptography.hazmat.backendsimportdefault_backend fromcryptography.hazmat.primitivesimportserialization fromcryptography.hazmat.primitivesimporthashes fromcryptography.hazmat.primitives.asymmetricimportpadding #公匙导入 withopen('Key_pub.pem','rb')askey_file: public_key=serialization.load_pem_public_key( key_file.read(), backend=default_backend() ) message=b'testdata' ciphertext=public_key.encrypt( message, padding.OAEP( mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None ) ) print('加密数据:',ciphertext) #已有sar私匙,导入 withopen('Key.pem','rb')askey_file: private_key=serialization.load_pem_private_key( key_file.read(), password=None, backend=default_backend() ) plaintext=private_key.decrypt( #加密的信息 ciphertext, padding.OAEP( mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None ) ) print('解密数据:',plaintext)
更多关于python加密解密库cryptography的使用方法请查看下面的相关链接
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。