资源简介
压缩包内有一个C语言代码,实现密码算法的加密解密,还有两个文本文档,是代码实现过程中的输入与输出文档。多表代换与Hill2密码算法类似,这里是3阶的,基于C语言实现 密钥矩阵随机生成、加密、解密
代码片段和文件信息
#include
#include
#include
#include
#include
#define M 3 //定义一下三阶矩阵
int gcd(int a int b){
return b==0?a : gcd(b a%b);
}
int main()
{
FILE *fp;
FILE *fp1;
int ijdetinvdetlenflaglen1=0;
int A[M][M]={0}comA[M][M]={0}invA[M][M]={0}B[M]={0}tran1[10000]={0}T1[3]={0}cip[3]={0}s[10000]={0};
int msg[3]={0}mes[10000]={0}x[3]={0};
int T2[3]={0}tran2[10000]={0};
char pla[10000]={‘\0‘}; //明文
char ciph[10000]={‘\0‘}; //密文
char plas[10000]={‘\0‘}; //对密文解密后的明文
//产生满足条件的随机三阶矩阵A
srand(time(0));
do{
for(i=0;i for(j=0;j A[i][j]=rand()%26;
}
}
det = -1;
for(i=1; det < 0; i++)
{
det = ((A[0][0]*A[1][1]*A[2][2]+A[1][0]*A[2][1]*A[0][2]+A[0][1]*A[1][2]*A[2][0]-A[0][2]*A[1][1]*A[2][0]-A[0][0]*A[1][2]*A[2][1]-A[0][1]*A[1][0]*A[2][2]) + 26 * i)%26; //行列式的表达式
}
}while(gcd(det26)!=1||det==0); //行列式必须不等于0并且与26互素
printf(“Encryption matrix A: \n“);
for(i=0;i<3;i++){
for(j=0;j<3;j++){
printf(“%d “A[i][j]);
}
printf(“\n“);
} //输出生成的A矩阵
i = 1;
while(1)
{
if((det * i) % 26 == 1)
{
invdet = i;
break;
}
else
{
i++;
}
} //求三阶矩阵A的行列式的逆元为invdet
//以下为求A的伴随矩阵
comA[0][0] = (A[1][1] * A[2][2] - A[2][1] * A[1][2]);
comA[1][0] = -(A[1][0] * A[2][2] - A[1][2] * A[2][0]);
comA[2][0] = (A[1][0] * A[2][1] - A[1][1] * A[2][0]);
comA[0][1] = -(A[0][1] * A[2][2] - A[0][2] * A[2][1]);
comA[1][1] = (A[0][0] * A[2][2] - A[0][2] * A[2][0]);
comA[2][1] = -(A[0][0] * A[2][1] - A[0][1] * A[2][0]);
comA[0][2] = (A[0][1] * A[1][2] - A[0][2] * A[1][1]);
comA[1][2] = -(A[0][0] * A[1][2] - A[0][2] *A[1][0]);
comA[2][2] = (A[0][0] * A[1][1] - A[0][1] * A[1][0]);
//以下求A的逆矩阵
for (i = 0; i < 3; i++){
for (j = 0; j < 3; j++){
invA[i][j]=invdet*comA[i][j];
invA[i][j] %= 26;
if (invA[i][j] < 0) invA[i][j] += 26;
}
}
//以下生成B矩阵
do{
for (i = 0; i < 3; i++)
{
B[i]=rand()%25;
}
}while(B[1]==0&&B[2]==0&&B[0]==0);
printf(“In this experimentwe use Key B as follows:\n“);
printf(“%d %d %d\n“B[0]B[1]B[2]);
fp = fopen(“plain.txt“ “r“); // r打开只读文件,该文件必须存在plain文件中存放着需要进行加密的字符
i=0;
while(!feof(fp)) //将文件中的字符一个一个读入到char型的pla数组中
{
pla[i]=fgetc(fp);
i++;
}
len=strlen(pla)-1; //使用这样方式读写数组最后一个会多出一个空格,我们在操作中需要丢弃这个空格,所以strlen(pla)-1才是实际的长度
if(len % 3 == 2) //填充
{
pla[len] = ‘a‘;
len = len+1;
flag = 1;
}
if(len % 3 == 1) //填充
{
pla[len] = ‘a‘;
len = len+1;
pla[len] = ‘a‘;
len = len+1;
flag = 2;
}
//加密
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 6689 2018-11-17 10:19 多表代换 加密解密 C语言\MulTabCip.c
文件 12 2018-12-23 12:31 多表代换 加密解密 C语言\output.txt
文件 12 2018-11-20 19:59 多表代换 加密解密 C语言\plain.txt
目录 0 2018-12-23 12:31 多表代换 加密解密 C语言\
相关资源
- DES算法C++实现.rar
- DES文件加密解密系统 密码学课设
- MMX-密码编码学:加密方法的C与C++实现
- 密码学:分组密码DES算法C语言版
- 密码学 模逆与模幂计算与应用 MFC实现
- 用C++模拟集中式密钥分配的过程
- 作业4 RSA和大数因式分解
- 密码学差分密码解密程序实现
- c语言实现国密SM2
- 实现数字签名算法DSA,Hash算法的实现
- 密码学RSA 算法源码及大数运算的实现
- 用C语言实现的的全部的古典密码学算
- AES密码学课程设计带报告
- 用vc++6.0做 的RSA的加密与解密程序
- des差分攻击哦
- 用C语言实现SHA-1算法
- 维吉尼亚加密解密的C语言实现
- C语言实现计算乘法逆元
- C++ DES图像加密与解密
- 密码学快速取模指数算法C代码
- 简单的线性反馈移位寄存器LFSRC语言实
- 仿射加密现代密码学
- C语言实现的文字加密与解密小程序(
- 软件学院密码学实验五
- 软件学院密码学实验四
- 软件学院密码学实验五sha
- 软件学院密码学实验四RSA
- 软件学院密码学实验三RC4
- 密码学MFC实现仿射加密解密超级计算
- 字符串的RSA加密与解密 c语言实现
评论
共有 条评论