仿射密碼是一種替換密碼。它是利用加密函式乙個字母對乙個字母的加密。
加密函式是e(x)= (ax + b) (mod m),其中,a和m互質,m是字符集的大小。
(例如,26即是以26個字母作為編碼,當m是26時,a必須是1,3,5,7,9,11,15,17,19,21,23,25其中之一)
解密函式為d(x) = a-1(x - b) (mod m),其中a-1是a在zm群的乘法逆元。
所謂乘法逆元,定義如下:
群g中任意乙個元素a,都在g中有唯一的逆元a`,具有性質aa` = a`a = e,其中e為群的單位元。例如:
4 * 2 ≡ 1 (mod 7)
中,2即是4的乘法逆元。
要求乘法逆元,在字符集大小不大的情況下,完全可以通過遍歷實現。
另外也可以通過gmpy2庫中的invert函式實現。
在密碼學中,乘法逆元一般是通過拓展歐幾里得演算法求得的。
m = 26,字符集為小寫字母時
'''
仿射密碼
(a,b)
m = 26,字符集為小寫字母
加密函式是e(x)= (ax + b) (mod m)
解密函式為d(x) = (a^-1)(x - b) (mod m),其中a^-1是a的乘法逆元
'''#通過乙個簡單的遍歷得到a的乘法逆元,也可以通過gmpy2庫中的invert函式實現
defget_inverse
(a):
for i in
range(1
,27):
if a*i%
26==1:
return i
#加密def
encipher
(a, b, p)
: c=
for i in p:
temp=((
ord(i)-97
)*a+b)%26
+97chr(temp)
)print(''
.join(c)
)#解密
defdecipher
(a, b, c)
: a_inv = get_inverse(a)
p=for i in c:
temp=((
(ord
(i)-97)
-b)*a_inv)%26
+97chr(temp)
)print(''
.join(p)
)if __name__ ==
"__main__"
: a =
11 b =
6 message =
'sorcery'
encipher(a,b,message)
#decipher(a,b,message)
m = 52,字符集為小寫和大寫字母時
'''
仿射密碼
m = 52
字符集為小寫和大寫字母
'''import string
defencrypt
(k1,k2,message)
: dic = string.ascii_letters
c =for i in message:
if i.islower():
num =
ord(i)
-ord
('a'
)(num*k1+k2)%52
])elif i.isupper():
num =
ord(i)
-ord
('a')+
26(num*k1+k2)%52
])else
:print(''
.join(c)
)def
decrypt
(k1,k2,message)
:for i in
range(52
):if k1*i%
52==1:
inv = i
break
dic = string.ascii_letters
m =for i in message:
if i.islower():
num =
ord(i)
-ord
('a'
)(num-k2)%52
])elif i.isupper():
num =
ord(i)
-ord
('a')+
26(num-k2)%52
])else
:print(''
.join(m)
)message =
'**exgt idit'
#待加密或解密的訊息
a =5
# key的範圍0~51之間
b =29
# key的範圍0~51之間
# encrypt(a,b,message)
decrypt(a,b,message)
培根密碼加解密(Python)
加密時,明文中的每個字母會根據下面轉換成5個字母 解密時,密文中的每5個字母為一組轉換成對應的1個字母 輸入e或d,選擇加密或解密 if choose e str input input your string n t lower liststr for i in str if i in code ...
摩斯密碼加解密
摩斯密碼又叫莫爾斯電碼,摩斯電碼 著名的sos救難訊號用莫爾斯電碼表示為 滴滴滴嗒嗒嗒滴滴滴 莫斯編碼是一種變長編碼,哈夫曼編碼也是一種變長編碼。莫斯編碼不是哈夫曼編碼,如果字元之間沒有空白,會產生二義性,而哈夫曼編碼不會產生二義性 莫斯編碼不是哈夫曼編碼,字元之間沒有3t,而直接混在一起可能會產生...
比對密碼 加解密
package main import fmt golang.org x crypto bcrypt type user struct func main u0.password pwd 模擬註冊是傳遞的密碼 hash,err bcrypt.generatefrompassword byte u0....