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ù)字的乘積稱(chēng)為 n ,其中 n = p * q
- 生成一個(gè)(p-1)和(q-1)相對(duì)素?cái)?shù)的隨機(jī)數(shù).將數(shù)字稱(chēng)為 e .
- 計(jì)算e的模數(shù)逆.計(jì)算出的倒數(shù)將被稱(chēng)為 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文件夾分區(qū)的實(shí)現(xiàn)方法實(shí)例
這篇文章主要給大家介紹了關(guān)于python文件夾分區(qū)的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
解決Python獲取文件提示找不到指定路徑can‘t?open?file?'area.py':
這篇文章主要給大家介紹了關(guān)于如何解決Python獲取文件提示找不到指定路徑can‘t?open?file?'area.py':[Errno?2]?No?such?file?or?directory的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11
python實(shí)現(xiàn)通訊錄系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)通訊錄系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
三個(gè)Python常用的數(shù)據(jù)清洗處理方式總結(jié)
這篇文章主要為大家詳細(xì)介紹了python數(shù)據(jù)處理過(guò)程中三個(gè)主要的數(shù)據(jù)清洗說(shuō)明,分別是缺失值/空格/重復(fù)值的數(shù)據(jù)清洗,感興趣的小伙伴可以了解一下2022-12-12
Python-基礎(chǔ)-入門(mén) 簡(jiǎn)介
這篇文章主要介紹了Python-基礎(chǔ)-簡(jiǎn)介入門(mén)的相關(guān)資料,需要的朋友可以參考下2014-08-08
django celery redis使用具體實(shí)踐
這篇文章主要介紹了django celery redis使用具體實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
tensorflow 中對(duì)數(shù)組元素的操作方法

