素數生成
大素數生成方案選擇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...