日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

rsa python实现_RSA算法python实现

發布時間:2025/4/5 python 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 rsa python实现_RSA算法python实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

算法基本思路:

1.公鑰與私鑰的生成:

(1)隨機挑選兩個大質數 p 和 q,構造N = p*q;

(2)計算歐拉函數φ(N) = (p-1) * (q-1);

(3)隨機挑選e,使得gcd(e, φ(N)) = 1,即 e 與?φ(N) 互素;

(4)計算d,使得 e*d ≡ 1 (mod φ(N)),即d 是e 的乘法逆元。

此時,公鑰為(e, N),私鑰為(d, N),公鑰公開,私鑰自己保管。

2.加密信息:

(1)待加密信息(明文)為 M,M < N;(因為要做模運算,若M大于N,則后面的運算不會成立,因此當信息比N要大時,應該分塊加密)

(2)密文C = Memod N

(3)解密Cd mod N = (Me)d mod N = Md*e mod N ;

要理解為什么能解密?要用到歐拉定理(其實是費馬小定理的推廣)aφ(n)?≡ 1 (mod n),再推廣:aφ(n)*k?≡ 1 (mod n),得:aφ(n)*k+1?≡ a (mod n)

注意到?e*d ≡ 1 mod?φ(N),即:e*d = 1 + k*φ(N)。

因此,Md*e?mod N =?M1 + k*φ(N)?mod N = M

簡單來說,別人用我的公鑰加密信息發給我,然后我用私鑰解密。

3.數字簽名:

(1)密文C = Md?mod N

(2)解密M = Cemod N =?(Md)e?mod N = Md*e?mod N ?= M ;(原理同上)

簡單來說,我用自己的密鑰加密簽名,別人用我的公鑰解密可以看到這是我的簽名。注意,這個不具有隱私性,即任何人都可以解密此簽名。

算法的安全性:基于大整數N難以分解出p和q,構造φ(N);或由N直接構造φ(N)同樣難。

算法的實現:

實現代碼:

importrandomdeffastExpMod(b, e, m):"""e = e0*(2^0) + e1*(2^1) + e2*(2^2) + ... + en * (2^n)

b^e = b^(e0*(2^0) + e1*(2^1) + e2*(2^2) + ... + en * (2^n))

= b^(e0*(2^0)) * b^(e1*(2^1)) * b^(e2*(2^2)) * ... * b^(en*(2^n))

b^e mod m = ((b^(e0*(2^0)) mod m) * (b^(e1*(2^1)) mod m) * (b^(e2*(2^2)) mod m) * ... * (b^(en*(2^n)) mod m) mod m"""result= 1

while e !=0:if (e&1) == 1:#ei = 1, then mul

result = (result * b) %m

e>>= 1

#b, b^2, b^4, b^8, ... , b^(2^n)

b = (b*b) %mreturnresultdefprimeTest(n):

q= n - 1k=0#Find k, q, satisfied 2^k * q = n - 1

while q % 2 ==0:

k+= 1;

q/= 2a= random.randint(2, n-2);#If a^q mod n= 1, n maybe is a prime number

if fastExpMod(a, q, n) == 1:return "inconclusive"

#If there exists j satisfy a ^ ((2 ^ j) * q) mod n == n-1, n maybe is a prime number

for j inrange(0, k):if fastExpMod(a, (2**j)*q, n) == n - 1:return "inconclusive"

#a is not a prime number

return "composite"

deffindPrime(halfkeyLength):whileTrue:#Select a random number n

n = random.randint(0, 1<

found=True#If n satisfy primeTest 10 times, then n should be a prime number

for i in range(0, 10):if primeTest(n) == "composite":

found=Falsebreak

iffound:returnndefextendedGCD(a, b):#a*xi + b*yi = ri

if b ==0:return (1, 0, a)#a*x1 + b*y1 = a

x1 = 1y1=0#a*x2 + b*y2 = b

x2 =0

y2= 1

while b !=0:

q= a /b#ri = r(i-2) % r(i-1)

r = a %b

a=b

b=r#xi = x(i-2) - q*x(i-1)

x = x1 - q*x2

x1=x2

x2=x#yi = y(i-2) - q*y(i-1)

y = y1 - q*y2

y1=y2

y2=yreturn(x1, y1, a)defselectE(fn, halfkeyLength):whileTrue:#e and fn are relatively prime

e = random.randint(0, 1<

(x, y, r)=extendedGCD(e, fn)if r == 1:returnedefcomputeD(fn, e):

(x, y, r)=extendedGCD(fn, e)#y maybe < 0, so convert it

if y <0:return fn +yreturnydefkeyGeneration(keyLength):#generate public key and private key

p = findPrime(keyLength/2)

q= findPrime(keyLength/2)

n= p *q

fn= (p-1) * (q-1)

e= selectE(fn, keyLength/2)

d=computeD(fn, e)return(n, e, d)defencryption(M, e, n):#RSA C = M^e mod n

returnfastExpMod(M, e, n)defdecryption(C, d, n):#RSA M = C^d mod n

returnfastExpMod(C, d, n)#Unit Testing

(n, e, d) = keyGeneration(1024)#AES keyLength = 256

X = random.randint(0, 1<<256)

C=encryption(X, e, n)

M=decryption(C, d, n)print "PlainText:", Xprint "Encryption of plainText:", Cprint "Decryption of cipherText:", Mprint "The algorithm is correct:", X == M

Python

總結

以上是生活随笔為你收集整理的rsa python实现_RSA算法python实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。