RSA演算法實現以及一些坑

2021-09-29 12:25:59 字數 2421 閱讀 1167

素數生成

大素數生成方案選擇miller-rabin檢測,可以參考這篇文章:

1.首先將輸入的字元轉為16進製制數

def

mess2long

(message)

: message_byte =

bytes

(message,encoding=

"utf-8"

) num =

int(binascii.b2a_hex(message_byte),16

)return num

2.計算素數

#開始選擇p q

defrandom_prime

(half_len)

:while

true

: n = random.randint(0,

1<< half_len)

#求2^half_len之間的大數

if n %2!=

0:found =

true

# 隨機性測試

for i in

range(0

,5):

#5的時候錯誤率已經小於千分之一

if prime_test(n)

==false

: found =

false

break

if found ==

true

:return n

#miller-rabin

defprime_test

(n):

""" 測試n是否為素數

"""q = n -

1 k =

0# 尋找k,q 是否滿足2^k*q =n - 1

while q %2==

0:k +=

1 q = q //

2 a = random.randint(

2, n -2)

# 如果 a^q mod n= 1, n 可能是乙個素數

if fast_mod(a, q, n)==1

:return

true

# 如果存在j滿足 a ^ ((2 ^ j) * q) mod n == n-1, n 可能是乙個素數

for j in

range(0

, k)

:if fast_mod(a,(2

** j)

* q, n)

== n -1:

return

true

# n 不是素數

return

false

3.生成n e d

def

generate_key

(key_len)

:#key_len要比訊息長度大

""" 生成n, e, d

"""p = random_prime(key_len //2)

q = random_prime(key_len //2)

n = p * q

ph_n =

(p -1)

*(q -1)

print

("ph_n:"

+str

(ph_n)

) e =

65537

#e取固定值

d = generate_d(ph_n, e)

return

(n ,e, d)

4.進行加密 / 解密

def

fast_mod

(b, n, m)

:"""

快速冪"""

ret =

1 tmp = b

while n:

if n &

0x1:

ret = ret * tmp % m

tmp = tmp * tmp % m

n >>=1

return ret

全部**附上github

一些坑

#實現讀小端序顯示十六進製制

#way1 通過binascii包下方法

x=binascii.b2a_hex(

str)

print

(x.decode())

#way2 使用int.from_bytes()轉為int

y =int

.from_bytes(

str,byteorder=

'little'

,signed=

'false'

)print

(hex

(y))

參考

記事本 C 實現 以及一些細節

專案效果 開啟檔案,儲存檔案 開啟 private void toolstripmenuitem3 click object sender,eventargs e 儲存 private void toolstripmenuitem4 click object sender,eventargs e 另...

一些常用演算法實現

cstring newguid cstring getdatestr2 ctime t 獲取當前日期的字串 cstring getdatestr 判斷是否數字,這裡指不包含負號的數字 int isnum const cstring str if ch 0 ch 9 數字 continue retur...

mysql解壓版安裝教程以及一些坑

配置mysql環境變數 在mysql目錄下新建my.ini,內容如下 mysql 設定mysql客戶端預設字符集 default character set utf8 mysqld 設定3306埠 port 3306 設定mysql的安裝目錄 basedir g mysql 8.0.16 winx6...