python密碼學(xué)RSA算法及秘鑰創(chuàng)建教程
RSA算法
RSA算法是一種公鑰加密技術(shù),被認(rèn)為是最安全的加密方式.它是由Rivest,Shamir和Adleman于1978年發(fā)明的,因此命名為 RSA 算法.
RSA算法具有以下特征 :
- RSA算法是包含素?cái)?shù)的整數(shù)在有限域中的一種流行取冪./p>
- 此方法使用的整數(shù)足夠大,難以解決.
- 此算法中有兩組密鑰:私鑰和公鑰.
您必須完成以下步驟才能工作關(guān)于RSA算法 :
步驟1:生成RSA模數(shù)
初始過(guò)程從選擇兩個(gè)素?cái)?shù)即p和q開(kāi)始,然后計(jì)算他們的產(chǎn)品N,如圖所示去;
N = p * q
這里,設(shè)N為指定的大數(shù).
步驟2:派生數(shù)(e)
將數(shù)字e視為派生數(shù),該數(shù)字應(yīng)大于1且小于(p-1)和(q-1).主要條件是應(yīng)該沒(méi)有(p-1)和(q-1)的公因子,除了1
步驟3:公鑰
指定的一對(duì)數(shù)字 n 和 e 形成RSA公鑰并將其公開(kāi).
步驟4:私鑰
私鑰 d 是根據(jù)數(shù)字p,q和e計(jì)算的.數(shù)字之間的數(shù)學(xué)關(guān)系如下:
ed = 1 mod(p-1)(q-1)
上面的公式是擴(kuò)展歐幾里得算法的基本公式,它以p和q作為輸入?yún)?shù).
加密公式
考慮將明文消息發(fā)送給公鑰為(n,e)的人的發(fā)件人.要在給定方案中加密純文本消息,請(qǐng)使用以下語(yǔ)法 :
C = Pe mod n
解密公式
解密過(guò)程非常簡(jiǎn)單,包括用于系統(tǒng)方法計(jì)算的分析.考慮到接收器 C 具有私鑰 d ,結(jié)果模數(shù)將計(jì)算為 :
Plaintext = Cd mod n
生成RSA密鑰
我們將重點(diǎn)介紹使用Python逐步實(shí)現(xiàn)RSA算法.
涉及以下步驟生成RSA密鑰 :
- 創(chuàng)建兩個(gè)大的素?cái)?shù),即 p 和 q 的.這些數(shù)字的乘積稱為 n ,其中 n = p * q
- 生成一個(gè)(p-1)和(q-1)相對(duì)素?cái)?shù)的隨機(jī)數(shù).將數(shù)字稱為 e .
- 計(jì)算e的模數(shù)逆.計(jì)算出的倒數(shù)將被稱為 d .
生成RSA密鑰的算法
我們需要兩個(gè)主要算法來(lái)使用Python和minus生成RSA密鑰; Cryptomath模塊和 Rabin Miller模塊.
Cryptomath模塊
cryptomath的源代碼遵循RSA算法的所有基本實(shí)現(xiàn)的模塊如下
def?gcd(a,?b): ???while?a?!=?0: ??????a,?b?=?b?%?a,?a ???return?b def?findModInverse(a,?m): ???if?gcd(a,?m)?!=?1: ??????return?None ???u1,?u2,?u3?=?1,?0,?a ???v1,?v2,?v3?=?0,?1,?m ??? ???while?v3?!=?0: ??????q?=?u3?//?v3 ?????????v1,?v2,?v3,?u1,?u2,?u3?=?(u1?-?q?*?v1),?(u2?-?q?*?v2),?(u3?-?q?*?v3),?v1,?v2,?v3 ???return?u1?%?m
RabinMiller模塊
源代碼遵循RSA算法的所有基本實(shí)現(xiàn)的RabinMiller模塊如下<
import?random def?rabinMiller(num): ???s?=?num?-?1 ???t?=?0 ??? ???while?s?%?2?==?0: ??????s?=?s?//?2 ??????t?+=?1 ???for?trials?in?range(5): ??????a?=?random.randrange(2,?num?-?1) ??????v?=?pow(a,?s,?num) ??????if?v?!=?1: ?????????i?=?0 ?????????while?v?!=?(num?-?1): ????????????if?i?==?t?-?1: ???????????????return?False ????????????else: ???????????????i?=?i?+?1 ???????????????v?=?(v?**?2)?%?num ??????return?True def?isPrime(num): ???if?(num?7<?2): ??????return?False ???lowPrimes?=?[2,?3,?5,?7,?11,?13,?17,?19,?23,?29,?31,?37,?41,?43,?47,?53,?59,?61,? ???67,?71,?73,?79,?83,?89,?97,?101,?103,?107,?109,?113,?127,?131,?137,?139,?149,?151,? ???157,?163,?167,?173,?179,?181,?191,?193,?197,?199,?211,?223,?227,?229,?233,?239,?241,? ???251,?257,?263,?269,?271,?277,?281,?283,?293,?307,?311,?313,317,?331,?337,?347,?349,? ???353,?359,?367,?373,?379,?383,?389,?397,?401,?409,?419,?421,?431,?433,?439,?443,?449,? ???457,?461,?463,?467,?479,?487,?491,?499,?503,?509,?521,?523,?541,?547,?557,?563,?569,? ???571,?577,?587,?593,?599,?601,?607,?613,?617,?619,?631,?641,?643,?647,?653,?659,?661,? ???673,?677,?683,?691,?701,?709,?719,?727,?733,?739,?743,?751,?757,?761,?769,?773,?787,? ???797,?809,?811,?821,?823,?827,?829,?839,?853,?857,?859,?863,?877,?881,?883,?887,?907,? ???911,?919,?929,?937,?941,?947,?953,?967,?971,?977,?983,?991,?997] ???if?num?in?lowPrimes: ??????return?True ???for?prime?in?lowPrimes: ??????if?(num?%?prime?==?0): ?????????return?False ???return?rabinMiller(num) def?generateLargePrime(keysize?=?1024): ???while?True: ??????num?=?random.randrange(2**(keysize-1),?2**(keysize)) ??????if?isPrime(num): ?????????return?num
生成RSA密鑰完整代碼
import?random,?sys,?os,?rabinMiller,?cryptomath def?main(): ???makeKeyFiles('RSA_demo',?1024) def?generateKey(keySize): ???#?Step?1:?Create?two?prime?numbers,?p?and?q.?Calculate?n?=?p?*?q. ???print('Generating?p?prime...') ???p?=?rabinMiller.generateLargePrime(keySize) ???print('Generating?q?prime...') ???q?=?rabinMiller.generateLargePrime(keySize) ???n?=?p?*?q ???#?Step?2:?Create?a?number?e?that?is?relatively?prime?to?(p-1)*(q-1). ???print('Generating?e?that?is?relatively?prime?to?(p-1)*(q-1)...') ???while?True: ??????e?=?random.randrange(2?**?(keySize?-?1),?2?**?(keySize)) ??????if?cryptomath.gcd(e,?(p?-?1)?*?(q?-?1))?==?1: ?????????break ??? ???#?Step?3:?Calculate?d,?the?mod?inverse?of?e. ???print('Calculating?d?that?is?mod?inverse?of?e...') ???d?=?cryptomath.findModInverse(e,?(p?-?1)?*?(q?-?1)) ???publicKey?=?(n,?e) ???privateKey?=?(n,?d) ???print('Public?key:',?publicKey) ???print('Private?key:',?privateKey) ???return?(publicKey,?privateKey) def?makeKeyFiles(name,?keySize): ???#?Creates?two?files?'x_pubkey.txt'?and?'x_privkey.txt'? ??????(where?x?is?the?value?in?name)?with?the?the?n,e?and?d,e?integers?written?in?them, ???#?delimited?by?a?comma. ???if?os.path.exists('%s_pubkey.txt'?%?(name))?or?os.path.exists('%s_privkey.txt'?%?(name)): ??????sys.exit('WARNING:?The?file?%s_pubkey.txt?or?%s_privkey.txt?already?exists!?Use?a?different?name?or?delete?these?files?and?re-run?this?program.'?%?(name,?name)) ???publicKey,?privateKey?=?generateKey(keySize) ???print() ???print('The?public?key?is?a?%s?and?a?%s?digit?number.'?%?(len(str(publicKey[0])),?len(str(publicKey[1]))))? ???print('Writing?public?key?to?file?%s_pubkey.txt...'?%?(name)) ??? ???fo?=?open('%s_pubkey.txt'?%?(name),?'w') fo.write('%s,%s,%s'?%?(keySize,?publicKey[0],?publicKey[1])) ???fo.close() ???print() ???print('The?private?key?is?a?%s?and?a?%s?digit?number.'?%?(len(str(publicKey[0])),?len(str(publicKey[1])))) ???print('Writing?private?key?to?file?%s_privkey.txt...'?%?(name)) ??? ???fo?=?open('%s_privkey.txt'?%?(name),?'w') ???fo.write('%s,%s,%s'?%?(keySize,?privateKey[0],?privateKey[1])) ???fo.close() #?If?makeRsaKeys.py?is?run?(instead?of?imported?as?a?module)?call #?the?main()?function. if?__name__?==?'__main__': ???main()
輸出
生成公鑰和私鑰并將其保存在相應(yīng)的文件中,如以下輸出所示.
以上就是python密碼學(xué)RSA算法及秘鑰創(chuàng)建教程的詳細(xì)內(nèi)容,更多關(guān)于python密碼學(xué)RSA算法秘鑰的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python 多線程,threading模塊,創(chuàng)建子線程的兩種方式示例
這篇文章主要介紹了Python 多線程,threading模塊,創(chuàng)建子線程的兩種方式,結(jié)合實(shí)例形式分析了Python線程的原理與創(chuàng)建子線程的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-09-09Python面向?qū)ο蟪绦蛟O(shè)計(jì)構(gòu)造函數(shù)和析構(gòu)函數(shù)用法分析
這篇文章主要介紹了Python面向?qū)ο蟪绦蛟O(shè)計(jì)構(gòu)造函數(shù)和析構(gòu)函數(shù)用法,結(jié)合具體實(shí)例形式分析了Python面向?qū)ο蟪绦蛟O(shè)計(jì)中構(gòu)造函數(shù)與析構(gòu)函數(shù)的概念、原理、功能及相關(guān)使用技巧,需要的朋友可以參考下2019-04-04Python Json模塊中dumps、loads、dump、load函數(shù)介紹
本篇文章主要介紹了Python Json模塊中dumps、loads、dump、load函數(shù)介紹,詳細(xì)的介紹了這幾種函數(shù)的用法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05超級(jí)詳細(xì)實(shí)用的pycharm常用快捷鍵
本文詳細(xì)總結(jié)了Pycharm的常用快捷鍵,下文介紹使用方法和場(chǎng)景, 并不需要記憶這些快捷鍵, 你只需要知道有這些快捷鍵, 再需要用的時(shí)候查看一下, 用的多了自然也就記住了,需要的朋友可以參考下2021-05-05在Linux系統(tǒng)上部署Apache+Python+Django+MySQL環(huán)境
這篇文章主要介紹了在Linux系統(tǒng)上部署Apache+Python+Django+MySQL環(huán)境的方法,使用到了mod_python 與mysqldb模塊進(jìn)行連接,需要的朋友可以參考下2015-12-12PyTorch學(xué)習(xí)之軟件準(zhǔn)備與基本操作總結(jié)
這篇文章主要介紹了PyTorch學(xué)習(xí)之軟件準(zhǔn)備與基本操作總結(jié),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有很好地幫助,需要的朋友可以參考下2021-05-05python opencv角點(diǎn)檢測(cè)連線功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了python opencv角點(diǎn)檢測(cè)連線功能的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11