Hill密码
2024-10-12 11:29:28
希尔密码(Hill Password)是运用基本矩阵论原理的替换密码,由Lester S. Hill在1929年发明。每个字母当作26进制数字:A=, B=, C=... 一串字母当成n维向量,跟一个n×n的矩阵相乘,再将得出的结果MOD26。注意用作加密的矩阵(即密匙)在\mathbb_^n必须是可逆的,否则就不可能译码。只有矩阵的行列式和26互质,才是可逆的 #include<stdio.h> #include<string.h> #include<ctype.h> #include<stdlib.h> ][];//转化矩阵 ][];//单位矩阵[A E] ][];//矩阵的逆矩阵A^(-1) ][];//明文矩阵 ][];//密文矩阵 int n;//矩阵的阶数 void input()//输入数据 { int i, j; ; i <= n; i++ ) ; j <= n; j++ ) A[i][j] = rand() % ; memcpy( a, A, sizeof( A ) );//将矩阵A复制给a ; i <= n; i++ )//将矩阵变成[a E]的形式,E为单位矩阵 { ; j <= *n; j++ ) { if( i + n == j ) a[i][j] = ; else a[i][j] = ; } } } void output() //输出函数 { int i,j; printf("矩阵A的元素\n"); ; i <= n; i++ ) { ; j <= n; j++ ){ printf("%d ",A[i][j]); } printf("\n"); } printf("A矩阵的逆矩阵B为\n"); ; i <= n; i++ )//输出A矩阵的逆矩阵B { ; j <= n; j++ ) { B[i][j] = a[i][j+n]; printf("%d ",B[i][j]); } printf("\n"); } } int Extend_Gcd( int a, int b, int &x, int &y )//扩展欧几里得算法 { ) { x = ; y = ; return a; } int r = Extend_Gcd( b, a % b, x, y ); int t = x; x = y; y = t - a / b * y; return r; } int ni( int a)//求逆a*x=1(mod n) { int x, y; , x, y ); ) + ) % ; else ; } int gaosi()//高斯-约当消元求A矩阵的逆矩阵B { int i, j, k; ; k <= n; k++ )//高斯-约当消元 { int Ni = ni( a[k][k] ); ) ; ; i <= * n; i++ ) a[k][i] = ( a[k][i] * Ni % + ) % ; ; i <= n; i++ ) { if( i == k ) continue; ; j <= * n; j++ ) a[i][j] = ( ( a[i][j] - a[i][k] * a[k][j] % ) % + ) % ; } } ; } void jiami() //加密过程 { int i, j, k; ]; char mingc; printf("请输入明文"); scanf("%s",&mingstr); int len = strlen( mingstr ); if( len % n ) { for( i = len; i < len/n*n+n; i++) mingstr[i] = 'a'; mingstr[i] = '\0'; } puts( mingstr ); int Len = strlen( mingstr ); ; i <= Len/n; i++ )//将明文分成len/n段 { ; j <= n; j++ )//求每一段的明文转换为矩阵 { )*n+j-] >= )*n+j-] <= 'z' ) ming[i][j] = mingstr[(i-)*n+j-] - 'a'; else ming[i][j] = mingstr[(i-)*n+j-] - 'A'; } } ; k <= Len/n; k++ )//求len/n段的密文矩阵 { ; i <= n; i++ )//利用矩阵的乘法 { mi[k][i] = ; ; j <= n; j++ ) mi[k][i] = ( mi[k][i] + ming[k][j] * A[j][i] % + ) % ; } } printf("密文为"); ; i <= Len/n; i++ )//输出密文 { ; j <= n; j++ ) { mingc = mi[i][j] + 'A'; printf("%c",mingc); } } printf("\n"); } void jiemi() //解密过程 { int i, j, k; ]; char mingc; printf("请输入密文"); scanf("%s",&mistr); int len = strlen( mistr ); ; i <= len/n; i++ )//将密文分成len/n段 { ; j <= n; j++ )//求每一段的密文转换为矩阵 { )*n+j-] >= )*n+j-] <= 'z' ) mi[i][j] = mistr[(i-)*n+j-] - 'a'; else mi[i][j] = mistr[(i-)*n+j-] - 'A'; } } ; k <= len/n; k++ )//求len/n段的明文矩阵 { ; i <= n; i++ )//利用矩阵的乘法 { ming[k][i] = ; ; j <= n; j++ ) ming[k][i] = ( ming[k][i] + mi[k][j] * B[j][i] % + ) % ; } } printf("明文为"); ; i <= len/n; i++ )//输出明文 { ; j <= n; j++ ) { mingc = ming[i][j] + 'A'; printf("%c",mingc); } } printf("\n"); } int main() { int flag; do{ printf( "1.加密2.解密3.退出\n"); scanf("%d",&flag); ) {printf("请输入加密矩阵的阶数n:"); scanf("%d",&n); do{ input();//数据输入 }while( !gaosi() ); output(); jiami();}//加密过程 ) {jiemi();//解密过程 } &&flag!=&&flag!=) printf("输入错误,请重新输入!\n"); }); ; }
最新文章
- Dexpress 中 grid的使用
- git提交远程仓库命令
- android加固系列—1.如何检验so文件是否加壳成功
- PostgreSQL Reading Ad Writing Files、Execution System Instructions Vul
- 随机(Random)
- 解决在.ashx文件中判断Session 总是NULL的方法
- iOS VideoToolbox硬编H.265(HEVC)H.264(AVC):1 概述
- Entrez检索实例 - NCBI
- (转)提高代码质量---one
- iOS 图片的拉伸,取固定区域显示
- Kitty猫基因编码
- for/range/break/continue
- 通过模拟JDK中的动态代理,由浅入深讲解动态代理思想.
- 初学node遇到的问题(慢慢补充)
- 【bzoj 3110】[Zjoi2013]K大数查询
- 安全工具-cansina
- python基础之 while 逻辑运算符 格式化输出等
- 逆袭之旅.DAY08东软实训.多态~
- 遍历存储所有物体添加到列表中(使用GameObject.activeSelf进行判断)
- Redhat6.8安装Oracle11g下遇到两个问题记录