仿射变换:
加密:
解密:
其中a, b为密钥,,且gcd(a, 26)=1
五、实验目的:
1、熟悉仿射密码算法;
2、理解明文(plaintext)、密文(ciphertext)、加密密钥(encryption key)、解密密钥(decryption key)、加密算法(encryption algorithm)、解密算法(decryption algorithm)。
六、实验内容:
1)用VC++\Python等语言实现仿射变换加/解密算法;
2)加/解密程序对任意满足条件的a、b都能够处理。
七、实验器材(设备、元器件):
学生每人一台PC,安装Windows 7操作系统及VC++\Python开发环境。
八、实验步骤:
1.参数选取与密钥生成
任意输入参数a和b的值要求a和b的范围在0到25中间并且a与26互素。互素才能计算出a基于26的模逆。
密钥的生成采用扩展的欧几里得算法算出a基于26的模逆并显示到屏幕中。结合解密公式根据密文c,a的模逆以及参数b计算出明文m
计算a的模逆过程如下:
3. 解密
与加密类似 欧几里得算法计算出参数a的模逆后根据解密公式计算密文对应的明文并打印
九、实验数据及结果分析:
(1)实验参考代码:
加密:
#include
int main(){
FILE *fp = fopen ("fangshe1.txt", "rt");
FILE *res = fopen("fangshe2.txt", "wt+");
char ch;
char r;
int a, b;
int m = 26;
printf("输入a b的值");
scanf("%d%d",&a,&b);
if(fp == NULL)
printf("Cannot open file\n");
if(res == NULL)
printf("Cannot open file\n");
ch = fgetc(fp);
while(ch != EOF){
if(ch >= 65 && ch <= 90){
r = (char) ((a * (ch-65) + b) % m + 65);
fputc(r, res);
}
else if(ch >= 97 && ch <= 122){
r = (char) ((a * (ch-97) + b) % m + 97);
fputc(r, res);
}
else
fputc(ch ,res);
ch = fgetc(fp);
}
fclose(fp);
fclose(res);
}
解密
#include
int getGcd(int value1, int value2)
{
int gcd = 0; //最大公约数
int divisor = 0; //余数
do //辗转相除法
{
divisor = value1 % value2;
gcd = value2;
value1 = value2;
value2 = divisor;
}while(divisor);
return gcd;
}
void setCoprime(int coprime[], int n)
{
int i = 1;
for (; i < n; i++)
if (1 == getGcd(n, i))//判断是否n,i是否互素
*(coprime++) = i; //将i存入coprime中
}
int get_a(int coprime[], int a, int n)
{
int i = 0;
for (; coprime[i] != 0; i++)
if (1 == (a*coprime[i])%n)
return coprime[i];
return 0;
}
int main(){
FILE *fp = fopen(“fangshe2.txt”, “rt”);
FILE *res = fopen(“fangshe3.txt”, “wt+”);
char ch;
char r;
int a , b ;
int m = 26;
int coprime[32] = {0}; //存放小于n并且与n互素的元素
int _a ; //存放a的模n可逆元
int n=26;
printf("输入a b的值");
scanf("%d %d",&a, &b);
printf("输chua的值 %d",a);
setCoprime(coprime, n);//
_a = get_a(coprime, a, n);//
printf("输出a的模逆:%d",_a);
if(fp == NULL)
printf("Cannot open file\n");
if(res == NULL)
printf("Cannot open file\n");
ch = fgetc(fp);
while(ch != EOF){
if(ch >= 65 && ch <= 90){
r = (char) ((_a * ((ch-65) - b)) % m + 65);
fputc(r, res);
}
else if(ch >= 97 && ch <= 122){
r = (char) ((_a * ((ch-97) - b)) % m + 97);
fputc(r, res);
}
else
fputc(ch ,res);
ch = fgetc(fp);
}
fclose(fp);
fclose(res);
}