仿射密码算法实现(C语言以及Python实现)

仿射变换:

加密

解密

其中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.  加密

加密运算即为:

此处加密时应该对输入的字符进行判断,具体判断方法如下:

	while (ch != EOF)//ch为读取文件内容的指针
	{
		if (ch >= 65 && ch <= 90)//判断字符是否介于
		{
			re = (char)(((a*(ch - 65) + b) % N) + 65);
			fputc(re, res);
		}
		if (ch >= 97 && ch <= 122)//判断字符是否介于
		{
			re = (char)(((a*(ch - 97) + b) % N) + 65);
			fputc(re, res);
		}
		else
			putc(ch, res);//若不是字母则不加处理
		ch = getc(fp);
	}

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)

 加密及解密实例结果截图:

仿射密码算法实现(C语言以及Python实现)_第1张图片

你可能感兴趣的:(密码学)