DEC_code.rar

  • PUDN用户
    了解作者
  • Visual C++
    开发工具
  • 3KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 5
    下载次数
  • 2011-12-15 21:09
    上传日期
DEC编解码,采用面向对象实现,包含编码及解码两部分,方便大家需要。
DEC_code.rar
  • DEC_code.cpp
    8.1KB
内容介绍
#include <iostream> #include <fstream> using namespace std; const static char ip[] = { //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 }; const static char fp[] = { //zuizhongzhihuan 40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31, 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29, 36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27, 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25 }; const static char sbox[8][64] = { //s_box /* S1 */ 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8, 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0, 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13, /* S2 */ 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10, 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5, 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15, 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9, /* S3 */ 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8, 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1, 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7, 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12, /* S4 */ 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15, 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9, 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4, 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14, /* S5 */ 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9, 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6, 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14, 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3, /* S6 */ 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11, 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8, 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6, 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13, /* S7 */ 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1, 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6, 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2, 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12, /* S8 */ 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7, 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2, 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8, 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11 }; const static char rar[] = { //ya suo zhi huan 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 }; const static char ei[] = { //kuo zhan zhi huan 32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17, 16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25, 24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32, 1 }; const static char Pzh[]={ //P置换 16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10, 2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25 }; const static char Keyrar[]={ 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 }; bool key[16][48]={0},/*rekey[16][48],*/ char key_in[8]; void ByteToBit(bool *Out,char *In,int bits) //字节到位的转换 { int i; for(i=0;i<bits;i++) Out[i]=(In[i/8]>>(i%8))&1; } void BitToByte(char *Out,bool *In,int bits) //位到字节转换 { for(int i=0;i<bits/8;i++) Out[i]=0; for(i=0;i<bits;i++) Out[i/8]|=In[i]<<(i%8); //"|="组合了位操作符和赋值操作符的功能 } void Xor(bool *InA,const bool *InB,int len) //按位异或 { for(int i=0;i<len;i++) InA[i]^=InB[i]; } void keyfc(char *In) //获取密钥函数 { int i,j=0,mov,k; bool key0[56],temp,keyin[64]; ByteToBit(keyin,In,64); //字节到位的转换 for(i=0;i<56;i++) //密钥压缩为56位 key0[i]=keyin[Keyrar[i]-1]; for(i=0;i<16;i++) //16轮密钥产生 { if(i==0||i==1||i==8||i==15) mov=1; else mov=2; for(k=0;k<mov;k++) //分左右两块循环左移 { for(int m=0;m<8;m++) { temp=key0[m*7]; for(j=m*7;j<m*7+7;j++) key0[j]=key0[j+1]; key0[m*7+6]=temp; } temp=key0[0]; for(m=0;m<27;m++) key0[m]=key0[m+1]; key0[27]=temp; temp=key0[28]; for(m=28;m<55;m++) key0[m]=key0[m+1]; key0[55]=temp; } for(j=0;j<48;j++) //压缩置换并储存 key[i][j]=key0[rar[j]-1]; } } void DES(char Out[8],char In[8],bool MS)//加密核心程序,ms=0时加密,反之解密 { bool MW[64],tmp[32],PMW[64]; //注意指针 bool kzmw[48],keytem[48],ss[32]; int hang,lie; ByteToBit(PMW,In,64); for(int j=0;j<64;j++) { MW[j]=PMW[ip[j]-1]; //初始置换 } bool *Li=&MW[0],*Ri=&MW[32]; for(int i=0;i<48;i++) //右明文扩展置换 kzmw[i]=Ri[ei[i]-1]; //注意指针 if(MS==0) //DES加密过程 { for(int lun=0;lun<16;lun++) { for(i=0;i<32;i++) ss[i]=Ri[i]; for(i=0;i<48;i++) //右明文扩展置换 kzmw[i]=Ri[ei[i]-1]; //注意指针 for(i=0;i<48;i++) keytem[i]=key[lun][i]; //轮密钥 Xor(kzmw,keytem,48); /*S盒置换*/ for(i=0;i<8;i++) { hang=kzmw[i*6]*2+kzmw[i*6+5]; lie =kzmw[i*6+1]*8+kzmw[i*6+2]*4+kzmw[i*6+3]*2+kzmw[i*6+4]; tmp[i*4+3]=sbox[i][(hang+1)*16+lie]%2; tmp[i*4+2]=(sbox[i][(hang+1)*16+lie]/2)%2; tmp[i*4+1]=(sbox[i][(hang+1)*16+lie]/4)%2; tmp[i*4]=(sbox[i][(hang+1)*16+lie]/8)%2; } for(int i=0;i<32;i++) //P置换 Ri[i]=tmp[Pzh[i]-1]; Xor(Ri,Li,32); //异或 for(i=0;i<32;i++) //交换左右明文 { Li[i]=ss[i]; } } for(i=0;i<32;i++) { tmp[i]=Li[i]; Li[i]=Ri[i]; Ri[i]=tmp[i]; } for(i=0;i<64;i++) PMW[i]=MW[fp[i]-1]; BitToByte(Out,PMW,64); //位到字节的转换 } else //DES解密过程 { for(int lun=15;lun>=0;lun--) { for(i=0;i<32;i++) ss[i]=Ri[i]; for(int i=0;i<48;i++) //右明文扩展置换 kzmw[i]=Ri[ei[i]-1]; //注意指针 for(i=0;i<48;i++) keytem[i]=key[lun][i]; //轮密钥 Xor(kzmw,keytem,48); /*S盒置换*/ for(i=0;i<8;i++) { hang=kzmw[i*6]*2+kzmw[i*6+5]; lie =kzmw[i*6+1]*8+kzmw[i*6+2]*4+kzmw[i*6+3]*2+kzmw[i*6+4]; tmp[i*4+3]=sbox[i][(hang+1)*16+lie]%2; tmp[i*4+2]=(sbox[i][(hang+1)*16+lie]/2)%2; tmp[i*4+1]=(sbox[i][(hang+1)*16+lie]/4)%2; tmp[i*4]=(sbox[i][(hang+1)*16+lie]/8)%2; } for(i=0;i<32;i++) //P置换 Ri[i]=tmp[Pzh[i]-1]; Xor(Ri,Li,32); //异或 for(i=0;i<32;i++) //交换左右明文 { Li[i]=ss[i]; } } for(i=0;i<32;i++) { tmp[i]=Li[i]; Li[i]=Ri[i]; Ri[i]=tmp[i]; } for(i=0;i<64;i++) PMW[i]=MW[fp[i]-1]; BitToByte(Out,PMW,64); //位到字节的转换 } } void main() { char Ki[8],jm[8],final[8]; int i0; cout<<"请输入密钥(8字节):"<<endl; for(i0=0;i0<8;i0++) cin>>Ki[i0]; // if(i0<8) // for(i0=0;i0<8;i0++) // cin//[i0];
评论
    相关推荐
    • DEC2812_code.rar
      DEC2812开发板上的源程序供大家学习!
    • ED_DEC_CODE.zip
      线性分组码汉明码的matlab程序实现,下载后直接运行即可
    • convolutional_code.zip
      Convolution code, binary symmetric channel
    • cyclic code.rar
      cyclic ofdm matlab code
    • Dec2020JavaCode:2020年12月的Java代码批处理
      Dec2020JavaCode:2020年12月的Java代码批处理
    • bin2dec
      ReactJS在Bin2Dec项目中的应用 bin2dec学生项目 | | | :laptop:关于项目 等级: 1-初学者 二进制是所有数字计算机所基于的数字系统。 因此,对于开发人员而言,理解二进制或基础2数学非常重要。 Bin2Dec的目的是...
    • my login code
      my login code, business logic inside
    • code-editor:UM简单编辑器decódigo
      :bomb: 代码编辑器 Um Projeto criado a partir de um desafio proposto na ...$ cd code-editor # Instalar as dependências $ npm install # Agora só executar :partying_face: $ npm start :spiral_notepad: 状
    • scheduling matlab code
      matlab PN code scheduling matlab code scheduling matlab code scheduling matlab code
    • dec_code_final_.zip
      Descryptor for encrypted data