加密變換:e(x)=ax + b (mod m)
解密變換:d(x)=a-1(x-b) (mod m)
m=36 (其中包括26個字母(a到z)和10個數字(0到9))
ascii碼:
a~z 97~122
0~9 48~57
替換表:01
2345
6789
1011
1213
1415
1617
<-xab
cdef
ghij
klmn
opqr
1819
2021
2223
2425
2627
2829
3031
3233
3435
<-xst
uvwx
yz01
2345
6789
基本思路:將輸入字元的ascii碼轉換為替換表中對應的序號x,帶入上述加解密變換公式,計算出後的值再轉化為對應的ascii碼,最後輸出結果。
a=
int(
input
("輸入a:"))
b=int
(input
("輸入b:"))
dic =
#dic a的逆元,a與36互素
defencrypt()
: m=
input
("請輸入明文:"
) k=m.lower(
) l=
list
(k) s=l
t=for i in
range
(len
(l)):if
97<=
ord(l[i]
)<=
122:
#如果明文是字母,則執行如下操作
t[i]=(
(ord
(l[i])-
97)*a+b)%36
#計算出密文對應置換表裡的序號if0
<=t[i]
<=25:
s[i]
=chr
(t[i]+97
)#如果序號在0~25,則直接置換為字母
elif
26<=t[i]
<=35:
s[i]
=chr
(t[i]+22
)#如果序號在26~35,則置換為數字
elif
48<=
ord(l[i]
)<=57:
#如果明文是數字,則執行如下操作
t[i]=(
(ord
(l[i])-
48+26)
*a+b)%36
if0<=t[i]
<=25:
s[i]
=chr
(t[i]+97
)#如果序號在0~25,則直接置換為字母
elif
26<=t[i]
<=35:
s[i]
=chr
(t[i]+22
)#如果序號在26~35,則置換為數字
print
("結果為:"+""
.join(s)
)def
decrypt()
: c=
input
("請輸入密文:"
) k=c.lower(
) l=
list
(k) s=l
t=for i in
range
(len
(l)):if
97<=
ord(l[i]
)<=
122:
t[i]
=(dic[a]*(
ord(l[i])-
97)-(dic[a]
*b))%36
if0<=t[i]
<=25:
s[i]
=chr
(t[i]+97
)#如果序號在0~25,則直接置換為字母
elif
26<=t[i]
<=35:
s[i]
=chr
(t[i]+22
)#如果序號在26~35,則置換為數字
elif
26<=
ord(l[i]
)<=57:
t[i]
=(dic[a]*(
ord(l[i])-
48+26)
-(dic[a]
*b)%36)
%36if0
<=t[i]
<=25:
s[i]
=chr
(t[i]+97
)#如果序號在0~25,則直接置換為字母
elif
26<=t[i]
<=35:
s[i]
=chr
(t[i]+22
)#如果序號在26~35,則置換為數字
print
("結果為:"+""
.join(s)
)while
true
: encrypt(
) decrypt(
)
仿射密碼加解密(python實現)
仿射密碼是一種替換密碼。它是利用加密函式乙個字母對乙個字母的加密。加密函式是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 ...
770 仿射密碼 暴力列舉
時間限制 1000 ms 記憶體限制 65535 kb 難度 1 描述 仿射密碼是替換密碼的另乙個特例,可以看做是移位密碼和乘數密碼的結合。其加密變換如下 e m k1 m k2 mod q 其中k1,k2為金鑰,且0現已知一經過仿射加密的密文和金鑰,請破譯出它的明文。輸入 輸入包含不超過1000組...
仿射密碼解析與例項
仿射密碼的加密函式是 e x ax b modm 其中 解密函式是 d x a 1 x b modm 其中 a 1 是 a 在 zm群的乘法逆元。下面我們以 e x 5x 8 mod26函式為例子進行介紹,加密字串為affine cipher,這裡我們直接採用字母表26個字母作為編碼系統 其對應的加...