c语言编写hill密码

作者&投稿:易府 (若有异议请与网页底部的电邮联系)
c语言怎么编写hill密码?~

// 希尔算法的加密与解密
#include
#include
#include
#include
#include // nDime为全部变量,可逆矩阵的维数
int nDime;
int index = 0;// MAXN为明文的最大长度
const int MAXN = 256;// 矩阵相乘,a是一个列为1的矩阵
void MultiplyMatrix(int a[], int b[][10], int *text)
{
int i, j, t; for (i = 0; i < nDime; i++)
{
t = 0;
for (j = 0;j < nDime; j++)
t += b[i][j] * a[j];
text[index++] = t;
}
}// 求行列式的值
int determinant(int m[][10], int size)
{
int row, column;
int temp1[10], temp2[10], t; for (column = 0; column < size; column++)
{
temp1[column] = m[0][column];
temp2[column] = m[0][column];
}
for (row = 1; row < size; row++)
{
for (column = 0; column < size; column++)
{
int diff = column - row;
int sum = column + row;
if (diff < 0)
diff += size;
if (sum >= size)
sum %= size;
temp1[diff] *= m[row][column];
temp2[sum] *= m[row][column];
}
}
t = 0;
for (row = 0; row < size; row++)
t += temp1[row] - temp2[row]; return t;
}// 求矩阵中某一元素的代数余子式
int func(int matrix[][10], const int i, const int j)
{
int row, column, m, n;
int NewMatrix[10][10]; m = n = 0;
for (row = 0; row < nDime; row++)
{
if (i == row)
continue;
for (column = 0; column < nDime; column++)
{
if (j == column)
continue;
NewMatrix[m++][n++] = matrix[row][column];
}
}

printf ("New Array:
");
for (row = 0; row < nDime - 1; row++)
{
for (column = 0; column < nDime - 1; column++)
printf("%d ", NewMatrix[row][column]);
printf("
");
} int sign = (!((i + j) % 2)) ? 1 : -1;
return sign * determinant(NewMatrix, nDime - 1);
}// 对矩阵求逆,cm矩阵与m矩阵互逆
void ConverseMatrix(int m[][10], int cm[][10])
{
// 矩阵求逆,利用数学公式A(逆)= (1 / |A|)乘以A*
// 其中,|A|表示行列式A的值,而A*表示矩阵A的伴随矩阵
int row, column;
int StarMat[10][10]; // StarMat表示m的伴随矩阵
int t; // 初始化伴随矩阵
for (row = 0; row < 10; row++)
for (column = 0; column < 10; column++)
StarMat[row][column] = 0; // 求伴随矩阵
for (row = 0; row < nDime; row++)
for (column = 0; column < nDime; column++)
{
StarMat[row][column] = func(m, row, column);
printf("伴随矩阵:%d", StarMat[row][column]);
} // 求行列式的值
t = determinant(m, nDime); // 求出逆向矩阵
for (row = 0; row < nDime; row++)
for (column = 0; column < nDime; column++)
cm[row][column] = StarMat[row][column] / t;
// 输出逆向矩阵
for (row = 0; row < nDime; row++)
for (column = 0; column < nDime; column++)
printf("%d ", cm[row][column]);
printf("
");
}// 希尔加密及解密算法
void ShellPassword(int *OText, int TextLen, int matrix[][10], int *text)
{
int i, j, n, a[10];

// 判断要将OText分成几部分
n = TextLen / nDime;
if (TextLen % nDime)
n++; // 矩阵相乘
// 将OText分成的几部分分别与matrix矩阵相乘
for (i = 0; i < n; i++)
{
for (j = 0; j < 10; j++)
a[j] = 0;
for (j = 0; j < nDime; j++)
a[j] = OText[i * nDime + j];
MultiplyMatrix(a, matrix, text);
}
}
int main(void)
{
int i, temp, row, column;
// matrix存放加密或解密矩阵,Password为加密后的结果
// OText存放原文转换为普通数字,如A~1,Z~26
int matrix[10][10], ConMatrix[10][10], OText[MAXN], Password[MAXN], OriText[MAXN];
char text[MAXN];
char sel; printf("=================================================
");
putchar('
');
printf(" SHELL加密解密器
");
putchar('
');
printf("=================================================
"); while (1)
{
// 初始化矩阵
for (row = 0; row < 10; row++)
for (column = 0; column < 10; column++)
matrix[row][column] = 0; putchar('
');
printf("1.加密
");
printf("2.解密
");
printf("0.退出
");
printf("请输入你的选择:
");
sel = getche(); switch (sel)
{
case '1':
printf("
请输入原文:
");
memset(text, '\0', sizeof(text) / sizeof(char));
memset(Password, 0, sizeof(Password) / sizeof(int));
gets(text); printf("输入加密矩阵的维数,维数不能超过10维:
");
scanf("%d", &nDime);
printf("输入矩阵,该矩阵必须为可逆矩阵,否则将不能进行解密:
");
// 可逆矩阵即,设A为n阶矩阵,如果存n在阶矩阵B使得AB=BA=1
// 则矩阵A是可逆的,称B是A的逆矩阵
for (row = 0; row < nDime; row++)
for (column = 0; column < nDime; column++)
scanf("%d", &matrix[row][column]);
// 将小写字母转换为大写字母
for (i = 0; text[i] != '\0'; i++)
if (islower(text[i]))
text[i] |= 0x20;
// OText存放将字母转换为相应数,如A~1,Z~26
for (i = 0; i < MAXN; i++)
OText[i] = 0;
for (i = 0; text[i] != '\0'; i++)
OText[i] = text[i] - 'A' + 1;
// 加密
ShellPassword(OText, strlen(text), matrix, Password);
// 将加密后的内容打印出来
printf("加密后的内容为:
");
for (i = 0; i < strlen(text); i++)
printf("%d ", Password[i]);
putchar('
');
break;
case '2':
break;
case '0':
return 0;
default:
break;
}
getchar();
} return 0;
} 译码算法我会在明天上传上来,你的加密密钥是一个三阶的数组,密文C是:1729 2514 811 1659 2472 858 1739 2514 849 1902 2736 905 1659 2472 858

#include "stdio.h"
int* set(void);
int* set(void)
{
int i;
static a[4];
printf("请输入要设置的4位密码 :");
for(i=0;i<4;i++)
{
scanf("%d",&a[i]);
}
return a;
}

int main()
{
int i,*a,b[4];
a=set();
printf("请输入4位密码 :");
for(i=0;i<4;i++)
{
scanf("%d",&b[i]);
}
i=0;
while(i<4)
{
if(a[i]==b[i])
{
printf("%d",a[i]);
i++;
}
else
{
break;
}
}
if(i==4)
{
printf("密码正确
");
}
else
{
printf("密码错误
");
}
return 0;

}

花了些时间写的,希望对你有帮助~

#include<stdio.h>
#define N 3 //可加密的字符串长度

char plaintext[N]=; //明文,输入时输入字符,参与运算时强制转换成整数
int ciphertext[N]=; //密文,保存成整数,输出时强制转换成字符
int key[N][N]; //密钥矩阵

void getPlainText() //获得明文字符串
{
printf("请输入明文:");
scanf("%s",plaintext);
printf("\n");
}

void getKey() //输入密钥矩阵
{
int i,j;
printf("请输入加密矩阵:\n");
for(i=0;i<N;i++)
for(j=0;j<N;j++)
scanf("%d",&key[i][j]);
printf("\n");

}

void hill() //Hill加密算法
{
int i,j;
for(i=0;i<N;i++){ //矩阵的乘法
for(j=0;j<N;j++){ //计算转换依据,0~25对应a~z
ciphertext[i]+=key[i][j]*(int)(plaintext[j]-'a');
ciphertext[i]%=26;
}
}
printf("\n");
}

void printCipherText() //输出加密后的密文
{
int i;
printf("加密后的密文是:");
for(i=0;i<N;i++) //把参与计算后是整数强制转换成对应的字符
printf("%c",(char)(ciphertext[i]+'a'));
printf("\n");

}

void main()
{
getPlainText(); //明文
getKey(); //密钥
hill(); //加密
printCipherText(); //密文
}


m=2的Hill密码求加密解密矩阵求计算过程
去看看矩阵的乘法运算,就清楚了。很简单的乘法运算

发明了希尔密码的是谁
由Lester S. Hill在1929年发明。每个字母当作26进制数字:A=0, B=1, C=2... 一串字母当成n维向量,跟一个n×n的矩阵相乘,再将得出的结果模26。(注意用作加密的矩阵(即密匙)在 必须是可逆的,否则就不可能解码。只有矩阵的行列式和26互质,才是可逆的。)例子:用希尔密码对明文串 x = ...

2019年高级表白密码套路对话
12. 希尔密码(Hill 密钥矩阵{3,2;5,7}):ungjae 13. 纳粹Enigma(密钥ABC):YAPOJ R 14. 摩斯电码:·· ·—·· ——— ···— · ··—15. 棋盘密码(波利比奥斯密码\/Polybius):gd ag df ff xf gg 16. 棋盘密码(数字):14 14 23 33 53 44 17. ADFGX密码(密钥love):gfg ...

...编写单表密码,多表密码及维吉尼亚密码和hill2密码程序?急。。。_百...
直接用C++啊多给力

"PARKHILL"代表什么?
PARKHILL,全称为 "High Frequency Cryptological Device",是一个常用于表示高频密码装置的英文缩写。这个缩写在英语中代表着一种专门用于处理高频加密信息的设备。中文拼音为 "gāo pín mì mǎ zhuāng zhì",它主要应用于政府和军事领域,因其高效和保密性而受到关注。该缩写词的流行度反映了其在...

hill是什么意思
hill n. 小山;丘陵;斜坡;山冈 网络释义专业释义英英释义小山HAPPY老师教英语 ...plain 平原 hill 小山,山岗 rock 岩石 ...丘陵四级词汇2 ...highway n.公路;大路hill n.小山,山岗;丘陵hillside n.(小山)山腰,山坡 ...短语 Sunrise HILL旭日之丘;冷酷到底;朝阳之丘;最新专辑 Parliame...

hilltone是什么密码???
默认用户名:hillstone密码:hillstonehillstone-secure-connect是希尔斯通安全连接,Hillstone一直专注于网络安全领域前沿技术的研发,以“为用户打造高可靠的安全网络”为使命,秉承“客户第一、包容坦诚、诚信务实、团队协作、主动承担、精益求精”的价值观,致力于为广大用户提供安全、可靠、便利的网络安全解决方案...

密在文言文的意思是什么意思
1. "密"和"败"在文言文中的意思 ◎ 【密】【 mì】〈名〉(1) (形声。 从山,宓( mì)声。本义:形状象堂屋的山)(2) 同本义(意思是山多) [hill resembling a hall] 密,山如堂者。 ——《说文》松柏之鼠,不知堂密之有美枞。——《尸子》(3) 隐蔽的地方 [concealed place] 不窥密。 ——《...

替换式密码的表格式替换加密
在表格式替换密码中,明文不再单独替换某个字母,而是一次过替换较大的字母单元(通常为一对字母)。第一个优点是频率分布比单个字母时更平坦(虽然实际上并不平坦,因为在日常语言中,“TH”就远远比“XQ”常见)。其次,其产生的大量的符号,相应地需要更多的密文来进行高效的字母频率分析。为了替换每...

Hillfuller发速密增发纤维的原理是什么?为什么几十秒钟就能让头发如此...
HILLFULLER发速密是由植物纤维和角蛋白衍生物加工而成,不伤头皮,不阻塞毛孔。藉由静电效应跟头发以及头皮紧密地结合,使细瘦、稀薄的头发、头皮附着无数的纤维细发,在视觉上能使原本细瘦、稀薄的头发变粗变浓密的效果。头发稀少的区域看起来像立即长了新生的头发。即使在很近的距离内也不会被发觉和...

福清市14725701614: c语言编写hill密码 -
戊言舒肝: 花了些时间写的,希望对你有帮助~#include<stdio.h> #define N 3 //可加密的字符串长度char plaintext[N]=; //明文,输入时输入字符,参与运算时强制转换成整数 int ciphertext[N]=; //密文,保存成整数,输出时强制转换成字符 int key[N][N]; //...

福清市14725701614: 如何使用C语言编程实现凯撒密码、维吉尼亚密码、Hill密码?
戊言舒肝: ......,了解算法,之后直接写

福清市14725701614: 用C++编写通用的Hill密码软件 -
戊言舒肝: 使用STL容器即可!std::vector<你要的数组元素类型> 即可满足你所有要求~ 另外计算的时候建议用STL算法~会快很多的~不要再被C++的默认数组迷惑了~

福清市14725701614: 怎么用C编写一个学生信息管理系统的密码部分? 注意:不能用C++ -
戊言舒肝: 密码部分分为两个过程,存储和验证.分别实现就对了,简单点就用普通的文本文档来存储用户名和密码.这样就转变成了文本文档的读取和写入操作了.自己去做吧

福清市14725701614: C语言字符串加密 多实例 -
戊言舒肝: string i; int k; cin>>i>>k; for (int q=0;q<i.length();q++) { if (i[q]>='a'&& i[q]<='z') i[q]=char((i[q]-'a'+k)%26+'a'); else if (i[q]>='A'&&i[q]<='Z') i[q]=char((i[q]-'A'+k)%26+'A'); }

福清市14725701614: 如何用C语言编写密码程序 -
戊言舒肝: 1、用一个字符数组来存密码 再用一个字符数组接收你的输入,然后用strcmp 来比较,如果返回0则密码是正确的 2、例程: 1 2 3 4 5 6 7 8 9 10 11 12 13 14#include "stdio.h" #include "string.h" intmain() {charmima[100]="YuanShi888";charinput[100]={0};printf("请输入密码:");gets(input);if(strcmp(mima,input)==0)printf("恭喜你,密码正确!\n");elseprintf("对不起,密码输入错误!\n");}

福清市14725701614: c语言 凯撒密码 -
戊言舒肝: #include<stdio.h> #define M 80 int main(void) { char ch,ca[M]; int i=0; while(ch=getchar()) { if(ch=='\n') { for(int j=0; j<i; j++) printf("%c",ca[j]); printf("\n"); break; } if((ch >= 'A' && ch <= 'U') || (ch >= 'a' && ch <= 'u')) { ch+=5; ca[i] = ch; } else if((ch > ...

福清市14725701614: 凯撒密码怎么用C语言编,急救!!!附加解释,谢谢 -
戊言舒肝: 凯撒加密是最简单的加密,就是 把字符移动n位, 例如 :移动1位时,a就用b表示,f用e表示.#includeint main(void) { char buf[] = "hello"; int i = 0; printf("before: %s\n", buf); while (buf[i]) buf[i++] += 1; // 移1位,a 变b printf("after: %s\n", buf); return 0; }

福清市14725701614: 用C语言程序编写用户名密码 程序 -
戊言舒肝: #include<stdio.h> #include<string.h> void main() {int i,flag1,flag2;char name[20]="lushan",password[10]="123456";char person[20],password1[10];for(i=0;i!=3;){printf("Please input the name:\n");gets(person);flag1=strcmp(person,...

福清市14725701614: 谁知道希尔密码的c源代码?
戊言舒肝: 源代码还真不知道,也学习了一下原理:希尔密码是运用基本矩阵论原理的替换密码,由Lester S. Hill在1929年发明. 每个字母当作26进制数字:A=0, B=1, C=2... 一串字母当成n维向量,跟一个n*n的矩阵相乘,再将得出的结果模26. 注意用作加密的矩阵(即密匙)在<math>\mathbb_^n</math>必须是可逆的,否则就不可能译码.只有矩阵的行列式和26互质,才是可逆的.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网