仿射密碼的加密與解密


原理

代換密碼的另一個特殊情形是仿射密碼,它的加密函數定義為 e(x)=(ax+b)mod 26,其中a,b∈Z26 —— 因為這樣的函數被稱為仿射函數,所以這的密碼體制也被稱為仿射密碼(當a=1時,正好是移位密碼)。

為了能對密文進行解密,必須保證所選用的仿射函數是一個單射函數,則對於任意的y∈Z26,同余方程ax+b≡y(mod 26)有唯一解x,並且等價於ax≡y-b(mod 26)。當y遍歷Z26時,y-b也遍歷Z26,故同余方程有唯一解的充要條件是gcd(a,26)=1。

單射:設f是由集合A到集合B的映射,如果所有x,y∈A,且x≠y,都有f(x)≠f(y),則稱f為由A到B的單射 —— 百度百科

gcd:最大公約數

乘法逆:設a∈Zm,若存在a'∈Zm,使得aa'≡a'a≡1(mod m),則a'稱為a在上的乘法逆,將其記為a-1mod m。在m是固定的情形下,也可將其簡記為a-1

常見格式

仿射密碼是一種表單代換密碼,字母表的每個字母相應的值使用一個簡單的數學函數對應一個數值,再把對應數值轉換成字母。

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
加密函數:E(x) = (ax + b) (mod m),其中 a與b互質,其中 a與m互質,m是編碼系統中字母的個數(通常都是26)。

解密函數:D(x) = (a'x - b) (mod m),其中 a'是 a 在群的乘法逆元。

加解密算法

def enc(a, b, e):
c = []
for i in e:
temp = ((ord(i) - 97) * a + b) % 26 + 97 
c.append(chr(temp))
print(''.join(c).upper())


# 遍歷得到a的乘法逆元
def get_are(a):
for i in range(1, 27):
if a * i % 26 == 1:
return i


# 解密
def dec(a, b, d):
a_re = get_are(a)
p = []
for i in d:
temp = (((ord(i) - 97) - b) * a_re) % 26 + 97
p.append(chr(temp))
print(''.join(p).upper())

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM