这个des算法错在哪

Robinhoodgood 2003-12-22 07:53:37
写了一个des算法,请高手帮我看看

#include<iostream>
using namespace std;
void getSubKey( unsigned char (*subK)[48], unsigned char* k );
void des( unsigned char* m );
void _des( unsigned char* m );
unsigned char k[]="program";

int main() {

unsigned char m[]="computer";
unsigned char subK[16][48];
getSubKey(subK,k);
/*cout<<"子密钥:"<<endl;
for ( int i = 0; i < 48; ++i ) {
cout<<int(subK[0][i]);
if ((i+1) % 8 == 0 ) cout<<endl;
}*/
//des(m);

cout<<m<<endl;
des(m);
cout<<m<<endl;
_des(m);
cout<<m<<endl;
system("pause");
}

void getSubKey( unsigned char (*subK)[48], unsigned char* k ) {
unsigned char a[56];
unsigned char c[28],d[28];
unsigned char LS[16] = {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
unsigned char 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 };
unsigned char 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 < 56; ++i )
{ if ( PC_1[i] < 8 ) continue;
else if ( PC_1[i] < 16 ) PC_1[i] -= 1;
else if ( PC_1[i] < 24 ) PC_1[i] -= 2;
else if ( PC_1[i] < 32 ) PC_1[i] -= 3;
else if ( PC_1[i] < 40 ) PC_1[i] -= 4;
else if ( PC_1[i] < 48 ) PC_1[i] -= 5;
else if ( PC_1[i] < 56 ) PC_1[i] -= 6;
else if ( PC_1[i] < 64 ) PC_1[i] -= 7;
}
for ( int i = 0; i < 7; ++i )
for ( int j = 0; j < 8; ++j )
a[8*i+j] = (k[i]>>7-j) & 1;

cout<<"program:"<<endl;
for ( int i = 0; i < 7; ++i )
{ for ( int j = 0; j < 8; ++j )
cout<<int(a[8*i+j]);
cout<<endl;} //test miwen

for ( int i = 0; i < 28; ++i )
c[i] = a[ PC_1[i]-1 ];

cout<<"C0:"<<endl;
for ( int i = 0; i < 28; ++i )
{ cout<<int(c[i]);
if ( (i+1) % 8 == 0 ) cout<<" ";


}
cout<<endl; //test c0
system("pause");

for ( int i = 28; i < 56; ++i )
d[ i-28 ] = a[ PC_1[i]-1 ]; //PC_1

cout<<"D0:"<<endl;
for ( int i = 0; i < 28; ++i )
{ cout<<int(d[i]);
if ( (i+1) % 8 == 0 ) cout<<" ";


}
cout<<endl; //test d0
system("pause");

/*cout<<"a[3]="<<int(a[3])<<endl;
for ( int j = 0; j < 28; ++j )
cout<<int(d[j])<<" ";
cout<<endl; //test d[28]*/

for ( int i = 0; i < 16; ++i ) {
if ( LS[i] == 1 ) {
unsigned tmp = c[0];


for ( int j = 0; j < 27; ++j )
c[j] = c[j+1];
c[27] = tmp;
/*for ( int j = 0; j < 28; ++j )
cout<<int(c[j])<<" ";
cout<<endl;*/
tmp = d[0];
for ( int j = 0; j < 27; ++j )
d[j] = d[j+1];
d[27] = tmp;
}
else {
unsigned char tmp1 = c[0];
unsigned char tmp2 = c[1];
for ( int j = 0; j < 26; ++j )
c[j] = c[j+2];
c[26] = tmp1;
c[27] = tmp2;

tmp1 = d[0];
tmp2 = d[1];
for ( int j = 0; j < 26; ++j )
d[j] = d[j+2];
d[26] = tmp1;
d[27] = tmp2;
}
for ( int i = 0; i < 28; ++i )
a[i] = c[i];
for ( int i = 28; i < 56; ++i )
a[i] = d[ i-28 ];
/*for ( int i = 0 ; i< 28; ++i )
{ cout<<int(c[i])<<" ";
if ( (i+1) % 8 == 0 ) cout<<endl;
}
system("pause");
*/
for ( int j = 0; j < 48; ++j )
subK[i][j] = a[ PC_2[j]-1 ]; //PC_2
}

} //getSubKey

...全文
65 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
applexgw 2004-01-14
  • 打赏
  • 举报
回复
网上很多的

自己搜
BlueSky2008 2004-01-14
  • 打赏
  • 举报
回复
到codeproject搜搜吧
ljranby 2004-01-14
  • 打赏
  • 举报
回复
结果是什么样呢?
你遇到的问题是得到的密文不能正确解密吗?
如果是这样就比较麻烦,得你自己从程序一点一点查起
我以前也遇到过,结果发现是一个S盒敲错了,ft!!
其实DES得到的密文不一定都一样,只要密文能正确解密就可以了。
Robinhoodgood 2004-01-08
  • 打赏
  • 举报
回复
有人可以提供可用的des源代码也可以
Robinhoodgood 2004-01-08
  • 打赏
  • 举报
回复
具体做法我知道,现在我想知道实现的时候,哪里错了???
短歌如风 2003-12-22
  • 打赏
  • 举报
回复
代码看起来很费劲。
说一下算法你自己对照一下实现思路吧:
DES的算法思路是最常用的分组密码方案:

1:把一个分组分成L和R两个等长的子分组;
2:迭代N次:
L[i] = R[i - 1]
L[i] = L[i - 1] xor F(R[i - 1], i);
解密时相反。

DES在迭代前加了一次初转换,迭代后加了一次末转换。迭代次数为16。
F函数在DES中为:
1:扩展变换,由32位子分组扩展为48位;目的是完成扩散。
2:应用密钥,与第i组48位密钥异或。
3:S盒变换,进行非线性的变换以阻止分析。

一般用软件实现DES时不会象你这样直接实现,通常会把初转换、末转换和S盒变换用预生成的映射表来完成,效率高的多,并且不容易错。
Robinhoodgood 2003-12-22
  • 打赏
  • 举报
回复
自己up
cygandti 2003-12-22
  • 打赏
  • 举报
回复
倒,仔细看看!
Robinhoodgood 2003-12-22
  • 打赏
  • 举报
回复
有点长,勿怪勿怪^_^
Robinhoodgood 2003-12-22
  • 打赏
  • 举报
回复
void des( unsigned char* m ) {
unsigned char a[64],t[64],L[32],R[32];
unsigned char subK[16][48];
getSubKey( subK, k );

cout<<"子密钥"<<endl; //得到子密钥
for ( int i = 0; i < 48; ++i )
{ cout<<int(subK[0][i]);
if( (i+1) %8 == 0 ) cout<<endl;
}
system("pause");//test

for ( int i = 0; i < 8; ++i ) {
for ( int j = 0; j < 8; ++j )
a[8*i+j] = ( m[i]>>7-j) & 1;
}
cout<<"mmmmm:"<<endl;
for ( int i = 0; i < 64; ++i )
{
cout<<int(a[i]);
if ( (i+1) % 8 == 0 ) cout<<endl;
} //test a[]
//cout<<endl;
unsigned char IP[64] = {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
};
unsigned char _IP[64] = {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
};

for ( int i = 0; i < 64; ++i )
t[i] = a[ IP[i]-1 ];//IP变换

for ( int i = 0; i < 32; ++i )
L[i] = t[i];
for ( int i = 32; i <64; ++i )
R[i-32] = t[i];

cout<<"M IP bianhuan hou:"<<endl;
for ( int i = 0; i < 8; ++i ) {
for ( int j = 0; j < 8; ++j )
cout<<int(t[8*i+j]);
cout<<endl;
}
system("pause");

unsigned char tmp[32];
for ( int i = 0; i < 16; ++i ) { //1 ci
for ( int j = 0; j < 32; ++j ) {
tmp[j] = L[j];
L[j] = R[j];
}
//cout<<"ok"<<endl;
f(R,subK,i); //修改R
//cout<<"ok"<<endl;
for ( int j = 0; j < 32; ++j)
R[j] ^= tmp[j];
//----------------------

for ( int I = 0; I < 32; ++I )
t[I] = L[I];
for ( int i1 = 0; i1 < 32; ++i1 )
t[32+i1] = R[i1];

cout<<i+1<<" die dai hou:"<<endl; //test
for ( int j = 0; j < 64; ++j )
{ cout<<int(t[j]);
if ( (j+1)%8 == 0 ) cout<<endl;
}
system("pause");

//-----------------
}

for ( int i = 0; i < 32; ++i )
t[i] = L[i];
for ( int i = 0; i < 32; ++i )
t[32+i] = R[i];

cout<<"_IP bian huan qian 16 die dai hou:"<<endl;
for ( int i = 0; i < 64; ++i )
{
cout<<int(t[i]);
if ( (i+1) % 8 == 0 ) cout<<endl;
} //test t[]

system("pause");

for ( int i = 0; i < 64; ++i )
a[i] = t[ _IP[i]-1 ]; //_IP变换

cout<<"miwen:"<<endl;
for ( int i = 0; i < 64; ++i )
{
cout<<int(a[i]);
if ( (i+1) % 8 == 0 ) cout<<endl;
} //test a[]

for ( int i = 0; i < 8; ++i ) {
m[i] = 0;
for ( int j = 0; j < 8; ++j )
m[i] += a[8*i+j]<<7-j;//修改明文
}
/* //test subk
for ( int i = 0; i < 16; ++i )
{ for ( int j = 0; j < 48; ++j )
{ cout<<int(subK[i][j]);
//if ( (j+1)%16 == 0 ) cout<<endl;
}
cout<<endl;} */
/*cout<<endl;
cout<<"密文:"<<endl;
for ( int i = 0; i < 8; ++i ) {
for ( int j = 0; j < 8; ++j )
cout<<int(a[8*i+j]); //密文
cout<<endl;
}*/
//cout<<m<<endl;

}

void _des( unsigned char* m )
{

unsigned char a[64],t[64],L[32],R[32];
unsigned char subK[16][48];
getSubKey( subK, k );

/*cout<<"子密钥"<<endl; //得到子密钥
for ( int i = 0; i < 48; ++i )
{ cout<<int(subK[0][i]);
if( (i+1) %8 == 0 ) cout<<endl;
}
system("pause");//test*/

for ( int i = 0; i < 8; ++i ) {
for ( int j = 0; j < 8; ++j )
a[8*i+j] = ( m[i]>>7-j) & 1;
}
//cout<<endl;
unsigned char IP[64] = {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
};
unsigned char _IP[64] = {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
};

for ( int i = 0; i < 64; ++i )
t[i] = a[ IP[i]-1 ];//IP变换

for ( int i = 0; i < 32; ++i )
L[i] = t[i];
for ( int i = 32; i <64; ++i )
R[i-32] = t[i];

/* for ( int i = 0; i < 8; ++i ) {
for ( int j = 0; j < 8; ++j )
cout<<int(t[8*i+j]);
cout<<endl;
}*/

unsigned char tmp[32];
for ( int i = 0; i < 16; ++i ) { //1 ci
for ( int j = 0; j < 32; ++j ) {
tmp[j] = L[j];
L[j] = R[j];
}
//cout<<"ok"<<endl;
f(R,subK,15-i); //修改R
//cout<<"ok"<<endl;
for ( int j = 0; j < 32; ++j)
R[j] ^= tmp[j];
//----------------------
/*
for ( int I = 0; I < 32; ++I )
t[I] = L[I];
for ( int i1 = 0; i1 < 32; ++i1 )
t[32+i1] = R[i1];
for ( int j = 0; j < 64; ++j )
{ cout<<int(t[j]);
if ( (j+1)%8 == 0 ) cout<<endl;
}
system("pause");
*/
//-----------------
}

for ( int i = 0; i < 32; ++i )
t[i] = L[i];
for ( int i = 0; i < 32; ++i )
t[32+i] = R[i];

for ( int i = 0; i < 64; ++i )
a[i] = t[ _IP[i]-1 ]; //_IP变换

for ( int i = 0; i < 64; ++i )
{
cout<<int(a[i]);
if ( (i+1) % 8 == 0 ) cout<<endl;
}//test a[]

for ( int i = 0; i < 8; ++i ) {
m[i] = 0;
for ( int j = 0; j < 8; ++j )
m[i] += a[8*i+j]<<7-j;//修改明文
}
/*
cout<<endl;
cout<<"密文:"<<endl;
for ( int i = 0; i < 8; ++i ) {
for ( int j = 0; j < 8; ++j )
cout<<int(a[8*i+j]); //密文
cout<<endl;
}
//cout<<m<<endl;
*/

}
Robinhoodgood 2003-12-22
  • 打赏
  • 举报
回复
void f( unsigned char* r, unsigned char (*subK)[48], int n ) {
unsigned char a[48],R[32];
unsigned char E[48] = {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 };
unsigned char P[32] = {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 };
unsigned char S[8][4][16]= {
{{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}},

{{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}},

{{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},//g
{1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12}},

{{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}},

{{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}},

{{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}},

{{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}},

{{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}} };

for ( int i = 0; i < 32; ++i )
R[i] = r[i]; //R为临时的

/*for ( int i = 0; i < 48; ++i )
{ cout<<int(a[i])<<" ";
if ( (i+1) % 8 == 0 ) cout<<endl;
} //test a[i]
*/
/* for ( int i = 0; i < 32; ++i )
{ cout<<int(r[i])<<" ";
if ( (i+1) % 8 == 0 ) cout<<endl;
} //test R[i]
*/
//cout<<"E bianhuan:"<<endl;
for ( int i = 0; i < 48; ++i )
{ a[i] = R[ E[i]-1 ];
//if ( (i+1)%8==0 ) cout<<endl;
}
//system("pause");


for ( int i = 0; i < 48; ++i )
a[i] ^= subK[n][i];

/*cout<<"k yihuo:"<<endl;
for ( int i = 0; i < 8; ++i )
{ for ( int j = 0; j < 6; ++j )
cout<<int(a[6*i+j]);
cout<<endl;
}
system("pause"); //test a[i]
*/
for ( int i = 0,t1,t2; i < 8; ++i ) {
t1 = (a[6*i+0]<<1) + a[6*i+5];
t2 = 0;
for ( int j = 1; j < 5; ++j )
t2 = (t2<<1) + a[6*i+j];

//cout<<"t1="<<t1<<endl;
// cout<<"t2="<<t2<<" S=";
//cout<<int(S[i][t1][t2])<<endl;
//cout<<"KKK"<<i<<endl;
for ( int k = 3; k >= 0; --k )
R[4*i+k] = (S[i][t1][t2]>>3-k) & 1;

}

/*cout<<"s he:"<<endl;
for ( int i = 0; i < 32; ++i )
{ cout<<int(R[i]);
if ( (i+1) % 8 == 0 ) cout<<endl;
} //test r[i]
system("pause");*/

for ( int i = 0; i < 32; ++i )
r[i] = R[ P[i]-1 ];
/*
cout<<"P zhihuan:"<<endl;
for ( int i = 0; i < 32; ++i )
{ cout<<int(r[i]);
if ( (i+1) % 8 == 0 ) cout<<endl;
} //test r[i]
system("pause");
*/
}


33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧