DES加密算法笔记

来源:互联网 发布:stata 面板数据回归 编辑:程序博客网 时间:2024/05/02 04:42

1、文件的按位读取

对文件进行二进制的读写操作:

ifstream itxt(de_plaintext, ios::binary);

ofstream out(de_ciphertext, ios::binary);

从文件里面每次读取一个字节的数据,并将这个数据强制转换成一个8位的bitset类型,而此时的ch_8已经存储了char_temp所对应的二进制数据,每位二进制数据用unsigned int进行存储。每位数据可以用ch_8[i]来读取,用ch_8.set(i)来进行写入。之后程序里面所存取运算的数据都是由bitset来进行处理的。

itxt.read(&char_temp,1)

ch_8 = bitset<8> (char_temp);

可以用下面方法实现对文件的二进制数据的写入,而一般 sizeof(ch)都是4个字节,所以一次至少要用32位的bitset数据向文件进行写入,不足32就会填充0,所以在文件就会出现空格显示的数据。

out.write((char*)&ch, sizeof(ch));

2、一维S盒子的位操作

//分别获取4字节的int型数据的24位,即可以表示16777216个数据
a6 = (unsigned char)(i&0x0000003f);
b6 = (unsigned char)((i&0x00000fc0) >> 6);
c6 = (unsigned char)((i&0x0003f000) >> 12);
d6 = (unsigned char)((i&0x00fc0000) >> 18);


//从S盒子中取值
//s1
unsigned char t = (a6>>4 & 0x02 + a6&0x01)&0x03;
x = ((a6>>4 & 0x02) + (a6&0x01))&0x03;
y = (a6>>1)&0x0f;

a4 = S_BOX[3][x][y];

输入的是bitset<48> inArray类型的48位二进制数据。主要的步骤就是进行位操作将这48位的二进制变换成int型的数据s1,s2。然后我们就可以直接进SBox_1查第s1位的short型(2字节)数据。在用bitset<16>将其直接转码为二进制,分左右输入到outArray中,这样就进行了S转换。

   bitset<32> outArray;

int s1,s2;

s1 = s2 = 0;

int s3,s4;

int t = 0;

int i;

     for (i = 0;i < 24;i++)

{

s1 |= (t|inArray[47-i])<<(23-i);

}

for (i = 24;i < 48;i++)

{

s2 |= (t|inArray[47-i])<<(47-i);

}

s3 = sBox_1[s1];

s4 = sBox_2[s2];

bitset<16> s_l,s_r;

s_l = bitset<16>(s3);

s_r = bitset<16>(s4);

for (int i=0;i<16;i++)

{

if(s_l[i]==1){

outArray.set(i+16);

}

}

for (int i=0;i<16;i++)

{

if(s_r[i]==1){

outArray.set(i);

}

}

3、MFC的一些操作

3.1创建控件

3.2添加空间参数

3.3控件与后台的数据传递

       UpdateData(TRUE);//将控件中的变量传到后台变量

       UpdateData(false);//将后台的变量传到控件中

3.4提示框

if( key == "")
{
MessageBox("请输入密钥!!!","提示");
return;
}

要是用unicode会出错,项目右键属性--配置属性--常规--字符集 进行修改


0 0
原创粉丝点击