欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python密碼學(xué)RSA算法及秘鑰創(chuàng)建教程

 更新時(shí)間:2022年05月24日 14:17:51   作者:菜鳥(niǎo)教程  
這篇文章主要為大家介紹了python密碼學(xué)RSA算法及秘鑰創(chuàng)建教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

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)文章

最新評(píng)論