資源簡介
壓縮包內有一個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語言\
評論
共有 條評論