因要对大量文本进行简单变换存储,开始是用Xor,发现对中文处理不如人意,某些汉字Xor后在内存中操作无问题,存成文本后则无法显示出来,用论坛中消失在人海的DES加密,可以正确显示,但是加密解密太慢了
解决方案 »
- Delphi操作Excel时很多语句报undeclared identifier xxx at line xxx错误
- 文件菜单中的历史文件名有没有简便的处理方法
- 比较不好做的问题!!!!!!!!!!!!!!!!
- 紧急求助!!!一个Delphi新手到济南找工作这样的条件可以拿到多少钱??必重谢!!!!
- 如何得到浮动工具栏的关闭事件?
- 如何定位给定主窗体标题的窗口里的子控件?急急急急急!!!!!
- 一个TQUERY组件的使用问题,非常急!!!!!!!!!!!
- 有人试过吗?我的程序突然所有hint都没有了!怎么办?
- 怎么操作阿!!
- paradox数据库据说容易损坏(索引等),那么是怎么修复的呢?需要什么dll吗?如何在程序中自动修复?
- 一个很弱智的问题:如何在修改ADOquery的readonly 属性?
- 请教如何使用BusinessSkinForm组件,谢谢!
Var
I,Q:Integer;
O:String[255];
begin
Q := 1;
O := '';
For I := 1 to Length(S) Do
begin
O := O + Chr(Ord(S[I]) Xor Ord(K[Q]));
Inc(Q); If Q > Length(K) Then Q := 1;
end;
EncryptDecrypt := O;
end;procedure TForm1.Button3Click(Sender: TObject);
begin
Edit2.Text:=EncryptDecrypt(Edit1.Text,'111');
end;procedure TForm1.Button4Click(Sender: TObject);
begin
Edit3.Text:=EncryptDecrypt(Edit2.Text,'111');
end;你用这个函数吧,又可以加密又可以解密。
Var
I,Q:Integer;
O:String[255];
begin
Q := 1;
O := '';
For I := 1 to Length(S) Do
begin
O := O + Chr(Ord(S[I]) Xor Ord(K[Q]));
Inc(Q); If Q > Length(K) Then Q := 1;
end;
EncryptDecrypt := O;
end;procedure TForm1.Button3Click(Sender: TObject);
begin
Edit2.Text:=EncryptDecrypt(Edit1.Text,'111');
end;procedure TForm1.Button4Click(Sender: TObject);
begin
Edit3.Text:=EncryptDecrypt(Edit2.Text,'111');
end;你用这个函数吧,又可以加密又可以解密。
随便取几篇文章,加密后保存,然后读取解密,如果无异则成功(最好大小无较大改变)不好意思,要你帮忙测试,这破电脑,这时候挂了
比如说用 “件” xor 1然后保存成文本文件,再 Xor 1 看看
Var
I,Q:Integer;
O:String[255];
begin
Q := 1;
O := '';
For I := 1 to Length(S) Do
begin
O := O + Chr(Ord(S[I]) Xor Ord(K[Q]));
Inc(Q); If Q > Length(K) Then Q := 1;
end;
EncryptDecrypt := O;
end;
var
Decoder: TIdBase64Decoder;
begin
Decoder := TIdBase64Decoder.Create(nil);
try
Decoder.CodeString(s);
s := Decoder.CompletedInput;
delete(s, 1, 2);
result := s;
finally
Decoder.Free;
end;
end;function TGlobalOptions.Base64Encode(s: string): string;
var
Encoder: TIdBase64Encoder;
begin
Encoder := TIdBase64Encoder.Create(nil);
try
Encoder.CodeString(s);
s := Encoder.CompletedInput;
delete(s, 1, 2);
result := s;
finally
Encoder.Free;
end;
end;
呵呵,没用过,谢谢 [email protected]
To zeroxing(光头)
TIdBase64Decoder 三方控件吗?
要的话,请留e-mail
var
SI : Word;
begin
Bits := Bits mod 8;
if Bits < 0 then
begin
SI := MakeWord(Byte(C),0);
SI := SI shl Abs(Bits);
end
else
begin
SI := MakeWord(0,Byte(C));
SI := SI shr Abs(Bits);
end;
SI := Swap(SI);
SI := Lo(SI) or Hi(SI);
Result := Chr(SI);
end;Function Encrypt(EnStr,Key: String; Encode: Boolean): String;
var
a,PwdChk,Direction,ShiftVal,PasswordDigit : Integer;
begin
PasswordDigit := 1;
PwdChk := 0;
for a := 1 to Length(Key) do Inc(PwdChk,Ord(Key[a]));
Result := EnStr;
if Encode then Direction := -1 else Direction := 1;
for a := 1 to Length(Result) do
begin
if Length(Key)=0 then
ShiftVal := a
else
ShiftVal := Ord(Key[PasswordDigit]);
if Odd(A) then
Result[A] := RotateBits(Result[A],-Direction*(ShiftVal+PwdChk))
else
Result[A] := RotateBits(Result[A],Direction*(ShiftVal+PwdChk));
inc(PasswordDigit);
if PasswordDigit > Length(Key) then PasswordDigit := 1;
end;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
//加密调用
Edit2.Text:=Encrypt(Edit1.Text,'123',True);
end;procedure TForm1.Button2Click(Sender: TObject);
begin
//解密调用
Edit3.Text:=Encrypt(Edit2.Text,'123',False);
end;Function Encrypt(EnStr,Key: String; Encode: Boolean): String;
说明一下,EnStr为要加密或者是解密的字符串,Encode表示,如果为TRUE的时候代表加密,为False的时候代表解密。
测试如下
加密
Memo2.Text := Encrypt(Memo1.Text,'123',True);
Memo2.Lines.SaveToFile('c:\aaa.txt');解密: Memo2.Text := Encrypt(Memo1.Text,'123',False);其中Memo1.Text为c:\aaa.txt的数据大部份为乱码
memo的目的是用来显示的,内部处理就用字符串吧。
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Memo2: TMemo;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
function decodestr(s: string; key1: integer): string;
function encodestr(s: string; key1: integer): string;
{ Private declarations }
public { Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm} function TForm1.encodestr(s : string; key1 : integer ):string;
var i : integer;
s1 : string;
begin
s1:=s;
for i:=1 to strlen(pchar(s)) do
begin
s1[i]:=char(ord(s[i])+key1);
end;
result:=s1;
end;function TForm1.decodestr(s : string; key1 : integer):string;
var i : integer;
s1 : string;
begin
s1:=s;
for i:=1 to strlen(pchar(s)) do
begin
s1[i]:=char(ord(s[i])-key1);
end;
result:=s1;
end;procedure TForm1.Button3Click(Sender: TObject);
begin
Memo2.Text := encodestr(Memo1.Text,20);
memo2.Lines.SaveToFile('c:\test.txt');
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
memo2.Lines.LoadFromFile('c:\test.txt');
Memo1.Text := decodestr(Memo2.Text,20);
end;end.
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Button2: TButton;
Edit3: TEdit;
Memo1: TMemo;
Memo2: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}function Crypt(const s: string; Key: Word; const bEncrypt: boolean = True): string; overload;
type
TDynByteArray = array of byte;
const
SeedA = 5678;
SeedB = 5432;
var
i : integer;
ps, pr : ^byte;
begin
SetLength(Result, Length(s));
ps := @s[1];
pr := @Result[1];
for i := 1 to length(s) do
begin
pr^ := ps^ xor (Key shr 8);
if bEncrypt then
Key := (pr^ + Key) * SeedA + SeedB
else
Key := (ps^ + Key) * SeedA + SeedB;
pr := pointer(integer(pr) + 1);
ps := pointer(integer(ps) + 1);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo2.Text := Crypt(Memo1.Text,123,True);
Memo2.Lines.SaveToFile('c:\aaa.txt');
end;procedure TForm1.Button2Click(Sender: TObject);
begin
Memo2.Text := Crypt(Memo1.Text,123,False);
end;end.