请教如何加密解密字符串
请诸位达人能否发给在下一个加密\解密程序的操作源码或相关控件,作用是加密字符串,加密方法MD5,DES,什么都行,有的朋友说CB自带MD5,可惜我找不着,我想把从用户那里获取的硬盘,CPU,及网卡ID给加密了,传到这边来后再解密,如果诸位达人有这样的成形代码一并发给在下,非常感谢! 问题点数:100、回复次数:9Top
1 楼cczlp(不惑)回复于 2005-05-12 07:45:46 得分 10
MD5是用来进行信息认证(数字签名)的,不能进行加密.不论多长的信息,一个字节或10G字节,
MD5都提取16字节的摘要.根据这16字节无法还原原来数据,否则企不是可以把整个硬盘数据压缩成16字节.Top
2 楼cczlp(不惑)回复于 2005-05-12 07:47:46 得分 0
DES在网上有大量源码,可以搜索一下.3DES的也有Top
3 楼happyct(绿叶对大树的情怀)回复于 2005-05-12 08:57:56 得分 50
最简单的一段:
String __fastcall TGetMsgForm::JiaMi(String SourceStr) //加密
{
String RetStr="";
for (int i=1;i<=SourceStr.Length();i++)
{
char c=SourceStr[i];
int h=(c>>4)&0xf; // 高4位
int l=c&0xf; // 低4位
RetStr=RetStr+(char)('a'+h)+(char)('a'+l);
}
return(RetStr);
}
String __fastcall TForm1::JieMi(String SourceStr) // 解密
{
String RetStr="";
for (int i=1;i<=SourceStr.Length();i=i+2)
{
int h=(SourceStr[i]-'a');
int l=(SourceStr[i+1]-'a');
char c=(h<<4)+(l&0xf);
RetStr=RetStr+c;
}
return(RetStr);
Top
4 楼netsys2(来电!)回复于 2005-05-12 10:03:06 得分 10
用俺做的控件吧:
http://community.csdn.net/Expert/TopicView.asp?id=3818406Top
5 楼NetSpider9804040(网络蛛蛛)回复于 2005-05-12 10:11:15 得分 0
用MD5,网上应该有很多C的加密单元,将其加入你的工程中,就Ok啦!Top
6 楼zsgbox(天心难测)回复于 2005-05-12 10:52:48 得分 0
To: netsys2(来电!)是免费的吗?Top
7 楼netsys2(来电!)回复于 2005-05-12 11:49:22 得分 0
免费的!Top
8 楼h98458(零点起飞)回复于 2005-05-12 13:16:58 得分 20
下面的程序已经在Bcb5下通过
#include
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
AnsiString PassWord(AnsiString cz0003_6,int cz0003_a)
{
// 字符串加解密处理函数
// 参数说明:cz0003_6 --- 待处理字符串
// cz0003_a --- 处理方式(1.加密;-1.解密)
AnsiString cz0003_0,cz0003_1,cz0003_2,cz0003_3,cz0003_4,cz0003_8;
int cz0003_7,cz0003_5,cz0003_9;
AnsiString s1,s2;
cz0003_0="西藏大昌实业集团";
cz0003_1="大昌网络有限公司";
cz0003_2="旅游产品分销系统";
cz0003_3="版本 Ver 1.0";
cz0003_4=cz0003_0+cz0003_1; // 加密字符串
cz0003_5=cz0003_4.Length(); // 加密字符串长度
cz0003_8=""; // 加密后的字符串
cz0003_9=0;
if(cz0003_a==-1)
{
for(cz0003_7=1;cz0003_7<=cz0003_6.Length();cz0003_7++)
{
//s1:=copy(cz0003_6,cz0003_7,1);
s1 = cz0003_6.SubString(cz0003_7,1);
//s2:=copy(cz0003_4,(cz0003_7-1) mod cz0003_5+1,1);
s2 = cz0003_4.SubString((cz0003_7-1) % cz0003_5+1,1);
cz0003_9=int(s1[1])-int(s2[1]);
if(cz0003_9<0)
cz0003_8=cz0003_8+String(char(cz0003_9+256));
else
cz0003_8=cz0003_8+String(char(cz0003_9));
}
}else{ // 加运算
for(cz0003_7=1;cz0003_7<=cz0003_6.Length();cz0003_7++)
{
s1=cz0003_6.SubString(cz0003_7,1);
s2=cz0003_4.SubString((cz0003_7-1) % cz0003_5+1,1);
cz0003_9=int(s1[1])+int(s2[1]);
if(cz0003_9>255)
cz0003_8=cz0003_8+String(char(cz0003_9-256));
else
cz0003_8=cz0003_8+String(char(cz0003_9));
}
}
cz0003_6=cz0003_8;
return cz0003_8;
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Label1->Caption=PassWord("I love you",1);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Label1->Caption=PassWord(Label1->Caption,-1);
}
//-----------------------------------------------------------------
Top
9 楼weill(每天提一问,一天学一点)回复于 2005-05-12 15:52:21 得分 10
对楼主本人以菜鸟的立场提出以下建议:
1、不要用什么MD5啊、DES啊,太过麻烦,会累死人的。
2、先把字串中的每一个字母转成ASCII的十六进制,然后再给它来一次运算(规则当然是自个定了),这个运算可以是加入一个16位的或更高位的密匙,得出新的十六进制数就OK(如进行位运算)。为了方便记录和传输(可能会因为得出的新的十六进制数里有特殊的字符,如文本结束符等),建议再把这个十六进制数转成字符串,这样,记录和输入时就只有0到F一些字母了,不会产生歧意。
3、有人怕固定的密匙不保险,那么,可以在运算上下功夫,如每次加密16位,并且第二位数据和第一位数据的结果进行一定的关联等等,我想你还可以想出更好的办法。这样,就很难猜出密匙了。
再复杂的办法也可以用上面的思路去办。
4、还是想说,没有解不开的密码,只是让解的人大花脑筋和时间罢了,哈哈。
Top




