免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1012 | 回复: 0

DES算法 [复制链接]

论坛徽章:
0
发表于 2011-12-21 08:43 |显示全部楼层
数据加密算法DES数据加密算法(Data Encryption Algorithm,DEA)是一种对称加密算法,很可能是使用最广泛的密钥系统,特别是在保护金融数据的安全中,最初开发的DEA是嵌入硬件中的。通 常,自动取款机(Automated Teller Machine,ATM)都使用DEA。它出自IBM的研究工作,IBM也曾对它拥有几年的专利权,但是在1983年已到期后,处于公有范围中,允许在特 定条件下可以免除专利使用费而使用。1977年被美国政府正式采纳。

数据加密标准DES  
 DES的原始思想可以参照二战德国的恩格玛机,其基本思想大致相同。传统的密码加密都是由古代的循环移位思想而来,恩格玛机在这个基础之上进行了扩散模糊。但是本质原理都是一样的。现代DES在二进制级别做着同样的事:替代模糊,增加分析的难度。

加密原理   DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但 最后一个循环不交换。DES 使用 16 个循环,使用异或,置换,代换,移位操作四种基本运算。

三重 DES  DES 的常见变体是三重 DES,使用 168 位的密钥对资料进行三次加密的一种机制;它通常(但非始终)提供极其强大的安全性。如果三个 56 位的子元素都相同,则三重 DES 向后兼容 DES。破解方法   攻击 DES 的主要形式被称为蛮力的或彻底密钥搜索,即重复尝试各种密钥直到有一个符合为止。如果 DES 使用 56 位的密钥,则可能的密钥数量是 2 的 56 次方个。随着计算机系统能力的不断发展,DES 的安全性比它刚出现时会弱得多,然而从非关键性质的实际出发,仍可以认为它是足够的。不过 ,DES 现在仅用于旧系统的鉴定,而更多地选择新的加密标准 — 高级加密标准(Advanced Encryption Standard,AES)。   新的分析方法有差分分析法和线性分析法两种

DES算法的安全性  一.安全性比较高的一种算法,目前只有一种方法可以破解该算法,那就是穷举法.   二.采用64位密钥技术,实际只有56位有效,8位用来校验的.譬如,有这样的一台PC机器,它能每秒计算一百万次,那么256位空间它要穷举的时间为2285年.所以这种算法还是比较安全的一种算法.   TripleDES。该算法被用来解决使用 DES 技术的 56 位时密钥日益减弱的强度,其方法是:使用两个独立密钥对明文运行 DES 算法三次,从而得到 112 位有效密钥强度。TripleDES 有时称为 DESede(表示加密、解密和加密这三个阶段)。

NETC C实现:
#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_Production();
 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_Production() //生成子密钥
 {
 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 ];
 }






您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

基于案例的 SQL 优化实战训练营

讲师:中电福富特级专家梁敬彬,参与本次课程培训,你将收获:
1. 能编写出较为高效的 SQL;
2. 能解决70%以上的数据库常见优化问题;
3. 能得到老师提供的高效的相关工具和解决方案;
4. 能举一反三,收获不仅仅是 SQL 优化。
现在购票享受8.8折优惠!
----------------------------------------
优惠时间:2019年3月20日前

大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP