rsa非對稱加密-python實現

Boblee人工智能碩士畢業,擅長及愛好python,基於python研究人工智能、羣體智能、區塊鏈等技術,並使用python開發先後端、爬蟲等。css

1公私鑰關係
python

非對稱加密算法須要兩個密鑰來進行加密和解密,這兩個祕鑰是公開密鑰(public key,簡稱公鑰)和私有密鑰(private key,簡稱私鑰)。算法

公鑰(Public Key)與私鑰(Private Key)是經過一種算法獲得的一個密鑰對(即一個公鑰和一個私鑰),公鑰是密鑰對中公開的部分,私鑰則是非公開的部分。公鑰一般用於加密會話密鑰、驗證數字簽名,或加密能夠用相應的私鑰解密的數據。經過這種算法獲得的密鑰對能保證在世界範圍內是惟一的。使用這個密鑰對的時候,若是用其中一個密鑰加密一段數據,必須用另外一個密鑰解密。好比用公鑰加密數據就必須用私鑰解密,若是用私鑰加密也必須用公鑰解密,不然解密將不會成功。(此處引用了 百度百科 的詞條解釋)後端


  經常使用的非對稱加密算法有rsa及橢圓加密(esa)。
安全

RSA算法普遍應用與加密與認證兩個領域    微信

     1.加密(保證數據安全性)dom

     使用公鑰加密,需使用私鑰解密。區塊鏈

這種普遍應用在保證數據的安全性的方面,用戶將本身的公鑰廣播出去,全部人給該用戶發數據時使用該公鑰加密,可是隻有該用戶可使用本身的私鑰解密,保證了數據的安全性。編碼

     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


本文分享自微信公衆號 - python制霸(pythonzhiba)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索