时间:2021-05-22
密匙使用步骤一般是:
1. 私匙签名,发送签名后的数据, 公匙验证。
2.公匙加密,发送加密后的数据,私匙解密。
一般使用情景是通过 openssl 生成密匙后再操作的。Linux下生成密匙也很简单。
生成三个密匙文件。
rsa_private_key.pem 私匙文件
rsa_private_key_pkcs8.pem pkcs8格式私匙,
rsa_public_key.pem 公匙
openssl genrsa -out rsa_private_key.pem 1024 openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out rsa_private_key_pkcs8.pem openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem序列化密钥可以选择使用密码在磁盘上进行加密。在这个例子中,我们加载了一个未加密的密钥,因此我们没有提供密码。如果密钥被加密,我们可以传递一个bytes对象作为 password参数。
from cryptography.hazmat.backends import default_backendfrom cryptography.hazmat.primitives import serialization # 已有sar私匙, 导入with open('Key.pem', 'rb') as key_file: private_key = serialization.load_pem_private_key( key_file.read(), password=None, backend=default_backend() )签名:
私钥可用于签署消息。这允许任何拥有公钥的人验证该消息是由拥有相应私钥的人创建的。RSA签名需要特定的散列函数,并使用填充。以下是message使用RSA 进行签名的示例,带有安全散列函数和填充:
from cryptography.hazmat.backends import default_backendfrom cryptography.hazmat.primitives import serializationfrom cryptography.hazmat.primitives import hashesfrom cryptography.hazmat.primitives.asymmetric import padding # 已有sar私匙, 导入with open('Key.pem', 'rb') as key_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。
from cryptography.hazmat.backends import default_backendfrom cryptography.hazmat.primitives import serializationfrom cryptography.hazmat.primitives import hashesfrom cryptography.hazmat.primitives.asymmetric import paddingfrom cryptography.hazmat.primitives.asymmetric import utils # 已有sar私匙, 导入with open('Key.pem', 'rb') as key_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"more data")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)如果您的数据太大而无法在单个调用中传递,则可以分别对其进行散列并使用该值 Prehashed。
from cryptography.hazmat.backends import default_backendfrom cryptography.hazmat.primitives import serializationfrom cryptography.hazmat.primitives import hashesfrom cryptography.hazmat.primitives.asymmetric import paddingfrom cryptography.hazmat.primitives.asymmetric import utils # 已有sar私匙, 导入with open('Key.pem', 'rb') as key_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'more data')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) # 公匙导入with open('Key_pub.pem', 'rb') as key_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加密有趣的是 公共密钥,这意味着任何人都可以对数据进行加密。数据然后使用私钥解密。
from cryptography.hazmat.backends import default_backendfrom cryptography.hazmat.primitives import serializationfrom cryptography.hazmat.primitives import hashesfrom cryptography.hazmat.primitives.asymmetric import padding # 公匙导入with open('Key_pub.pem', 'rb') as key_file: public_key = serialization.load_pem_public_key( key_file.read(), backend=default_backend() ) message = b'test data'ciphertext = public_key.encrypt( message, padding.OAEP( mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None ))print('加密数据: ', ciphertext)私匙解密公私加密的信息:
from cryptography.hazmat.backends import default_backendfrom cryptography.hazmat.primitives import serializationfrom cryptography.hazmat.primitives import hashesfrom cryptography.hazmat.primitives.asymmetric import padding # 已有sar私匙, 导入with open('Key.pem', 'rb') as key_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)完整的公匙加密,私匙解密获取信息。
from cryptography.hazmat.backends import default_backendfrom cryptography.hazmat.primitives import serializationfrom cryptography.hazmat.primitives import hashesfrom cryptography.hazmat.primitives.asymmetric import padding # 公匙导入with open('Key_pub.pem', 'rb') as key_file: public_key = serialization.load_pem_public_key( key_file.read(), backend=default_backend() ) message = b'test data'ciphertext = public_key.encrypt( message, padding.OAEP( mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None ))print('加密数据: ', ciphertext) # 已有sar私匙, 导入with open('Key.pem', 'rb') as key_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的使用方法请查看下面的相关链接
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
使用非对称加密主要是借助openssl的公钥和私钥,用公钥加密私钥解密,或者私钥加密公钥解密。1.安装openssl和php的openssl扩展2.生成私钥:o
原理如下,假如: 加密 明文:10101001 密匙:11100011 密文:01001010 得出密文01001010,解密之需和密匙异或下就可以了
1、加密解密的第一步是生成公钥、私钥对,私钥加密的内容能通过公钥解密(反过来亦可以)下载开源RSA密钥生成工具openssl(通常Linux系统都自带该程序),
前言数据加密,是一门历史悠久的技术,指通过加密算法和加密密钥将明文转变为密文,而解密则是通过解密算法和解密密钥将密文恢复为明文。它的核心是密码学。数据加密目前仍
项目中有时我们需要使用PHP将特定的信息进行加密,也就是通过加密算法生成一个加密字符串,这些加密后的字符串可以通过解密算法进行解密,便于程序对解密后的信息进行处