⑴ 什麼是希爾密碼
希爾密碼(Hill Password)是運用基本矩陣論原理的替換密碼,由Lester S. Hill在1929年發明。每個字母當作26進制數字:A=0, B=1, C=2... 一串字母當成n維向量,跟一個n×n的矩陣相乘,再將得出的結果模26。注意用作加密的矩陣(即密匙)在\mathbb_^n必須是可逆的,否則就不可能解碼。只有矩陣的行列式和26互質,才是可逆的。
希爾密碼是基於矩陣的線性變換,希爾密碼相對於前面介紹的移位密碼以及放射密碼而言,其最大的好處就是隱藏了字元的頻率信息,使得傳統的通過字頻來破譯密文的方法失效.希爾密碼不是足夠安全的,如今已被證實。
⑵ 置換密鑰矩陣加密演算法實現與安全性分析
#include<iostream.h>
class SubKey{ //定義子密鑰為一個類
public:
int key[8][6];
}subkey[16]; //定義子密鑰對象數組
class DES{
int encipher_decipher; //判斷加密還是解密
int key_in[8][8]; //用戶原始輸入的64位二進制數
int key_out[8][7]; //除去每行的最後一位校驗位
int c0_d0[8][7]; //存儲經PC-1轉換後的56位數據
int c0[4][7],d0[4][7]; //分別存儲c0,d0
int text[8][8]; //64位明文
int text_ip[8][8]; //經IP轉換過後的明文
int A[4][8],B[4][8]; //A,B分別存儲經IP轉換過後明文的兩部分,便於交換
int temp[8][6]; //存儲經擴展置換後的48位二進制值
int temp1[8][6]; //存儲和子密鑰異或後的結果
int s_result[8][4]; //存儲經S變換後的32位值
int text_p[8][4]; //經P置換後的32位結果
int secret_ip[8][8]; //經逆IP轉換後的密文
public:
void Key_Putting();
void PC_1();
int function(int,int); //異或
void SubKey_Proction();
void IP_Convert();
void f();
void _IP_Convert();
void Out_secret();
};
void DES::Key_Putting() //得到密鑰中對演算法有用的56位
{
cout<<"請輸入64位的密鑰(8行8列且每行都得有奇數個1):\n";
for(int i=0;i<8;i++)
for(int j=0;j<8;j++){
cin>>key_in[i][j];
if(j!=7) key_out[i][j]=key_in[i][j];
}
}
void DES::PC_1() //PC-1置換函數
{
int pc_1[8][7]={ //PC-1
,
,
,
,
,
,
,
};
int i,j;
for(i=0;i<8;i++)
for(j=0;j<7;j++)
c0_d0[i][j]=key_out[ (pc_1[i][j]-1)/8 ][ (pc_1[i][j]-1)%8 ];
}
int DES::function(int a,int b) //模擬二進制數的異或運算,a和b為整型的0和1,返回值為整型的0或1
{
if(a!=b)return 1;
else return 0;
}
void DES::SubKey_Proction() //生成子密鑰
{
int move[16][2]={ //循環左移的位數
1 , 1 , 2 , 1 ,
3 , 2 , 4 , 2 ,
5 , 2 , 6 , 2 ,
7 , 2 , 8 , 2 ,
9 , 1, 10 , 2,
11 , 2, 12 , 2,
13 , 2, 14 , 2,
15 , 2, 16 , 1
};
int pc_2[8][6]={ //PC-2
14, 17 ,11 ,24 , 1 , 5,
3 ,28 ,15 , 6 ,21 ,10,
23, 19, 12, 4, 26, 8,
16, 7, 27, 20 ,13 , 2,
41, 52, 31, 37, 47, 55,
30, 40, 51, 45, 33, 48,
44, 49, 39, 56, 34, 53,
46, 42, 50, 36, 29, 32
};
for(int i=0;i<16;i++) //生成子密鑰
{
int j,k;
int a[2],b[2];
int bb[28],cc[28];
for(j=0;j<4;j++)
for(k=0;k<7;k++)
c0[j][k]=c0_d0[j][k];
for(j=4;j<8;j++)
for(k=0;k<7;k++)
d0[j-4][k]=c0_d0[j][k];
for(j=0;j<4;j++)
for(k=0;k<7;k++){
bb[7*j+k]=c0[j][k];
cc[7*j+k]=d0[j][k];
}
for(j=0;j<move[i][1];j++){
a[j]=bb[j];
b[j]=cc[j];
}
for(j=0;j<28-move[i][1];j++){
bb[j]=bb[j+1];
cc[j]=cc[j+1];
}
for(j=0;j<move[i][1];j++){
bb[27-j]=a[j];
cc[27-j]=b[j];
}
for(j=0;j<28;j++){
c0[j/7][j%7]=bb[j];
d0[j/7][j%7]=cc[j];
}
for(j=0;j<4;j++) //L123--L128是把c0,d0合並成c0_d0
for(k=0;k<7;k++)
c0_d0[j][k]=c0[j][k];
for(j=4;j<8;j++)
for(k=0;k<7;k++)
c0_d0[j][k]=d0[j-4][k];
for(j=0;j<8;j++) //對Ci,Di進行PC-2置換
for(k=0;k<6;k++)
subkey[i].key[j][k]=c0_d0[ (pc_2[j][k]-1)/7 ][ (pc_2[j][k]-1)%7 ];
}
}
void DES::IP_Convert()
{
int IP[8][8]={ //初始置換IP矩陣
58, 50, 42, 34, 26, 18, 10, 2,
60, 52, 44, 36, 28, 20, 12, 4,
62, 54, 46, 38, 30, 22, 14, 6,
64, 56, 48, 40, 32, 24, 16, 8,
57, 49, 41, 33, 25, 17, 9, 1,
59, 51, 43, 35, 27, 19, 11, 3,
61, 53, 45, 37, 29, 21, 13, 5,
63, 55, 47, 39, 31, 23, 15, 7
};
cout<<"你好,你要加密還是解密?加密請按1號鍵(輸入1),解密請按2號鍵,並確定."<<'\n';
cin>>encipher_decipher;
char * s;
if(encipher_decipher==1) s="明文";
else s="密文";
cout<<"請輸入64位"<<s<<"(二進制):\n";
int i,j;
for(i=0;i<8;i++)
for(j=0;j<8;j++)
cin>>text[i][j];
for(i=0;i<8;i++) //進行IP變換
for(j=0;j<8;j++)
text_ip[i][j]=text[ (IP[i][j]-1)/8 ][ (IP[i][j]-1)%8 ];
}
⑶ 矩陣在密碼學的運用問題
對密碼不熟,代數還可以,我的理解是這樣的,首先要將「ALGEBRA」轉換為向量c=(1 12 7 5 2 18 1 9 3)。
設A為一個可逆矩陣,與傳遞的信息大小要相同,這里就是9×9,
則可以c*A或者A*transpose(c)(transpose表示c的轉置向量,*為乘法),得到一個行或者列向量。
把得出的行或者列向量作為加密後的信息發出,解密者若知道這一個矩陣A,
如果用的是行向量,則需右乘A的逆矩陣即可得到原來的向量c,再對應到字母A……Z,就為傳遞的信息;列向量的話就需要左乘矩陣A的逆矩陣。
⑷ 希爾密碼原理
希爾密碼(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。
⑸ 古典密碼兩種加密方式
古典加密演算法:置換密碼
置換密碼演算法的原理是不改變明文字元,只將字元在明文中的排列順序改變,從而實現明文信息的加密。置換密碼有時又稱為換位密碼。
矩陣換位法是實現置換密碼的一種常用方法。它將明文中的字母按照給的順序安排在一個矩陣中,然後用根據密鑰提供的順序重新組合矩陣中字母,從而形成密文。例如,明文為attack
begins
at
five,密鑰為cipher,將明文按照每行6列的形式排在矩陣中,形成如下形式:
a
t
t
a
c
k
b
e
g
i
n
s
a
t
f
i
v
e
根據密鑰cipher中各字母在字母表中出現的先後順序,給定一個置換:
1
2
3
4
5
6
f
=
1
4
5
3
2
6
根據上面的置換,將原有矩陣中的字母按照第1列,第4列,第5列,第3列,第2列,第6列的順序排列,則有下面形式:
a
a
c
t
t
k
b
i
n
g
e
s
a
i
v
f
t
e
從而得到密文:aacttkbingesaivfte
⑹ 請用矩陣變位法將明文:」computer 」加密,並寫出其密文。 密鑰: 3×3矩陣,置換: f=((123) (312))
樓主你好~~
密鑰為3*3矩陣,置換為f=((1,2,3),(3,1,2)),也就是說將明1列->密3列,明2列->密1列,明3列->密2列。
我們分步進行
1)構造3x3矩陣:
| 1 | 2 | 3 |
| _ | _ | _ |
| _ | _ | _ |
| _ | _ | _ |
2)填入明文:
| 1 | 2 | 3 |
| _ | C | O | <-注意第一個有一個空格
| M | P | U |
| T | E | R |
3)矩陣變位,置換為f=((1,2,3),(3,1,2)):
| 3 | 1 | 2 |
| O | _ | C |
| U | M | P |
| R | T | E |
4)輸出密文:
o_cumprte <- 注意_就是空格
其實矩陣變位本質是周期性改變明文段排列的加密方法,屬於古典加密中的置換移位加密,這一類中最著名的是維吉尼亞加密法,古典加密還有個分類是替代加密,例如凱撒加密法,古典加密都屬於對稱加密,都禁受不住字典攻擊。
⑺ 矩陣加密和解密
去看看矩陣的乘法運算,就清楚了。很簡單的乘法運算
⑻ 求個矩陣加密演算法的程序
暈,我原號登陸竟然沒有回答框~~!!
是不是樓主對我 (1西方不勝1) 做了限制? 那我也只能回答一部分...
把 生成滿秩矩陣以及其逆矩陣 的代碼貼上來....
#include "stdio.h"
#include "time.h"
#include "stdlib.h"
#define MAX 8 // 矩陣大小
#define PT 10 // 附矩陣 隨機初始值的最大值
#define bianhuan 100 // 由對角線矩陣生成滿秩矩陣所需的行變化次數
struct changs // 記錄變化的過程, 以便逆過來求其逆矩陣
{
int temp1 ;
int temp2 ;
} change[bianhuan + 1 ] ;
int Matrix[MAX][MAX] ; // 滿秩矩陣
int R_matrix[MAX][MAX]; // 逆矩陣
// ***** 生成 滿秩矩陣 並求出該滿秩矩陣的逆矩陣 ****************************//
void creat()
{
int i , k ;
int flage = 0 ;
for(i = 0 ; i < MAX ; i ++ ) // 生成主對角線矩陣
Matrix[i][i] = R_matrix[i][i] = 1 ;
for(k = 0 ; k < bianhuan ; k ++ ) // 進行 行 隨意變化生成滿秩矩陣 , 並記錄下變化過程
{
int x1 = change[k].temp1 = rand() % MAX ;
int x2 = rand() % MAX ;
while( x2 == x1 ) x2 = rand() % MAX ;
change[k].temp2 = x2 ;
for(i = 0 ; i < MAX ; i ++ )
if( Matrix[x1][i] + Matrix[x2][i] >= 31 ) break ; // 控制矩陣中最大的數的范圍在30內
if(i >= MAX )
{
for(i = 0 ; i < MAX ; i ++ )
Matrix[x1][i] += Matrix[x2][i] ;
}
else k-- ,flage ++ ;
if(flage > 2000 ) { k++ ; break ; }
}
for(k-- ; k >= 0 ; k -- ) // 行逆變換, 求出其逆矩陣
{
for( i = 0 ; i < MAX ; i ++ )
R_matrix[ change[k].temp1 ][i] -= R_matrix[ change[k].temp2 ][i] ;
}
return ;
}
int main()
{
int i , j ;
srand(time(0)) ;
creat() ;
printf("加密矩陣為:\n") ;
for(i =0 ; i < MAX ; i ++ )
{
for(j =0 ; j < MAX ; j ++)
printf("%4d " , Matrix[i][j]) ;
printf("\n") ;
}
printf("\n") ;
printf("解密矩陣為:\n") ;
for( i = 0; i < MAX ; i ++ )
{
for(j =0 ; j < MAX ; j ++ )
printf("%4d ",R_matrix[i][j]) ;
printf("\n");
}
return 0 ;
}
如下:是一個測試數據.
加密矩陣為:
14 8 29 30 10 2 14 13
11 8 23 25 6 1 10 8
12 8 26 27 7 3 11 9
7 5 15 15 3 1 5 4
9 6 19 21 7 1 10 9
10 6 21 22 7 2 10 9
8 6 17 18 3 1 6 4
7 6 15 19 5 1 9 7
解密矩陣為:
-2 5 -1 -2 -3 5 -2 -1
-1 5 2 -1 -1 -1 -4 -1
2 -1 2 0 1 -5 0 0
-1 -4 -3 2 1 4 3 1
-3 2 0 -2 2 3 0 -2
-1 1 0 0 -1 2 -1 0
2 4 4 -4 -1 -6 -2 -1
1 -3 -2 4 -1 1 0 2
被加密文件:
=====================================
發往: 劉曉輝 (ACM基地/QT002)
時間: 2007-06-11 星期一 18:58:40 (RSA)(封裝)
(文件) player.swf
-------------------------------------
加密後文件:
x xxxx \ \\\\ g gggg 7 7777 R RRRR W WWWW ? ???? E EEEE x xxxx \ \\\\ g gggg 7 7777 R RRRR W WWWW ? ???? E EEEE x xxxx \ \\\\ g gggg 7 7777 R RRRR W WWWW ? ???? E EEEE x xxxx \ \\\\ g gggg 7 7777 R RRRR W WWWW ? ???? E EEEE hh]hv
Q QJQ[ YYSYd 11.16 G鶪?GQ KKDKU 8858> ;;5;D B9#PIaBP2,@:K2=90F@S9E'#-%-'72B-60):5F0:"-)4"*&!/+7&-%$8-3>H3*!*25*/$.6=. %"+0"( %-4%#$%'?5>nJ6Q1'2V8,C8,6`>1I?4"**$+K2&7.&-P5(;##<&1"%@(#/+(
J1X!"9%B%& A(I#'? 2"< 6#?(,*14)@x+2\. 8g 7%-R &/W�???"
(ER2L]>'<JE+AS% #. 8"5?;$7D*?)5�.
.5 ^A`E3QK3K2*CR7T9.I.-*@ .B0"7D?F2%;5"4 16)9)/*,3hk
$)QT #'-Y^ 13 #GI ? %KN 8; ;> K(;3T&':0#?@!5'H"#&
3(#96+$=( #+*"/?/
` "I' Q?,? A?" E25?%%.:xS#.\=&2gE7# (R9 ?!*W<? ?(#E0V]K%IvS BJ9;[A IS>AdH '. %6( ;?51Q8 >D65U< -5%+>. 25.)D. x xx x \ \\ \ g gg g 7 77 7 R RR R W WW W ? ?? ? E EE E x xx x \ \\ \ g gg g 7 77 7 R RR R W WW W ? ?? ? E EE E x xx x \ \\ \ g gg g 7 77 7 R RR R W WW W ? ?? ? E EE E x xx x \ \\ \ g gg g 7 77 7 R RR R W WW W ? ?? ? E EE E P(Px P ==\ = E"Eg E %%7 % 66R 6 ::W : **? * --E -
解密後文件:
=====================================
發往: 劉曉輝 (ACM基地/QT002)
時間: 2007-06-11 星期一 18:58:40 (RSA)(封裝)
(文件) player.swf
-------------------------------------