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) 才可对密文解密.