仿射变换:
加密:
解密:
其中a, b为密钥,
,且gcd(a, 26)=1
1.参数选取与密钥生成
首先让用户自行输入a,b的值。
判断a与N是否互素。(欧几里得算法)
利用a与N求得a的模逆aa。(扩展欧几里得算法)
printf("please input a and b(divide with \",\"):");
scanf("%d,%d", &a, &b);
int gcd(int a, int b) {
return b ? gcd(b, a%b) : a;//求两数的最大公约数
}
//求a模N=26的逆
int exgcd(int a, int n) {
int p = a, q = n;
int x = 0, y = 1;
int z = q / p;
while (p != 1 && q != 1) {
int t = p;
p = q % p;
q = t;
t = y;
y = x - y * z;
x = t;
z = q / p;
}
y %= n;
if (y < 0) y += n;
return y;
}
2.加密
加密运算即为:
此处加密时应该对输入的字符进行判断,具体判断方法如下:
3.解密
解密运算即为:
while (re != EOF)
{
if (re >= 65 && re <= 90)
{
d = (char)(((aa*((re - 65) - b)+N) % N) + 65);
fputc(d, de);
}
if (re >= 97 && re <= 122)
{
d = (char)(((aa*((re - 97) - b)+N) % N) + 65);
fputc(d, de);
}
else
putc(re, de);
re = getc(res);
}
实验参考代码:
C语言:
再过一段时间上传,关键代码都在上边了。
python代码:
from Crypto.Util.number import inverse
with open("cleartext.txt", 'r') as fp:
clear = fp.read()
clear = clear[:-1:]
print(clear)
a = int(input("Input a:"))
b = int(input("Input b:"))
cipher = ''.join([chr((a*(ord(each) - ord('a')) + b)%26+ord('a')) for each in clear])
a_inv = inverse(a,26)
decode = ''.join([chr((a_inv*(ord(each) - ord('a') - b))% 26 + ord('a')) for each in cipher])
print(cipher)
print(decode)
加密及解密实例结果截图: