vlambda博客
学习文章列表

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 base64from Crypto import Randomfrom Crypto.Hash import SHA256from Crypto.PublicKey import RSAfrom Crypto.Signature import PKCS1_v1_5 as Signature_pkcs1_v1_5def 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