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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。