加解密的问题,问什么结果不正常?(100分)

  • 主题发起人 主题发起人 ynfly
  • 开始时间 开始时间
Y

ynfly

Unregistered / Unconfirmed
GUEST, unregistred user!
我写了二个加解密的函数(当然也是抄的),但发现结果不是很正常
比如收入'Hello,World'是加密后再解密回来变成了'Hello,Worl',
但是如果输入'hello,world'却又结果正常,真是百思不得其解,
现请教各位有没有什么好的加密界面控件介绍,另外我写的函数到底有什么问题?

unit encrypt;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
function Encrypt (const S: pchar; Key: Word): pchar;
function Decrypt (const S: pchar; Key: Word): pchar;
end;

const
C1 = 52845;
C2 = 22719;
var
Form1: TForm1;

implementation

{$R *.dfm}

function tform1.Encrypt (const S: pchar; Key: Word): pchar;
var
I: byte;
len:integer;
strResult:string;
destResult:pchar;
strS:string;
begin
strS:=strpas(s);
len:=length(strS);
setlength(strResult,len);
strResult[1]:=strS[1];
for I := 2 to len do begin
strResult := char(byte(strS) xor (Key shr 8));
Key := (byte(strResult) + Key) * C1 + C2;
end;
GetMem(destResult, 32767);
strpcopy(destResult,strResult);
Result:=destResult;
end;
function tform1.Decrypt (const S: pchar; Key: Word): pchar;
var
I: byte;
len:integer;
strResult:string;
destResult:pchar;
strS:string;
begin
strS:=strpas(S);
len:=length(strS);
setlength(strResult,len);
strResult[1]:=strS[1];
for I := 2 to Len do begin
strResult := char(byte(strS) xor (Key shr 8));
Key := (byte(strS) + Key) * C1 + C2;
end;
GetMem(destResult, 32767);
strpcopy(destResult,strResult);
Result:=destResult;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
edit2.Text:=encrypt(pchar(edit1.Text ),12345);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
edit1.Text :=decrypt(pchar(edit2.Text ),12345);
end;

end.
 
>>比如收入'Hello,World'是加密后再解密回来变成了'Hello,Worl',
>>但是如果输入'hello,world'却又结果正常,
是不是變量長度不夠?
 
没有Delphi7调试,所以没认真看。
根据经验,如果加密算法是正确的,你在控制台下用
Writeln()有可能能打出来,但机会不大,
另一个原因是用xor后没对$0进行处理,PChar是以$0作为结束,$0之后的忽略。

MD5算法
http://www.szchance.com/gb/coretech/article_show.asp?ID=23
 
听说 ‘MD5加密算法是签名算法,不是用来加解密的,它是单向的’,恐怕不行吧,
请继续讨论此问题
 
是的,很多情况是不用解密的,如用户密码,可能用两个加密的数据比较确定密码是否正确。
如果一定要解密的,选用别的算法。
 
这个加密解密的办法,在dfw上贴了无数次了,我也发现此法有问题,无法保证加密前和解密后的一致,但好像把12345,改成1位,比如:1,就行了
 
还是用MD5吧
 
谢谢大家给了我的提示
 

Similar threads

I
回复
0
查看
577
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
724
import
I
后退
顶部