導航:首頁 > 文檔加密 > hill密碼加密c

hill密碼加密c

發布時間:2022-08-22 17:20:20

⑴ 希爾密碼的介紹

希爾密碼(Hill Password)是運用基本矩陣論原理的替換密碼,由Lester S. Hill在1929年發明。每個字母當作26進制數字:A=0, B=1, C=2... 一串字母當成n維向量,跟一個n×n的矩陣相乘,再將得出的結果MOD26。注意用作加密的矩陣(即密匙)在mathbb_^n必須是可逆的,否則就不可能解碼。只有矩陣的行列式和26互質,才是可逆的。

⑵ 什麼是希爾密碼

希爾密碼(Hill Password)是運用基本矩陣論原理的替換密碼,由Lester S. Hill在1929年發明。每個字母當作26進制數字:A=0, B=1, C=2... 一串字母當成n維向量,跟一個n×n的矩陣相乘,再將得出的結果模26。注意用作加密的矩陣(即密匙)在\mathbb_^n必須是可逆的,否則就不可能解碼。只有矩陣的行列式和26互質,才是可逆的。

希爾密碼是基於矩陣的線性變換,希爾密碼相對於前面介紹的移位密碼以及放射密碼而言,其最大的好處就是隱藏了字元的頻率信息,使得傳統的通過字頻來破譯密文的方法失效.希爾密碼不是足夠安全的,如今已被證實。

⑶ 希爾密碼原理

希爾密碼(Hill Cipher)是運用基本矩陣論原理的替換密碼,由Lester S. Hill在1929年發明。每個字母當作26進制數字:A=0, B=1, C=2... 一串字母當成n維向量,跟一個n×n的矩陣相乘,再將得出的結果MOD26。

中文名
希爾密碼
外文名
Hill Cipher
原理
基本矩陣論
類別
替換密碼
提出者
Lester S. Hill
快速
導航
產生原因

原理

安全性分析

例子
簡介
希爾密碼是運用基本矩陣論原理的替換密碼,由Lester S. Hill在1929年發明。
每個字母當作26進制數字:A=0, B=1, C=2... 一串字母當成n維向量,跟一個n×n的矩陣相乘,再將得出的結果模26。
注意用作加密的矩陣(即密匙)在必須是可逆的,否則就不可能解碼。只有矩陣的行列式和26互質,才是可逆的。
產生原因
隨著科技的日新月異和人們對信用卡、計算機的依賴性的加強,密碼學顯得愈來愈重要。密碼學是一門關於加密和解密、密文和明文的學科。若將原本的符號代換成另一種符號,即可稱之為廣義的密碼。狹義的密碼主要是為了保密,是一種防止竊文者得知內容而設的另一種符號文字,也是一般人所熟知的密碼。
使用信用卡、網路賬號及密碼、電子信箱、電子簽名等都需要密碼。為了方便記憶,許多人用生日、電話號碼、門牌號碼記做密碼,但是這樣安全性較差。
為了使密碼更加復雜,更難解密,產生了許多不同形式的密碼。密碼的函數特性是明文對密碼為一對一或一對多的關系,即明文是密碼的函數。傳統密碼中有一種叫移位法,移位法基本型態是加法加密系統C=P+s(mod m)。一般來說,我們以1表示A,2表示B,……,25表示Y,26表示Z,以此類推。由於s=0時相當於未加密,而0≤s≤m-1(s≥m都可用0≤s≤m-1取代),因此,整個系統只有m-1種變化。換言之,只要試過m-1次,機密的信息就會泄漏出去。
由此看來,日常生活中的密碼和傳統的密碼的可靠性較差,我們有必要尋求一種容易將字母的自然頻度隱蔽或均勻化,從而有利於統計分析的安全可靠的加密方法。希爾密碼能基本滿足這一要求。
原理
希爾加密演算法的基本思想是,將d個明文字母通過線性變換將它們轉換為d個密文字母。解密只要作一次逆變換就可以了,密鑰就是變換矩陣本身。[1]
希爾密碼是多字母代換密碼的一種。多字母代換密碼可以利用矩陣變換方便地描述,有時又稱為矩陣變換密碼。令明文字母表為Z,若採用L個字母為單位進行代換,則多碼代換是映射f:Z→Z。若映射是線性的,則f是線性變換,可以用Z上的L×L矩陣K表示。若是滿秩的,則變換為一一映射,且存在有逆變換K。將L個字母的數字表示為Z上的L維矢量m,相應的密文矢量c,且mK=c,以K作為解密矩陣,可由c恢復出相應的明文c·K=m。
在軍事通訊中,常將字元(信息)與數字對應(為方便起見,我們將字元和數字按原有的順序對應,事實上這種對應規則是極易被破解的):
abcde…x y z
12345…242526
如信息「NOSLEEPPING」對應著一組編碼14,15,19,12,5,5,16,16,9,14,7。但如果按這種方式直接傳輸出去,則很容易被敵方破譯。於是必須採取加密措施,即用一個約定的加密矩陣K乘以原信號B,傳輸信號為C=KB(加密),收到信號的一方再將信號還原(破譯)為B=KC。

⑷ 希爾密碼的Hill cipher

三、Hill cipher(希爾密碼)
Hill cipher是1929年提出的一種密碼體制。
設d是一正整數,定義。Hill cipher的主要思想是利用線性變換方法,不同的是這種變換是在 上運算。
例如:設d=2,每個明文單元使用 來表示,同樣密文單元用 表示,具體的加密中, 將被表示為 的線性組合。
如:
利用線性代數的知識,可得
這個運算在 上進行,即mod26,密鑰K一般取一個m*m的矩陣,記為。對明文 ,以 ,則加密演算法為:
也可表示成。

⑸ C++實現古典密碼Hill體制的加密解密的程序

這是C的,且基於的是ASCII碼,大致改一改吧。
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>

struct hill
{
int i,j;
int s[10][10];
}a[3],b;

struct hill mul(struct hill,struct hill);
int det(struct hill,int,int);
struct hill inv(struct hill);
void code();
void uncode();

FILE *word,*num;

void main()
{
int i=0,j=0,k=0;
word=fopen("word.txt","r");
num=fopen("num.txt","r");
if(word==NULL||num==NULL)
{
printf("Error!\n");
exit(0);
}
fclose(word);
fclose(num);

while(!i)
{
fflush(stdin);
printf("輸入密碼\n");
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
a[k].s[i][j]=getchar();
if(a[k].s[i][j]=='\n') break;
}
if(a[k].s[i][0]=='\n') break;
}
for(a[k].j=0;a[k].s[0][a[k].j]!='\n';a[k].j++);
for(a[k].i=0;a[k].s[a[k].i][0]!='\n';a[k].i++) a[k].s[a[k].i][a[k].j]=0;
for(i=0;i<a[k].i;i++) for(j=0;j<a[k].j;j++) a[k].s[i][j]=a[k].s[i][j]-'a';
i=0;
if(a[k].i==a[k].j)
{
if(det(a[k],a[k].i,a[k].j)%2!=0&&det(a[k],a[k].i,a[k].j)%13!=0)
{
printf("是(0)否(1)繼續輸入?:");
scanf("%d",&i);
k++;
}
else printf("密碼不合格!\n");
}
else printf("密碼不合格!\n");
}

while(i)
{
printf("1:加密 2:解密\n");
scanf("%d",&i);
switch(i)
{
case 1: code(); break;
case 2: uncode(); break;
default: i=0;
}
}

}

struct hill mul(struct hill a,struct hill b)
{
int i=0,j=0,k=0;
struct hill ans;
ans.i=a.i;
ans.j=b.j;
for(i=0;i<ans.i;i++)
{
for(j=0;j<ans.j;j++)
{
ans.s[i][j]=0;
for(k=0;k<a.j;k++)
ans.s[i][j]=ans.s[i][j]+a.s[i][k]*b.s[k][j];
}
}
for(i=0;i<ans.i;i++)
{
for(j=0;j<ans.j;j++) ans.s[i][j]=(ans.s[i][j]%26+26)%26+'a';
ans.s[i][j]='\0';
}
return(ans);
}

struct hill inv(struct hill a)
{
char c;
int i=0,j=0,k=0;
struct hill ans;
ans.i=a.i;
ans.j=a.j;
switch(det(a,a.i,a.j)%26)
{
case 1: k=1; break;
case 3: k=9; break;
case 5: k=21; break;
case 7: k=15; break;
case 9: k=3; break;
case 11: k=19; break;
case 15: k=7; break;
case 17: k=23; break;
case 19: k=11; break;
case 21: k=5; break;
case 23: k=17; break;
case 25: k=25; break;
}
for(i=0;i<ans.i;i++)
{
for(j=0;j<ans.j;j++)
ans.s[i][j]=(((int)pow(-1,i+j)*det(a,i,j)*k)%26+26)%26;
}
for(i=0;i<ans.i;i++) ans.s[i][ans.j]='\0';
for(i=0;i<ans.i;i++)
{
for(j=0;j<i;j++)
{
c=ans.s[i][j];
ans.s[i][j]=ans.s[j][i];
ans.s[j][i]=c;
}
}
return(ans);
}

int det(struct hill a,int m,int n)
{
int i=0,j=0,x=0;
if(m!=a.i||n!=a.j)
{
for(i=0;i<a.i;i++) for(j=n;j<a.j;j++) a.s[i][j]=a.s[i][j+1];
for(i=m;i<a.i;i++) for(j=0;j<a.j;j++) a.s[i][j]=a.s[i+1][j];
a.i--;
a.j--;
}
if(a.i==2&&a.j==2) return(a.s[0][0]*a.s[1][1]-a.s[0][1]*a.s[1][0]);
for(i=0;i<a.i;i++) x+=a.s[0][i]*det(a,0,i)*(int)pow(-1,i);
return(x);
}

void code()
{
int i=0,j=0,space[10],k=0,n=0;
struct hill ans;
char c=0;
word=fopen("word.txt","r");
c=fgetc(word);
while(c!=EOF)
{
if(c>='a'&&c<='z') n++;
c=fgetc(word);
}
fclose(word);
word=fopen("word.txt","r");
num=fopen("num.txt","w");
while(n)
{
printf("剩餘%d: ",n);
scanf("%d",&j);
n=n-j;
for(k=0;a[k].i!=j;j++);
b.i=a[k].i;
b.j=1;
for(j=0;j<10;j++) space[j]=-1;
j=0;
for(i=0;i<b.i;i++)
{
b.s[i][0]=fgetc(word);
if(b.s[i][0]<'a'||b.s[i][0]>'z')
{
space[j]=i;
j++;
b.s[i][0]=fgetc(word);
}
}
for(i=0;i<b.i;i++)
{
b.s[i][0]-='a';
b.s[i][1]='\0';
}
ans=mul(a[k],b);
for(i=0;i<ans.i;i++)
{
for(j=0;j<10;j++) if(i==space[j]) break;
if(j!=10) fprintf(num," %c",ans.s[i][0]);
else fprintf(num,"%c",ans.s[i][0]);
}
}
fclose(word);
fclose(num);
}

void uncode()
{
int k=0,n=0;
int i=0,j=0,space[10];
struct hill ans;
char c=0;
word=fopen("num.txt","r");
c=fgetc(word);
while(c!=EOF)
{
if(c>='a'&&c<='z') n++;
c=fgetc(word);
}
fclose(word);
word=fopen("word.txt","w");
num=fopen("num.txt","r");
b.i=a[k].i;
b.j=1;
while(n)
{
printf("剩餘%d: ",n);
scanf("%d",&j);
n=n-j;
for(k=0;a[k].i!=j;j++);
b.i=a[k].i;
b.j=1;
for(j=0;j<10;j++) space[j]=-1;
j=0;
for(i=0;i<b.i;i++)
{
b.s[i][0]=fgetc(num);
if(b.s[i][0]<'a'||b.s[i][0]>'z')
{
space[j]=i;
j++;
b.s[i][0]=fgetc(num);
}
}
for(i=0;i<b.i;i++)
{
b.s[i][0]-='a';
b.s[i][1]='\0';
}
ans=mul(inv(a[k]),b);
for(i=0;i<ans.i;i++)
{
for(j=0;j<10;j++) if(i==space[j]) break;
if(j!=10) fprintf(word," %c",ans.s[i][0]);
else fprintf(word,"%c",ans.s[i][0]);
}
}
fclose(word);
fclose(num);
}

⑹ 哪位高人能幫忙用C語言寫一個HILL的加密演算法啊

不就是矩陣乘法嘛。
為了防止溢出,你只需要多次取余即可。
具體可以參考hill的原理。隨便一搜就有。

⑺ 希爾密碼求解

希爾加密演算法的基本思想是,將d個明文字母通過線性變換將它們轉換為d個密文字母。解密只要作一次逆變換就可以了,密鑰就是變換矩陣本身。如信息「NOSLEEPPING」對應著一組編碼14,15,19,12,5,5,16,16,9,14,7。但如果按這種方式直接傳輸出去,則很容易被敵方破譯。於是必須採取加密措施,即用一個約定的加密矩陣K乘以原信號B,傳輸信號為C=KB(加密),收到信號的一方再將信號還原(破譯)為B=KC。如果敵方不知道加密矩陣,則很難破譯。
解密
第一步,求密匙矩陣K的逆矩陣[2]K。K可用Mathematica計算。
Inverse123-120213∥MatrixForm=-614-3125-1-3,
即K=-614-3125-1-3。
第二步,由得Y=KX得X=KY(i=1,2,3,4),再次進行矩陣乘法運算:
X=KY=-614-3125-1-3671610=141519;
X=KY=-614-3125-1-327-244=1255;
X=KY=-614-3125-1-3501675=16169;
X=KY=-614-3125-1-321035=1470。
這樣原來的信息編碼為14,15,19,12,5,5,16,16,9,14,7。
第三步,對照編碼表,即可獲得對方發來的信息內容為「NOSLEEPPING」。

閱讀全文

與hill密碼加密c相關的資料

熱點內容
哪個視頻網站可以投屏還免費 瀏覽:283
好看愛情網 瀏覽:304
泰國電影女主叫小草 瀏覽:543
模具設計的命令如何用 瀏覽:990
華為雲桌面伺服器多少錢一台 瀏覽:271
木工數控刀具路徑編程 瀏覽:275
用電腦看高清電影在哪裡看 瀏覽:242
老外從牆壁穿越的電影 瀏覽:813
下人電影完整版下載 瀏覽:589
雲伺服器下載服務 瀏覽:241
pdf如何插入頁碼 瀏覽:637
ps選擇命令大全 瀏覽:826
qq聊天記錄恢復文件夾 瀏覽:646
電腦公共盤加密碼 瀏覽:459
韓國電影兩個字 瀏覽:971
鴻蒙系統怎麼給App加速 瀏覽:190
女主叫男主三叔姓戰 瀏覽:377
驍騎校全部小說順序 瀏覽:394
如何將iphone手機照片轉到安卓手機 瀏覽:31