仿射加密

仿射加密

最简单的加密方式之一。
P = C = K = Z 26 P=C=K=\textbf{Z}_{26} P=C=K=Z26 0 ≤ K ≤ 25 0\le K\le 25 0K25任意 x , y ∈ Z 26 x,y\in \textbf{Z}_{26} x,yZ26定义 e ( x ) = ( a x + b ) m o d    26 e(x)=(ax+b)\mod 26 e(x)=(ax+b)mod26、定义 d ( y ) = a − 1 ( y − b ) m o d    26 d(y)=a^{-1}(y-b)\mod 26 d(y)=a1(yb)mod26,其中 a − 1 a^{-1} a1 a a a Z 26 \textbf{Z}_{26} Z26上的乘法逆。对任意的 x ∈ Z 26 x\in \textbf{Z}_{26} xZ26 d K ( e ( x ) ) = x d_K(e(x))=x dK(e(x))=x a a a必需和 26 26 26互质。

代码

python3
输入b和a值之后输入待加密字符串敲回车即可看到加密和解密结果。待加密字符串不区分大小写。b如果不与26互质则需要重输。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
START = ord('a')
CHAR_COUNT = 26
print('input \'b\':')
OFFSET = int(input()) % CHAR_COUNT
def gcd(m, n):
    return max(abs(n), abs(m)) if n*m == 0 else gcd(abs(n), abs(m) % abs(n))
def set_factor(v):
    return set_factor(int(input()) % CHAR_COUNT) if gcd(v, CHAR_COUNT) != 1 else v
print('input \'a\':')
FACTOR = set_factor(int(input()) % CHAR_COUNT)
print('input str:')
MAP = {
    
    chr(v+START-1): chr(((FACTOR*v+OFFSET) % CHAR_COUNT)+START) for v in range(1, CHAR_COUNT+1)}
def encrypt(str):  # 加密
    return ''.join([MAP[char] if char in MAP else char for char in str.lower()])
def decrypt(str):  # 解密
    return ''.join([list(MAP.keys())[list(MAP.values()).index(char)] if char in MAP.values() else char for char in str.lower()])
v = input()
print('\033[31m', 'encrypt: ', encrypt(v), '\033[0m', '\033[35m', '\t decrypt: ', decrypt(encrypt(v)), '\033[0m')

运行结果

input 'b':
3
input 'a':
14
15
input str:
abcdefghijklmnopqrstuvwxyz
 encrypt:  shwlapetixmbqfujyncrgvkzod            decrypt:  abcdefghijklmnopqrstuvwxyz 

猜你喜欢

转载自blog.csdn.net/dscn15848078969/article/details/114682221