仿射密碼加解密(python實現)

2021-10-06 10:40:44 字數 2581 閱讀 4971

仿射密碼是一種替換密碼。它是利用加密函式乙個字母對乙個字母的加密。

加密函式是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....