導航:首頁 > 文檔加密 > 矩陣加密

矩陣加密

發布時間:2022-01-17 14:51:55

A. 置換密鑰矩陣加密演算法實現與安全性分析

#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 ];
}

B. 請用矩陣變位法將明文:」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 <- 注意_就是空格

其實矩陣變位本質是周期性改變明文段排列的加密方法,屬於古典加密中的置換移位加密,這一類中最著名的是維吉尼亞加密法,古典加密還有個分類是替代加密,例如凱撒加密法,古典加密都屬於對稱加密,都禁受不住字典攻擊。

C. 怎樣用矩陣加密和解密一段英文

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

//矩陣數據結構
//二維矩陣
class _Matrix
{
public int m;
public int n;
public float[] arr;

//初始化
public _Matrix()
{
m = 0;
n = 0;
}

public _Matrix(int mm,int nn)
{
m = mm;
n = nn;
}

//設置m
public void set_mn(int mm,int nn)

D. 用MATLAB怎麼解密經矩陣加密過的信息

對二義性如何處理?以下是一種處理方式,但是貌似上述字元沒有意義
for i=1:length(a)
if i<length(a)&isspace(a(i))
a(i)=[];
end
end
j=1;k=1;
for i=1:length(a)-1
if str2num(a(k))==0
b(j)=' ';
else
if str2num(a(k:k+1))>26
b(j)=char(97+str2num(a(k)));
else
b(j)=char(97+str2num(a(k:k+1)));
k=k+1;
end
end
j=j+1;k=k+1;
if k>length(a) break;end;
end

E. 矩陣加密和解密

去看看矩陣的乘法運算,就清楚了。很簡單的乘法運算

F. 【Hill密碼加密解密問題】 給定一個長度為n的明文,請問密鑰矩陣的維數具體要怎麼取

不一定
你可以取一個3維的可逆矩陣
但注意矩陣的行列式的值最好是1
這樣可以保證逆矩陣不出現分數

G. 某人向公司發送信息矩陣B,通過公司的加密矩陣A,公司收到的信息矩陣為C(C=AB).C=

因為C=AB,所以C的列向量組可以由A的列向量組線性表示.
又B可逆,所以A=C把矩陣A=CB<sup>-1</sup>.
從而A的列向量組也可以由C的列向量組線性表示.
因此,C的列向量組與C的列向量組是等價的.
故選:B.

H. 求個矩陣加密演算法的程序

暈,我原號登陸竟然沒有回答框~~!!

是不是樓主對我 (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[ Y YSYd 11.16 G鶪?GQ K KDKU 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`E3QK 3K2*CR 7T9.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 ?" E  2 5?%%.:xS #.\=  &2gE 7#  (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
-------------------------------------

I. 利用數學矩陣與希爾密碼等知識完成對I like you這句話的加密與解密

比如用矩陣
1 1 0
2 1 1
2 2 1
進行加密

I like you
按列優先排成3行

利用矩陣的乘法
可得加密結果I__U%pyicukk
解密只需求剛才加密矩陣的逆矩陣再相乘即可

J. 矩陣在密碼學的運用問題

對密碼不熟,代數還可以,我的理解是這樣的,首先要將「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的逆矩陣。

閱讀全文

與矩陣加密相關的資料

熱點內容
手機時間如何校正到伺服器 瀏覽:81
創造與魔法瞬移源碼百度 瀏覽:882
反射優化java 瀏覽:874
硬體加密播放盒子 瀏覽:923
xp點擊文件夾選項沒反應 瀏覽:537
蘋果不顯示桌面的app怎麼刪除 瀏覽:864
安卓手機怎麼換國際服 瀏覽:415
神獸領域安卓怎麼下載 瀏覽:250
單片機交通燈ad原理圖 瀏覽:413
多功能解壓磁鐵筆 瀏覽:80
少兒編程火箭升空 瀏覽:401
蘭斯10游戲解壓碼 瀏覽:42
手機proxy伺服器地址 瀏覽:449
吉他清音壓縮 瀏覽:301
簡歷模板程序員 瀏覽:882
螺桿壓縮機虛標型號 瀏覽:953
idea開發項目伺服器ip地址 瀏覽:125
串口伺服器出現亂碼怎麼解決 瀏覽:950
命令按鈕的default 瀏覽:161
戰網如何登錄其他伺服器 瀏覽:990