日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
用Python來實現(xiàn)RSA加解密

這篇英文提供的代碼我運行了下,發(fā)現(xiàn)不能加密中文,于是就修改了下加解密的函數(shù),讓其支持中文加解密。今天的文章就分享一下如何用 Python 來實現(xiàn) RSA 加解密的這一過程,幫助你建立 RSA 的直觀認識,代碼里的隨機素數(shù)生成算法,也值得我們學(xué)習(xí)。

成都創(chuàng)新互聯(lián)公司服務(wù)項目包括寧江網(wǎng)站建設(shè)、寧江網(wǎng)站制作、寧江網(wǎng)頁制作以及寧江網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,寧江網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到寧江省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

0、效果演示

咱們先看下效果。

原文:“有內(nèi)鬼,終止交易”

密文,根本無法破解:

解密之后:

完整代碼公眾號「Python七號」回復(fù)「rsa」獲取。

1、密鑰對的生成

思路:

1)隨機找兩個質(zhì)數(shù)(素數(shù)) p 和 q,p 與 q 越大,越安全,這里選擇 1024 位的質(zhì)數(shù):

p = genprime(1024)
q = genprime(1024)

genprime() 函數(shù)的實現(xiàn)過程先不說。

2)計算他們的乘積 n = p * q 及 歐拉函數(shù) lambda_n。

n = p * q
lambda_n = (p - 1) * (q - 1)

3)隨機選擇一個整數(shù) e,條件是 1 < e < lambda_n,且 e 與 lambda_n 互質(zhì)。比如選擇 35537,35537 只有 16 位,必然小于 lambda_n。

e = 35537

4)找到一個整數(shù) d,可以使得 e * d 除以 lambda_n 的余數(shù)為 1,并返回密鑰對。

d = eucalg(e, lambda_n)[0]
if d < 0: d += lambda_n
return (d, n), (e, n)

eucalg 函數(shù)的實現(xiàn)放后面說。

至此,密鑰對的生成的函數(shù)如下:

def create_keys():
p = genprime(1024)
q = genprime(1024)
n = p * q
lambda_n = (p - 1) * (q - 1)
e = 35537
d = eucalg(e, lambda_n)[0]
if d < 0: d += lambda_n
return (d, n), (e, n)

2、加解密的實現(xiàn)

加密和解密的過程是一樣的,公鑰加密,私鑰解密,反過來也可以,私鑰加密,公鑰解密,只不過前者我們叫加密,后者我們叫簽名。

具體的函數(shù)實現(xiàn)如下:

def encrypt_data(data,key):
e_data = []
for d in data:
e = modpow(d, key[0], key[1])
e_data.append(e)
return e_data

## 加密和解密的邏輯完全一樣
decrypt_data = encrypt_data

這里面用到了 modpow 函數(shù),它用來計算公式 b^e % n = r 的。

  • 如果是加密過程,那么 b 是明文,(n,e)為公鑰,r 為密文。
  • 如果是解密過程,那么 b 是密文,(n,d)為私鑰,r 為名文。

modpow 的定義如下:

def modpow(b, e, n):
# find length of e in bits
tst = 1
siz = 0
while e >= tst:
tst <<= 1
siz += 1
siz -= 1
# calculate the result
r = 1
for i in range(siz, -1, -1):
r = (r * r) % n
if (e >> i) & 1: r = (r * b) % n
return r

3、隨機質(zhì)數(shù)的生成函數(shù)

隨機質(zhì)數(shù)的生成函數(shù),其中用到了矩陣乘法和斐波那契數(shù)列,可見數(shù)學(xué)對于算法的重要性。

# matrix multiplication
def sqmatrixmul(m1, m2, w, mod):
mr = [[0 for j in range(w)] for i in range(w)]
for i in range(w):
for j in range(w):
for k in range(w):
mr[i][j] = (mr[i][j] + m1[i][k] * m2[k][j]) % mod
return mr

# fibonacci calculator
def fib(x, mod):
if x < 3: return 1
x -= 2
# find length of e in bits
tst = 1
siz = 0
while x >= tst:
tst <<= 1
siz += 1
siz -= 1
# calculate the matrix
fm = [
# function matrix
[0, 1],
[1, 1]
]
rm = [
# result matrix
# (identity)
[1, 0],
[0, 1]
]
for i in range(siz, -1, -1):
rm = sqmatrixmul(rm, rm, 2, mod)
if (x >> i) & 1:
rm = sqmatrixmul(rm, fm, 2, mod)

# second row of resulting vector is result
return (rm[1][0] + rm[1][1]) % mod

def genprime(siz):
while True:
num = (1 << (siz - 1)) + secrets.randbits(siz - 1) - 10;
# num must be 3 or 7 (mod 10)
num -= num % 10
num += 3 # 3 (mod 10)
# heuristic test
if modpow(2, num - 1, num) == 1 and fib(num + 1, num) == 0:
return num
num += 5 # 7 (mod 10)
# heuristic test
if modpow(2, num - 1, num) == 1 and fib(num + 1, num) == 0:
return num

4、eucalg 函數(shù)的實現(xiàn)

函數(shù)的本質(zhì)在于求下面二元一次方程的解:

e * x - lambda_n * y =1

具體代碼:

def eucalg(a, b):
# make a the bigger one and b the lesser one
swapped = False
if a < b:
a, b = b, a
swapped = True
# ca and cb store current a and b in form of
# coefficients with initial a and b
# a' = ca[0] * a + ca[1] * b
# b' = cb[0] * a + cb[1] * b
ca = (1, 0)
cb = (0, 1)
while b != 0:
# k denotes how many times number b
# can be substracted from a
k = a // b
# swap a and b so b is always the lesser one
a, b, ca, cb = b, a-b*k, cb, (ca[0]-k*cb[0], ca[1]-k*cb[1])
if swapped:
return (ca[1], ca[0])
else:
return ca

5、測試

test.py 腳本使用方法:

1)、生成密鑰

python test.py make-keys rsakey

公鑰保存在 rsakey.pub 中, 私鑰保存在 rsakey.priv 中

2)、對文件內(nèi)容加密

假如有文件 明文.txt:

python test.py encrypt 明文.txt from rsakey to 密文.txt

將生成 密文.txt

3、 對文件內(nèi)容解密

假如有文件 密文.txt:

python test.py decrypt 密文.txt as rsakey to 解密后.txt

將生成 解密后.txt

最后的話

本文分享了 RSA 算法的 Python 的簡單實現(xiàn),可以幫助理解 RSA 算法。


網(wǎng)頁題目:用Python來實現(xiàn)RSA加解密
轉(zhuǎn)載注明:http://www.dlmjj.cn/article/djpssei.html