rsa非对称加密-python实现
Posted python制霸
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rsa非对称加密-python实现相关的知识,希望对你有一定的参考价值。
Boblee人工智能硕士毕业,擅长及爱好python,基于python研究人工智能、群体智能、区块链等技术,并使用python开发前后端、爬虫等。
1公私钥关系
非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。
公钥(Public Key)与私钥(Private Key)是通过一种算法得到的一个密钥对(即一个公钥和一个私钥),公钥是密钥对中公开的部分,私钥则是非公开的部分。公钥通常用于加密会话密钥、验证数字签名,或加密可以用相应的私钥解密的数据。通过这种算法得到的密钥对能保证在世界范围内是唯一的。使用这个密钥对的时候,如果用其中一个密钥加密一段数据,必须用另一个密钥解密。比如用公钥加密数据就必须用私钥解密,如果用私钥加密也必须用公钥解密,否则解密将不会成功。(此处引用了 百度百科 的词条解释)
常用的非对称加密算法有rsa及椭圆加密(esa)。
RSA算法广泛应用与加密与认证两个领域
1.加密(保证数据安全性)
使用公钥加密,需使用私钥解密。
这种广泛应用在保证数据的安全性的方面,用户将自己的公钥广播出去,所有人给该用户发数据时使用该公钥加密,但是只有该用户可以使用自己的私钥解密,保证了数据的安全性。
2.认证(用于身份判断)
使用私钥签名,需使用公钥验证签名。
用户同样将自己的公钥广播出去,给别人发送数据时,使用私钥加密,在这里,我们更乐意称它为签名,然后别人用公钥验证签名,如果解密成功,则可以判断对方的身份。
2.python实现
本文基于python实现rsa非对称加密算法公私钥生成、私钥签名和公钥验签过程。
1.安装python库
pip install pycrypto(建议选择对应的whl文件)
2.公私钥生成
import base64
from Crypto import Random
from Crypto.Hash import SHA256
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5 as Signature_pkcs1_v1_5
def get_key():
"""
生成公私钥
:return: 公、私钥base64编码字符串
"""
# 获取一个伪随机数生成器
random_generator = Random.new().read
# 获取一个rsa算法对应的密钥对生成器实例
rsa = RSA.generate(2048, random_generator)
# 生成私钥并保存
private_pem = rsa.exportKey()
# 生成公钥并保存
public_pem = rsa.publickey().exportKey()
return str(base64.b64encode(public_pem), encoding="utf8"), str(base64.b64encode(private_pem), encoding="utf8")
3.私钥签名
def gen_sign(private_key, unsign_data):
"""
私钥签名
:param private_key: 私钥base64编码字符串
:param unsign_data: 待签名数据
:return: 签名字符串
"""
rsaKey = RSA.importKey(base64.b64decode(bytes(private_key, encoding="utf8")))
signer = Signature_pkcs1_v1_5.new(rsaKey)
digest = SHA256.new()
digest.update(unsign_data.encode('utf8'))
sign = signer.sign(digest)
signature = str(base64.b64encode(sign), encoding='utf8')
return signature
4.公钥验签
def verify_sign(pubkey, data, sign):
"""
:param pubkey: 公钥base64编码字符串
:param data: 原数据
:param sign: 签名字符串
:return: 验签结果true,false
"""
rsaKey = RSA.importKey(base64.b64decode(bytes(pubkey, encoding="utf8")))
verifier = Signature_pkcs1_v1_5.new(rsaKey)
digest = SHA256.new()
digest.update(data.encode('utf8'))
is_verify = verifier.verify(digest, base64.b64decode(sign))
return is_verify
3.python实现结果
data = 'boblee'
pub, prv = get_key()
sign = gen_sign(prv, data)
result = verify_sign(pub, data, sign)
公私钥生成
公钥是: LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFuNjZXSWJJangxRkw2SEtpVmtaZQovdXBEbnVhZ2NoUTVQbFYxR0RmMThHaERuMnZ4blA2QjhnQzNSZFo1cTNkOG1GM0pIUUJsazd5RjNMUFZMQkRzCko1V0dySzBzWFdaV1ZIR3RZMWNCR2tDUHREcDlQc05Id3cvYVlvMThXeEV2WHZUUUh6M21TQzR2YTFwcGVkRDAKbDJlT2dReCtaeWhlcSsvc0w2cENJR3dZWHNaWkk0eUVDTG4zNGFhcElaUisxUDk0VUoxNk0rVGYvY2JIRS9lawpNbGZiVHAzeVIwWklPa3l4OERMRWgwa1ZueVZTMVlzYWY0YVd5TmNqTk1WRUtDejBGZEZ2WGIwUVZTQmdtRk9kCklhMS9ZYVZobk9paU1pR0FvSVl3aUhJVmc5bkxQN0dNVXhNclFVT3lja2JtRUYwQStSVk0zMDZYS043VTFQa0oKdHdJREFRQUIKLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0t
私钥是: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb2dJQkFBS0NBUUVBbjY2V0liSWp4MUZMNkhLaVZrWmUvdXBEbnVhZ2NoUTVQbFYxR0RmMThHaERuMnZ4Cm5QNkI4Z0MzUmRaNXEzZDhtRjNKSFFCbGs3eUYzTFBWTEJEc0o1V0dySzBzWFdaV1ZIR3RZMWNCR2tDUHREcDkKUHNOSHd3L2FZbzE4V3hFdlh2VFFIejNtU0M0dmExcHBlZEQwbDJlT2dReCtaeWhlcSsvc0w2cENJR3dZWHNaWgpJNHlFQ0xuMzRhYXBJWlIrMVA5NFVKMTZNK1RmL2NiSEUvZWtNbGZiVHAzeVIwWklPa3l4OERMRWgwa1ZueVZTCjFZc2FmNGFXeU5jak5NVkVLQ3owRmRGdlhiMFFWU0JnbUZPZElhMS9ZYVZobk9paU1pR0FvSVl3aUhJVmc5bkwKUDdHTVV4TXJRVU95Y2tibUVGMEErUlZNMzA2WEtON1UxUGtKdHdJREFRQUJBb0lCQUJnQU8xT2NQWEYzZ0RQVAppeC94bXRTdzdISUZVeWRpYjhvMU9SRG5WR0dLb21OamE2RC94aE5VVlRlN2lYVWkxQWpveTlJK25ZWHJwNmtwCkpJam5rRDlRNDdtdm04UDhIa3k1KzJnN2l4QmhsTmZ2bEtTcTRHM3F3NVhkazB2eTFNNXVlSnZCaDR2ZzJVTEgKQjZTR0trVlpqTnRMdi9JTWFOSnFFUE9ISVVKVEVBLzZ3WDRmaDV6Qjh3TlpqYys2QWh2NDcwSmRMSmZ4Z20vdQp0c25WSCsrM1BENDdua3R3d0tBOXMzdjhRMGZsMWxHNjdFYUZPc3p4V3BGbGM5YzJIc3ZieC8zZHdla3hWT0NwCkxHU093cFlVTUFYZUFJMGJicVJMVzRLaWF0VlEzbVVsaHlPdm04VklORURLbFNPZUdkdkNjQ2ZHR0x3TndlS2YKMHI2Z3lqVUNnWUVBdTFyZjA4ZG1HVURLZEZRNytFUUN4bjdHVE1FQ1FORDRlSytWVlBkVGNjR2MrWlJ1bEZhKwp5WVdRMHZxQjBHVWxVeWJIcWFQK25wOGhzZWp5UldxakptcWludWxDTEcxTzhtdnRCK3NOYjNzYlRBR2tIUUxKCldGOEtra2RoTDJ3b0Z4Vzd0eVYvd0NTckR5SjEzcVpISWhEUm9McDdEdUtMcTNXSmhXWGdLRFVDZ1lFQTJqQVoKUTZhdlFPdEQ4WTNZQlRyZmFzTDFTNHVLZG5HRGFibFFYY21pNC8rRS90L09tUk12Q3BBOHkwNjhCK1M1eVNrVQo0VUNWUHlaZFBYblplaXZaNU5ONUFKUGJoOVlJVVdUNE9KbmJVcCtnQXMwUXJtbFhtVnRJVUhmV3dQT21sZVFSCmhNVWdyQm50cWZxVWpPaHY4aHNCc09HbDRvRDZid3l6enRnUVg3c0NnWUJkMm5JUnB1dXdidEo4WDg0QzJoOEIKekhRTjh3bnI2a0x1UWhidWowOFB4MHVaZ3crNTQ1S0RaUk5kZlB3V3B2U0JxUVdRSjRUZmRSdnVBYUdMd0pXbQpJdmovM2gyMkg3UFNvTm9HZzJzaGsydmpNVmRDNlNodnlueUROcHFxcE9XWVd0ekVMRmJJckJXODZTaGV0ckVmCmtZbFJtTmtZWmNoTnhmMTBBOHE4bVFLQmdDOWNsWDliNVZzQU5zVnVkdC9id2JlWkRrb1J4a0tqclZUN3h2ZzAKMXNrTEpFRjNMNCtHM0lVOGZoWGJ4M0VuTXpUNVYvRDFaZkJKVWFBUW5TYXA4aWg3eHg1YStpSm9VWEhwcXdBTwpWYzkvbXVwQXZVZyswYWNXYTRJY0lWL05BL0l4aWFQNmJuY3RRYXZPR3dUalI3bVVKeS9RSzRRWlgwTlB6SkF2CjBvNFZBb0dBZmhhWTR0Y3E4aU51aWF4dEtkZVdDQjdsVWZXVzk2WW05WGFTRjVzQWFTZjAvcjc4Y2hUUWxrOFoKWXlwTzVVdVMyVUV3VWE5RmNhU01GYWtxLzR4bmdPS29pQVFDVHlDazM2bzg1WlRyMmtpci9sUndvdlVMaGVPRQpNUHE1S3J5ZGptbWs1dUQzVENOVjZxNWIzTGpheDRmSDY3dEFFQ0VnQUdLaFgzLyttbGM9Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0t
签名生成
签名是: XnNLeOyTFQJAriQiORS3LZSa0WgiY3tmEJfWPEywrwXoCwk6wqhi5foW3z3dr5cxzVjhrlNPm6Cjku4kh6XdUxMHBKtQPVYa8V8eCBcYm4t1hDvq60q85P/RhiNQgzTLI8HZA0W7zd3U02kVqFYB4ge+GlFo4jc3JgaSPzaiB1ynX0mjcOs+QURS2yr30RTb2aTnbf+NU7shIDGWlCdZUl1sZKLmNwGOHctRAXzZ9hsRTcRKFSQGY1cxhAPpcc6IN8ud+XcCEbXEaAIsjQmYU088m6OWpdjPNTRweEy58XiiOjoO8AsoDEzsIKCrD1g5YIdKB06Fa6JtzQH/eso6qw==
结果
True
以上是关于rsa非对称加密-python实现的主要内容,如果未能解决你的问题,请参考以下文章