• anameless123
    了解作者
  • C/C++
    开发工具
  • 4KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 2
    下载次数
  • 2019-06-09 10:57
    上传日期
实现DES的代码,附上了一点小测试,三重des加密以及解密
DES.zip
  • DES
  • DES.cpp
    7.8KB
  • DES.h
    4.3KB
  • testmain.cpp
    558B
内容介绍
#include "DES.h" #include<iostream> using namespace std; DES::DES() { int i; for (i = 0; i < 65; i++) Mp[i] = 0; for (i = 0; i < 65; i++) Key[i] = 0; for (i = 0; i < 33; i++) Li[i] = 0; for (i = 0; i < 33; i++) Ri[i] = 0; for (i = 0; i < 49; i++) Ri_48[i] = 0; for (int i = 0; i < 33; i++) Ri_32[i] = 0; for (i = 0; i < 29; i++) Ci[i] = 0; for (i = 0; i < 29; i++) Di[i] = 0; for (i = 0; i < 57; i++) K_p1[i] = 0; for (i = 0; i < 16; i++) { for (int j = 0; j < 49; j++) Ki[i][j] = 0; } for (i = 0; i < 65; i++) Res[i] = 0; } DES::~DES() { } void DES::HtoD(char* w, bool *x) { for (int i = 0; i < 16; ++i) { switch (w[i]) { case '0': x[4 * i + 1] = 0; x[4 * i + 2] = 0; x[4 * i + 3] = 0; x[4 * i + 4] = 0; break; case '1': x[4 * i + 1] = 0; x[4 * i + 2] = 0; x[4 * i + 3] = 0; x[4 * i + 4] = 1; break; case '2': x[4 * i + 1] = 0; x[4 * i + 2] = 0; x[4 * i + 3] = 1; x[4 * i + 4] = 0; break; case '3': x[4 * i + 1] = 0; x[4 * i + 2] = 0; x[4 * i + 3] = 1; x[4 * i + 4] = 1; break; case '4': x[4 * i + 1] = 0; x[4 * i + 2] = 1; x[4 * i + 3] = 0; x[4 * i + 4] = 0; break; case '5': x[4 * i + 1] = 0; x[4 * i + 2] = 1; x[4 * i + 3] = 0; x[4 * i + 4] = 1; break; case '6': x[4 * i + 1] = 0; x[4 * i + 2] = 1; x[4 * i + 3] = 1; x[4 * i + 4] = 0; break; case '7': x[4 * i + 1] = 0; x[4 * i + 2] = 1; x[4 * i + 3] = 1; x[4 * i + 4] = 1; break; case '8': x[4 * i + 1] = 1; x[4 * i + 2] = 0; x[4 * i + 3] = 0; x[4 * i + 4] = 0; break; case '9': x[4 * i + 1] = 1; x[4 * i + 2] = 0; x[4 * i + 3] = 0; x[4 * i + 4] = 1; break; case 'A': x[4 * i + 1] = 1; x[4 * i + 2] = 0; x[4 * i + 3] = 1; x[4 * i + 4] = 0; break; case 'B': x[4 * i + 1] = 1; x[4 * i + 2] = 0; x[4 * i + 3] = 1; x[4 * i + 4] = 1; break; case 'C': x[4 * i + 1] = 1; x[4 * i + 2] = 1; x[4 * i + 3] = 0; x[4 * i + 4] = 0; break; case 'D': x[4 * i + 1] = 1; x[4 * i + 2] = 1; x[4 * i + 3] = 0; x[4 * i + 4] = 1; break; case 'E': x[4 * i + 1] = 1; x[4 * i + 2] = 1; x[4 * i + 3] = 1; x[4 * i + 4] = 0; break; case 'F': x[4 * i + 1] = 1; x[4 * i + 2] = 1; x[4 * i + 3] = 1; x[4 * i + 4] = 1; break; } } }//测试成功 void DES::DtoH(bool* x, char* w) { int cur = 0; for (int i = 1; i <= 64; i += 4) { cur = x[i] * 8 + x[i + 1] * 4 + x[i + 2] * 2 + x[i + 3]; if (cur < 10) w[i / 4] = 48 + cur; else w[i / 4] = 55 + cur; } }//测试成功 void DES::OtoD(int O, bool* D)// 4位,从0开始 { bool cur; if (O / 8 != 0) { D[0] = 1; O -= 8; } else D[0] = 0; if (O / 4 != 0) { D[1] = 1; O -= 4; } else D[1] = 0; if (O / 2 != 0) { D[2] = 1; O -= 2; } else D[2] = 0; if (O) D[3] = 1; else D[3] = 0; }//测试成功 void DES::LM(int round,bool* halfkey)//循环左移从 0 开始数 { int i = 0; int t = 0; bool cur[29] = { 0 }; for (i=1; i <= 28; i++) { t = i - shiftBits[round]; if (t > 0) cur[t] = halfkey[i]; else cur[t+28] = halfkey[i]; } i = 1; while (i < 29) { halfkey[i] = cur[i]; ++i; } }//测试成功 void DES::P1_Divide(bool *K) { for (int i = 1; i < 57; i++)//置换 { K_p1[i] = K[PC_1[i]]; } for (int i = 1; i <= 28; i++)//分为两部分 { Ci[i] = K_p1[i]; Di[i] = K_p1[i+28]; } }//测试成功 void DES::Connect_P2(int round)// round 从零开始 { bool cur[57] = { 0 }; for (int i = 1; i <= 56; i++) { if (i <= 28) cur[i] = Ci[i]; else cur[i] = Di[i - 28]; } for (int i = 1; i <= 48; i++) { Ki[round][i] = cur[PC_2[i]];//XXXXXXXXXXXXXXXXXXXXXXXXXXX这里56错了一次,28+28=48?醉了 } }//这里曾忽略了PC-2除了置换还有压缩作用,循环的大小出错了 void DES::IP_Divide(bool* M) { bool cur[65] = { 0 }; for (int i = 1; i < 65; i++) { cur[i] = M[i]; } for (int i = 1; i < 65; i++) { Mp[i] = cur[IPchart[i]]; } for (int i = 1; i <= 64; i++) { if (i <= 32) Li[i] = Mp[i]; else Ri[i - 32] = Mp[i]; } }//测试成功 void DES::Switch_UNIP() { bool cur[65] = { 0 }; for (int i = 1; i <= 64; i++) { if (i <= 32) cur[i] = Ri[i]; else cur[i] = Li[i - 32]; } for (int i = 1; i <= 64; i++) Res[i] = cur[IP_1[i]]; } void DES::Extend() { for (int i = 1; i <= 48; i++) { Ri_48[i] = Ri[E[i]]; } } void DES::Xor(bool* a,bool* b,bool* result,int size) { for (int i = 1; i < size; i++) { result[i] = a[i] ^ b[i]; } }/*这里调用时不能直接Xor(a,b,a),内部的sizeof也不对,只能在参数里加入size在函数外进行swap*/ void DES::S() { int row = 0, col = 0; bool cur[4] = { 0 }; for (int i = 1; i <= 48; i += 6) { row = Ri_48[i] * 2 + Ri_48[i + 5]; col = Ri_48[i + 1] * 8 + Ri_48[i + 2] * 4 + Ri_48[i + 3] * 2 + Ri_48[i + 4]; OtoD(S_BOX[i/6][row][col], cur); for (int j = 0; j < 4; j++) { Ri_32[(i / 6) * 4 + 1 + j] = cur[j]; } } } void DES::P() { bool cur[33] = { 0 }; for (int i = 1; i <= 32; i++) { cur[i] = Ri_32[Pchart[i]]; } for (int i = 1; i <= 32; i++) { Ri_32[i] = cur[i]; } } void DES::DDDDDDES(char* M, char* K) { HtoD(M, Mp); HtoD(K, Key); IP_Divide(Mp); P1_Divide(Key); for (int i = 0; i < 16; i++)//生成所有子密钥 { LM(i, Ci); LM(i, Di);//此时Ci,Di已迭代完成 Connect_P2(i);// 生成Ki } for (int i = 0; i < 16; i++)//轮结构 { //F函数* Extend();//Ri 扩展位Ri_48 bool temp[49] = { 0 }; Xor(Ri_48, Ki[i], temp,49);//!!!!!!!!!!!!!!!!!!!! for (int j = 1; j < 49; j++) Ri_48[j] = temp[j]; S();//Ri_48经过S盒变换生成Ri_32 P(); // bool cur[33] = { 0 }; for (int j = 1; j <= 32; j++) { cur[j] = Li[j]; } for (int j = 1; j <= 32; j++) { Li[j] = Ri[j]; }// 迭代生成Li+1 Xor(cur, Ri_32, Ri,33);//迭代生成Ri+1 } Switch_UNIP();//生成密文,在变量Res[]中 cout << "单DES加密结果为" << endl; char temp[17]; DtoH(Res, temp); for (int i = 0; i < 17; i++) cout << temp[i]; cout << endl; } void DES::Decode(char* Sec,char* K) { HtoD(Sec, Mp); HtoD(K, Key); IP_Divide(Mp); P1_Divide(Key); for (int i = 0; i < 16; i++)//生成所有子密钥 { LM(i, Ci); LM(i, Di);//此时Ci,Di已迭代完成 Connect_P2(i);// 生成Ki } for (int i = 0; i < 16; i++)//轮结构 { //F函数****************************** Extend();//Ri 扩展位Ri_48 bool temp[49] = { 0 }; Xor(Ri_48, Ki[15-i], temp, 49);//与加密使用密钥顺序相反 for (int j = 1; j < 49; j++) Ri_48[j] = temp[j]; S();//Ri_32为经过S盒变换的结果 P(); //*********************************** bool cur[33] = { 0 }; for (int i = 0; i <= 32; i++) cur[i] = Li[i]; for (int j = 1; j <= 32; j++) { Li[j] = Ri[j]; }// 迭代生成Li+1 Xor(cur, Ri_32, Ri,33);//迭代生成Ri+1 } Switch_UNIP();//生成密文,在变量Res[]中 cout << "单DES解密结果为" << endl; char temp[17]; DtoH(Res, temp); for (int i = 0; i < 17; i++) cout << temp[i]; cout << endl; } void DES::TriDES(char* M, char* K1, char* K2) { char temp[17] = { 0 }; DDDDDDES(M, K1); DtoH(Res, temp); Decode(temp, K2); DtoH(Res, temp); DDDDDDES(temp, K1); cout << "三重加密结果为" << endl; DtoH(Res, temp); for (int i = 0; i < 17; i++) cout << temp[i]; cout << endl; } void DES::TriDecode(char* S, char* K1, char* K2) { char temp[17] = { 0 }; Decode(S, K1); DtoH(Res, temp); DDDDDDES(temp, K2); DtoH(Res, temp); Decode(temp, K1); cout << "三重解密结果为" << endl; DtoH(Res, temp); for (int i = 0; i < 17; i++) cout << temp[i]; cout << endl;
评论
    相关推荐
    • 密码学实验DES位图加密
      C语言实现的DES位图加解密,密码学第二次实验
    • 密码学——DES算法
      实现DES算法,并提供加密和解密的程序接口; 设计一个DES算法查看器,可视化输出每轮的子密钥Ki、中间结果(包括Li,Ri,f(Li,Ri),Si)及最终密文; 设计一个文本文件加密器,利用DES对文本文件进行加密和解密;
    • 网络安全领域 应用密码学 DES算法
      适合本科学习网络安全的人员,讲述c++实现DES算法
    • 密码学DES算法编程
      1、编写程序实现DES加、解密: 编程实现基于自己的名字来构造一DES密钥; 应用获得的密钥将一段英文(或文件)进行加、解密。 2、用DES实现口令的安全: 如:登陆计算机(或连接服务器)时,用户的口令作为DES的...
    • DES密码学实验
      密码学加密算法,DES的实验,是一种传统的加密算法。
    • 密码学DES加解密
      用MFC实现DES的的基本操作加密 和 解密
    • 密码学DES加密 VC++源码
      使用 VC++ 编写的 DES Console 程序 ,使用了 两个类,但是在输入加密函数前,要将数据分成64bit的数据块
    • 密码学DES算法java代码
      密码学中的DES算法的java代码 写得比较难看 多见谅
    • 密码学DES加密算法
      DES加密算法c++程序 可以对文件进行加密 解密
    • DES密码学课程设计
      对称算法又称为传统密码算法。对称算法的对称性体现在加密密钥能够从解密密钥推算出来, 反之亦然。在大多数对称算法中, 加解密的密钥是相同的。...DES算法是一种最通用的对称密钥算法, 属于分组密码算法。