C++ DES 加密算法!我在网上找了很多,但是都没有返回值得!谁来帮帮我修改一下代码呢?

v1srine 2011-07-26 11:30:07
typedef        unsigned char byte;

void Des_Bit2Byte(byte *, byte *);
void Des_Byte2Bit(byte *, byte *);
void Des_DesEncry(byte *, byte *);
void Des_DesDecry(byte *, byte *);
void Des_TransPose(byte *, byte *, int);
void Des_Process(int, byte *, byte *, byte *, byte);
void Des_Lshift(byte *, byte);
void Des_Rshift(byte *, byte);

unsigned char Des_Table0[] = {
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 Des_Table1[] = {
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 Des_Table2[] = {
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};
unsigned char Des_Table3[] = {
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};
unsigned char Des_Table4[] = {
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 Des_Table5[] = {
1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1};
unsigned char Des_Table6[] = {
0, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1};
unsigned char Des_Table7[] = {
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 Des_Table8[][64] = {
{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,
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}};

/*
函数功能:根据指定的密钥进行加密,将密文填回原始的字符
传入参数:
data : 原始的字符
key : 密钥
返回参数:
*/
void DES_Encode(unsigned char * data, unsigned char * key)
{
byte data_text[64], key_text[64];

Des_Bit2Byte(data, data_text);
Des_Bit2Byte(key, key_text);
Des_DesDecry(data_text, key_text);
Des_Byte2Bit(data_text, data);
return;
}

void DES_Encode(unsigned char * pdata,int length, unsigned char * key)
{
int id;

for(id=0;id<length/8;id++)
DES_Encode(pdata+id*8,key);
return;
}

/*
函数功能:根据指定的密钥解密密文,将原始的字符填传回到密文对应的地址
传入参数:
data : 密文
key : 密钥
返回参数:
*/
void DES_Decode(unsigned char * data, unsigned char * key)
{
byte data_text[64], key_text[64];

Des_Bit2Byte(data, data_text);
Des_Bit2Byte(key, key_text);
Des_DesEncry(data_text, key_text);
Des_Byte2Bit(data_text, data);
return;
}

void DES_Decode(unsigned char * pdata, int length,unsigned char * key)
{
int id;

for(id=0;id<length/8;id++)
DES_Decode(pdata+8*id,key);
return;
}

void Des_Bit2Byte(byte *text1, byte *text2)
{
int i_temp1, i_temp2;
byte mask, c_temp1;

for (i_temp1 = 0; i_temp1 < 8; i_temp1++)
{
c_temp1 = text1[i_temp1];
mask = 0x80;
for (i_temp2 = 0; i_temp2 < 8; i_temp2++)
{
if (c_temp1 & mask)
text2[i_temp1 * 8 + i_temp2] = 1;
else
text2[i_temp1 * 8 + i_temp2] = 0;
mask >>= 1;
}
};
return;
}

void Des_Byte2Bit(byte *text1, byte *text2)
{
int i_temp1, i_temp2;
byte mask;

memset(text2, 0, 8);
for (i_temp1 = 0; i_temp1 < 8; i_temp1++)
{
mask = 0x80;
for (i_temp2 = 0; i_temp2 < 8; i_temp2++)
{
if (text1[i_temp1 * 8 + i_temp2])
text2[i_temp1] |= mask;
mask >>= 1;
}
}
return;
}

void Des_DesEncry(byte *text1, byte *key)
{
byte c_temp1[64], c_temp2[32];
int i_temp1, i_temp2;

Des_TransPose(text1, Des_Table0, 64);
Des_TransPose(key, Des_Table1, 56);
for (i_temp1 = 0; i_temp1 < 16; i_temp1++)
{
memcpy(c_temp1, text1+32, 32);
Des_Process(i_temp1, key, c_temp1, c_temp2, 'L');
for (i_temp2 = 0; i_temp2 < 32; i_temp2++)
if (text1[i_temp2] == c_temp2[i_temp2])
c_temp1[i_temp2 + 32] = 0;
else
c_temp1[i_temp2 + 32] = 1;
memcpy(text1, c_temp1, 64);
}
memcpy(text1, c_temp1+32, 32);
memcpy(text1+32, c_temp1, 32);
Des_TransPose(text1, Des_Table3, 64);
return;
}

void Des_DesDecry(byte *text1, byte *key)
{
byte c_temp1[64], c_temp2[32];
int i_temp1, i_temp2;

Des_TransPose(text1, Des_Table0, 64);
memcpy(c_temp2, text1+32, 32);
memcpy(text1+32, text1, 32);
memcpy(text1, c_temp2, 32);
Des_TransPose(key, Des_Table1, 56);
for (i_temp1 = 0; i_temp1 < 16; i_temp1++)
{
memcpy(c_temp1 + 32, text1, 32);
Des_Process(i_temp1, key, c_temp1 + 32, c_temp2, 'R');
for (i_temp2 = 0; i_temp2 < 32; i_temp2++)
if (text1[i_temp2 + 32] == c_temp2[i_temp2])
c_temp1[i_temp2] = 0;
else
c_temp1[i_temp2] = 1;
memcpy(text1, c_temp1, 64);
}
Des_TransPose(text1, Des_Table3, 64);
return;
}

void Des_TransPose(byte *text, byte *table, int index)
{
byte c_temp1[64];
int i_temp1;

memcpy(c_temp1, text, 64);
for (i_temp1 = 0; i_temp1 < index; i_temp1++)
text[i_temp1] = c_temp1[table[i_temp1] - 1];
return;
}

void Des_Process(int i, byte *key, byte *R32, byte *PB, byte flag)
{
byte extr32[48], extkey[56], c_temp1;
int i_temp1;

memcpy(extr32, R32, 32);
Des_TransPose(extr32, Des_Table4, 48);

if (toupper(flag) == 'L')
Des_Lshift(key, Des_Table5[i]);
else
Des_Rshift(key, Des_Table6[i]);

memcpy(extkey, key, 56);
Des_TransPose(extkey, Des_Table2, 48);

for (i_temp1 = 0; i_temp1 < 48; i_temp1++)
if (extr32[i_temp1] == extkey[i_temp1])
extr32[i_temp1] = 0;
else
extr32[i_temp1] = 1;

for (i_temp1 = 0; i_temp1 < 8; i_temp1++)
{
c_temp1 = (byte)(extr32[i_temp1 * 6] * 32 +
extr32[i_temp1 * 6 + 5] * 16 +
extr32[i_temp1 * 6 + 1] * 8 +
extr32[i_temp1 * 6 + 2] * 4 +
extr32[i_temp1 * 6 + 3] * 2 +
extr32[i_temp1 * 6 + 4]);
c_temp1 = Des_Table8[i_temp1][c_temp1];
if (c_temp1 >= 8)
{
PB[i_temp1 * 4] = 1;
c_temp1 = (byte)(c_temp1 - 8);
}
else
PB[i_temp1 * 4] = 0;
if (c_temp1 >= 4)
{
PB[i_temp1 * 4 + 1] = 1;
c_temp1 = (byte)(c_temp1 - 4);
}
else
PB[i_temp1 * 4 + 1] = 0;
if (c_temp1 >= 2)
{
PB[i_temp1 * 4 + 2] = 1;
c_temp1 = (byte)(c_temp1 - 2);
}
else
PB[i_temp1 * 4 + 2] = 0;
if (c_temp1 >= 1)
PB[i_temp1 * 4 + 3] = 1;
else
PB[i_temp1 * 4 + 3] = 0;
}
Des_TransPose(PB, Des_Table7, 32);
return;
}

void Des_Lshift(byte *key, byte cnt)
{
byte c_temp1, c_temp2;
int i_temp1,i_temp2;

for (i_temp2 = 0; i_temp2 < cnt; i_temp2++)
{
c_temp1 = key[0];
c_temp2 = key[28];
for (i_temp1 = 0; i_temp1 < 55; i_temp1++)
key[i_temp1] = key[i_temp1 + 1];
key[27] = c_temp1;
key[55] = c_temp2;
}
return;
}

void Des_Rshift(byte *key, byte cnt)
{
byte c_temp1, c_temp2;
int i_temp1,i_temp2;

for (i_temp2 = 0; i_temp2 < cnt; i_temp2++)
{
c_temp1 = key[27];
c_temp2 = key[55];
for (i_temp1 = 55; i_temp1 >0; i_temp1--)
key[i_temp1] = key[i_temp1 - 1];
key[0] = c_temp1;
key[28] = c_temp2;
}
return;
}



这里的函数都是 void 不能返回值呢!闷闷的
...全文
288 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
v1srine 2011-07-27
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 kfrght 的回复:]
des加密有一点是p的长度必须是8的整倍数
[/Quote]

恩!但是C++加密跟DELPHI加密的结果不一样哦!D的加密结果是全字母数字的.C++加了是乱码 - -
v1srine 2011-07-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ccrun 的回复:]
这些函数的入参也是出参。运算后的结果还在那个参数中。
[/Quote]

那我怎么获得出参呢?

DES_Encode((unsigned char *)Edit1->Text.c_str(), (unsigned char *)Edit2->Text.c_str());
我这样写的哦!
ccrun.com 2011-07-26
  • 打赏
  • 举报
回复
这些函数的入参也是出参。运算后的结果还在那个参数中。
v1srine 2011-07-26
  • 打赏
  • 举报
回复
或许给我发一份吧!谢谢!

AES DES MD5等等这些的解密算法如果有也给我发一份吧!
facr@qq.com
谢谢!
宝龙哥 2011-07-26
  • 打赏
  • 举报
回复
des加密有一点是p的长度必须是8的整倍数
v1srine 2011-07-26
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 kfrght 的回复:]
加密后的数据用控件显示出来是不怎么有意义的,转16进制的话长度会增加,解密的时候还要先还原回去
[/Quote]
噢 !谢谢
宝龙哥 2011-07-26
  • 打赏
  • 举报
回复
加密后的数据用控件显示出来是不怎么有意义的,转16进制的话长度会增加,解密的时候还要先还原回去
v1srine 2011-07-26
  • 打赏
  • 举报
回复
int nLen = Edit1->Text.Length();
unsigned char *p = new byte[nLen];
memcpy(p, Edit1->Text.c_str(), nLen);
DES_Encode(p, (unsigned char *)Edit2->Text.c_str());
Memo1->Text = (unsigned char)p;
delete []p;

我这样做的话。无论EDit2 是什么都是现实128哦!
v1srine 2011-07-26
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 ccrun 的回复:]
p是byte *,直接代入Memo1->Text肯定不行撒。加密后的数据一般都是二进制的,你即使查看也是乱码,除非以十六进制形式显示出来。
[/Quote]

前辈。能不能教教我怎么做呢 - -!!!
宝龙哥 2011-07-26
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 v1srine 的回复:]
我直接Memo1->Text = P; 不行哦!
[/Quote]

你的是unsigned char用static_cast<AnsiString>(p)或(char *)x就可以了,但是你的情况特殊,主要是加密后的数据可能是2进制的(就是说其中可能含有大量的不可见字符),转换后不被Memo1识别或显示结果被截断或不显示,或显示乱码,你用还原函数还原后看看能不能显示出原来的数据就可以了
ccrun.com 2011-07-26
  • 打赏
  • 举报
回复
p是byte *,直接代入Memo1->Text肯定不行撒。加密后的数据一般都是二进制的,你即使查看也是乱码,除非以十六进制形式显示出来。
v1srine 2011-07-26
  • 打赏
  • 举报
回复
我直接Memo1->Text = P; 不行哦!
v1srine 2011-07-26
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 kfrght 的回复:]
引用 6 楼 v1srine 的回复:
引用 4 楼 ccrun 的回复:
如果是C++Builder6:

int nLen = Edit1->Text.Length();
byte *p = new byte[nLen];
memcpy(p, Edit1->Text.c_str(), nLen);
DES_Encode(p, (unsigned char *)Edit2->Tex……
[/Quote]

加密之后我怎么读取加密后的内容呢?
宝龙哥 2011-07-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 v1srine 的回复:]
引用 4 楼 ccrun 的回复:
如果是C++Builder6:

int nLen = Edit1->Text.Length();
byte *p = new byte[nLen];
memcpy(p, Edit1->Text.c_str(), nLen);
DES_Encode(p, (unsigned char *)Edit2->Text.c_str());
...
del……
[/Quote]

意思就是
void DES_Encode(unsigned char * data, unsigned char * key)
中的unsigned char * data或
void DES_Encode(unsigned char * pdata,int length, unsigned char * key)
中的unsigned char * pdata指向的内存中,在函数完成后就存着返回值,虽然它们开始时是存的要加密的数据
v1srine 2011-07-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ccrun 的回复:]
如果是C++Builder6:

int nLen = Edit1->Text.Length();
byte *p = new byte[nLen];
memcpy(p, Edit1->Text.c_str(), nLen);
DES_Encode(p, (unsigned char *)Edit2->Text.c_str());
...
delete []p;
[/Quote]

有点不太明白怎么获取 - -

int nLen = Edit1->Text.Length();
byte *p = new byte[nLen];
memcpy(p, Edit1->Text.c_str(), nLen);
DES_Encode(p, (unsigned char *)Edit2->Text.c_str());
Memo1->Text = P;
delete []p;
宝龙哥 2011-07-26
  • 打赏
  • 举报
回复
char *一般不作为函数的返回值,而是作为参数传递到函数中,由函数在函数内部赋值。你可以在函数外面定义好指针,作为参数传递进函数
ccrun.com 2011-07-26
  • 打赏
  • 举报
回复
如果是C++Builder6:

int nLen = Edit1->Text.Length();
byte *p = new byte[nLen];
memcpy(p, Edit1->Text.c_str(), nLen);
DES_Encode(p, (unsigned char *)Edit2->Text.c_str());
...
delete []p;
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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