仿射密码

仿射变换:
加密:
解密:
其中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的模逆过程如下:
仿射密码_第1张图片
仿射密码_第2张图片

  1. 加密
    (1)根据fangshe1.txt文件中的明文将大写英文和小写英文字母转换成模26的数字,再根据加密公式计算出密文并模26打印出数字所对应的ascii码为密文

仿射密码_第3张图片
3. 解密
与加密类似 欧几里得算法计算出参数a的模逆后根据解密公式计算密文对应的明文并打印
仿射密码_第4张图片

九、实验数据及结果分析:
(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);

}

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