des演算法例題
#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
{57, 49, 41, 33, 25, 17, 9},
{1, 58, 50, 42, 34, 26, 18},
{10, 2, 59, 51, 43, 35, 27},
{19, 11, 3, 60, 52, 44, 36},
{63, 55, 47, 39, 31, 23, 15},
{7, 62, 54, 46, 38, 30, 22},
{14, 6, 61, 53, 45, 37, 29},
{21, 13, 5, 28, 20, 12, 4}
};
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 ];
}
㈡ DES中S盒演算法——解題
在密碼學中,S盒(Substitution-box)是對稱密鑰演算法執行置換計算的基本結構。S盒用在分組密碼演算法中,是唯一的非線性結構,其S盒的指標的好壞直接決定了密碼演算法的好壞。 ——網路
S盒有8個盒子,下表是DES演算法中S4盒的選擇矩陣,如果其輸入為101011,求輸出結果。
解:已知輸入為101011
(1)、取頭尾11,進行二進制轉換為十進制為3,表示取表格的第3行
(2)、然後中間0101,進行二進制轉換為十進制為5,表示取表格的第五列
(3)、(3,5)對應表格中的數字是12,12轉換為二進制就是1100
答:如果該盒輸入為101011則輸出的結果為1100
㈢ 證明DES的解密演算法是加密演算法的逆
證明:DES的加密演算法遵循公式:第i輪加密時,LEi=REi-1;REi=LEi-1⊕F(REi-1,Ki)。
所以拿最後1輪加密來看,有LE16=RE15;RE16=LE15⊕F(RE15,K16),最後交換它們的位置有
LE17=RE16,RE17=LE16得到密文。然後進行第一輪解密有LD0=LE17=RE16,RD0=RE17=LE16。
解密時輸入的子密鑰與加密時相反,所以LD1=RD0=LE16=RE15,
RD1=LD0⊕F(RD0,K16)=RE16⊕F(RE15,K16)=[LE15⊕F(RE15,K16)]⊕F(RE15,K16)=LE15。
所以加密的最後一輪和解密的第一輪相反,而一般情況下按照公式將REi-1,LEi-1代入得:
REi-1=LEi;LEi-1=REi⊕F(LEi,Ki)。
所以DES的解密演算法是加密演算法的逆。
㈣ 數據加密的方法有哪些如題
1. 數據加密標准 傳統加密方法有兩種,替換和置換.上面的例子採用的就是替換的方法:使用密鑰將明文中的每一個字元轉換為密 文中的一個字元.而置換僅將明文的字元按不同的順序重新排列.單獨使用這兩種方法的任意一種都是不夠安全的,但 是將這兩種方法結合起來就能提供相當高的安全程度.數據加密標准(Data Encryption Standard,簡稱DES)就採用了 這種結合演算法,它由IBM制定,並在1977年成為美國官方加密標准. DES的工作原理為:將明文分割成許多64位大小的塊,每個塊用64位密鑰進行加密,實際上,密鑰由56位數據位和8 位奇偶校驗位組成,因此只有256個可能的密碼而不是264個.每塊先用初始置換方法進行加密,再連續進行16次復雜的 替換,最後再對其施用初始置換的逆.第i步的替換並不是直接利用原始的密鑰K,而是由K與i計算出的密鑰Ki. DES具有這樣的特性,其解密演算法與加密演算法相同,除了密鑰Ki的施加順序相反以外. 2. 公開密鑰加密 多年來,許多人都認為DES並不是真的很安全.事實上,即使不採用智能的方法,隨著快速、高度並行的處理器的出 現,強制破解DES也是可能的.公開密鑰加密方法使得DES以及類似的傳統加密技術過時了.公開密鑰加密方法中,加密 演算法和加密密鑰都是公開的,任何人都可將明文轉換成密文.但是相應的解密密鑰是保密的(公開密鑰方法包括兩個密鑰, 分別用於加密和解密),而且無法從加密密鑰推導出,因此,即使是加密者若未被授權也無法執行相應的解密. 公開密鑰加密思想最初是由Diffie和Hellman提出的,最著名的是Rivest、Shamir以及Adleman提出的,現在通常稱為 RSA(以三個發明者的首位字母命名)的方法,該方法基於下面的兩個事實: 1) 已有確定一個數是不是質數的快速演算法; 2) 尚未找到確定一個合數的質因子的快速演算法. RSA方法的工作原理如下: 1) 任意選取兩個不同的大質數p和q,計算乘積r=p*q; 2) 任意選取一個大整數e,e與(p-1)*(q-1)互質,整數e用做加密密鑰.注意:e的選取是很容易的,例如,所有大 於p和q的質數都可用. 3) 確定解密密鑰d: d * e = 1 molo(p - 1)*(q - 1) 根據e、p和q可以容易地計算出d. 4) 公開整數r和e,但是不公開d; 5) 將明文P (假設P是一個小於r的整數)加密為密文C,計算方法為: C = Pe molo r 6) 將密文C解密為明文P,計算方法為: P = Cd molo r 然而只根據r和e(不是p和q)要計算出d是不可能的.因此,任何人都可對明文進行加密,但只有授權用戶(知道d) 才可對密文解密.