请给我一个最简单的加密方法,谢谢!(50分)

  • 主题发起人 主题发起人 CoCo_
  • 开始时间 开始时间
C

CoCo_

Unregistered / Unconfirmed
GUEST, unregistred user!
在下需要一段加密算法(越简单越好),就是对一字符串进行一个算法,生成新的字符串,
而对这个字符串进行解密操作后又生成回原来的字符串,谢谢!
 
哈哈,最简单的,a变成b,b变成c,...z变成a
 
最简单异或算法:
const keyword='c';//关键字,随便什么一个字符就可以;
function encypt(input:string)string;
var i:integer;
begin
for i:=0 to length(input) do
input:=input xor keyword;
result:=input;
end;
使用一次是加密,再一次是解密
 
对每个字节与密码异或。
解密仍然是调用加密函数。

KUCIO的方法不行。
chr(255+1)就会变成chr(0)
 
CAO,我基本白TYPE了。
 
对字串的每个字异或,解密时也是异或
 
那有什么方法呢?
 
uses WinCRT;
const
C1 = 52845;
C2 = 22719;
function Encrypt(const S: String; Key: Word): String;
var
I: byte;
begin
Result[0] := S[0];
for I := 1 to Length(S) do begin
Result := char(byte(S) xor (Key shr 8));
Key := (byte(Result) + Key) * C1 + C2;
end;
end;

function Decrypt(const S: String; Key: Word): String;
var
I: byte;
begin
Result[0] := S[0];
for I := 1 to Length(S) do begin
Result := char(byte(S) xor (Key shr 8));
Key := (byte(S) + Key) * C1 + C2;
end;
end;

var
S: string;
begin
Write('>');
ReadLn(S);
S := Encrypt(S,12345);
WriteLn(S);
S := Decrypt(S,12345);
WriteLn(S);
end.
看一下。
 
用一个数字(即密钥)和原文每个字符异或一下,得到的就是密文。
解密是再将密钥和密文异或一次。
 
这类的控件太多了,你到深度历险中可以看到一大堆,很容易用的
有DES
 
好像比较复杂,有没有简单一点的,就是把一个字符串经过一个算法成为另一个
字符串,然后用一个算法将它还原成字符串,有没有很简单的算法啊....
 
其实使用控件应该是最简单。


for n:=1 to length(s) do
begin
c:=s[n];//c is a char var;
s[n]:=s[length(s)-n+1];
s[length(s)-n+1]:=c;
if n>= length(s) div 2 then break;//stop at the middle of the string;
end;

以上是将字符串反序重排。
缺点是加密方法容易被破解。如果只是想蒙蒙外行应该够用了。
前面提到的异或算法理论上只能使用穷举法破解。

呵呵,有谁能想出更简单的?
 
for n:=1 to length(s) do
begin
s[n]:=chr(strtoint('$'+inttohex(ord(s[n]),2)[2]+inttohex(ord(s[n]),2)[1]));
end;
把第N个CHAR变为2位的十六进制,然后对这两位交换一下位置,再变CHAR。。。
这个方法如何?
 
//保存的资料

字符串加密解密函数,可以直接使用

//加密函数
Function EncrypKey (Src:String; Key:String):string;
var
idx :integer;
KeyLen :Integer;
KeyPos :Integer;
offset :Integer;
dest :string;
SrcPos :Integer;
SrcAsc :Integer;
TmpSrcAsc :Integer;
Range :Integer;

begin
KeyLen:=Length(Key);
if KeyLen = 0 then key:='Think Space';
KeyPos:=0;
SrcPos:=0;
SrcAsc:=0;
Range:=256;

Randomize;
offset:=Random(Range);
dest:=format('%1.2x',[offset]);
for SrcPos := 1 to Length(Src) do
begin
SrcAsc:=(Ord(Src[SrcPos]) + offset) MOD 255;
if KeyPos < KeyLen then KeyPos:= KeyPos + 1 else KeyPos:=1;
SrcAsc:= SrcAsc xor Ord(Key[KeyPos]);
dest:=dest + format('%1.2x',[SrcAsc]);
offset:=SrcAsc;
end;
Result:=Dest;
end;

//解密函数
Function UncrypKey (Src:String; Key:String):string;
var
idx :integer;
KeyLen :Integer;
KeyPos :Integer;
offset :Integer;
dest :string;
SrcPos :Integer;
SrcAsc :Integer;
TmpSrcAsc :Integer;
Range :Integer;

begin
KeyLen:=Length(Key);
if KeyLen = 0 then key:='Think Space';
KeyPos:=0;
SrcPos:=0;
SrcAsc:=0;
Range:=256;
offset:=StrToInt('$'+ copy(src,1,2));
SrcPos:=3;
repeat
SrcAsc:=StrToInt('$'+ copy(src,SrcPos,2));
if KeyPos < KeyLen Then KeyPos := KeyPos + 1 else KeyPos := 1;
TmpSrcAsc := SrcAsc xor Ord(Key[KeyPos]);
if TmpSrcAsc <= offset then
TmpSrcAsc := 255 + TmpSrcAsc - offset
else
TmpSrcAsc := TmpSrcAsc - offset;
dest := dest + chr(TmpSrcAsc);
offset:=srcAsc;
SrcPos:=SrcPos + 2;
until SrcPos >= Length(Src);
Result:=Dest;
end;









字符串的加密与解密
作  者:ymxxm
所属论坛:Delphi
问题点数:50
回复次数:6
发表时间:00-7-20 下午 04:22:00

高手指点:
在Delphi 中如何实现字符串的加密与解密:
要求:1。加密后字符串为Ascii码或乱码;
2。最好有源程序



回复贴子:
回复人:Wingsun(00-7-20 下午 04:36:00) 得0分
有很多种方法,据一些简单的方法如下:
明文:abcdef,密钥:C(自己定义一个)
abcdef每一位和C异或-->结果(密文)
(密文)每一位和C异或-->结果(明文:abcdef)

明文:abcdef通过移n位,后得到密文
abcdef-->左移1位-->密文bcdefg
密文bcdefg-->右移1位-->明文abcdef

也可把这些多种简单的方法结合在一起成为一个复杂的方法。


回复人:meijg(00-7-20 下午 04:46:00) 得0分
下面是一个利用用户名和密码原文生成的加密程序:
这里面没有固定的密钥,加密使用username和password
function encryptpassword(username:string;password:string):string;
var beforepassword,afterpassword:string;
i,j,k,len:integer;
order:integer;
begin
beforepassword:=username+password;
afterpassword:='';
len:=length(beforepassword);
if len = 0 then
afterpassword:='passwordnil'
else
begin
j:=0;
for i:=1 to len do
begin
j:=j+ord(beforepassword)+i;
end;
K:=round(j/len);
if len < 10 then
begin
for i:=1 to len do
begin
j:=ord(beforepassword);
if j < k then
begin
order:=(j+k+i)mod 128;
if order < 60 then order:=order+60;
if order>100 then order:=order-40;
afterpassword:=afterpassword + char(order);
order:=(k-j+i)mod 128;
if order < 60 then order:=order+60;
if order>100 then order:=order-40;
afterpassword:=afterpassword + char(order);
end
else
begin
order:=(j+k+i)mod 128;
if order < 60 then order:=order+60;
if order>100 then order:=order-40;
afterpassword:=afterpassword + char(order);
order:=(j-k+i) mod 128;
if order < 60 then order:=order+60;
if order>100 then order:=order-40;
afterpassword:=afterpassword + char(order);
end;
end;
end
else
begin
for i:=1 to len do
begin
order:=ord(beforepassword);
order:=order mod 128;
if order < 60 then order:=order+60;
if order>100 then order:=order-40;
afterpassword:=afterpassword + char(order);
end;
end;
end;

encryptpassword:=afterpassword;
end;

回复人:meijg(00-7-20 下午 04:48:00) 得0分
下面是一个利用用户名和密码原文生成的加密程序:
这里面没有固定的密钥,加密使用username和password
function encryptpassword(username:string;password:string):string;
var beforepassword,afterpassword:string;
i,j,k,len:integer;
order:integer;
begin
beforepassword:=username+password;
afterpassword:='';
len:=length(beforepassword);
if len = 0 then
afterpassword:='passwordnil'
else
begin
j:=0;
for i:=1 to len do
begin
j:=j+ord(beforepassword)+i;
end;
K:=round(j/len);
if len < 10 then
begin
for i:=1 to len do
begin
j:=ord(beforepassword);
if j < k then
begin
order:=(j+k+i)mod 128;
if order < 60 then order:=order+60;
if order>100 then order:=order-40;
afterpassword:=afterpassword + char(order);
order:=(k-j+i)mod 128;
if order < 60 then order:=order+60;
if order>100 then order:=order-40;
afterpassword:=afterpassword + char(order);
end
else
begin
order:=(j+k+i)mod 128;
if order < 60 then order:=order+60;
if order>100 then order:=order-40;
afterpassword:=afterpassword + char(order);
order:=(j-k+i) mod 128;
if order < 60 then order:=order+60;
if order>100 then order:=order-40;
afterpassword:=afterpassword + char(order);
end;
end;
end
else
begin
for i:=1 to len do
begin
order:=ord(beforepassword);
order:=order mod 128;
if order < 60 then order:=order+60;
if order>100 then order:=order-40;
afterpassword:=afterpassword + char(order);
end;
end;
end;

encryptpassword:=afterpassword;
end;

回复人:ymxxm(00-7-20 下午 05:43:00) 得0分
Ymxxm谢谢各位,
我希望:'12k中华民族'-->'密文'-->'12k中华民族'(解密后能够正常显示为原来的文字)

回复人:JGTM2000(00-7-20 下午 08:39:00) 得0分
那是当然。方法有很多。最简单最快的是利用一个key字串先按照某种固定方法生成key运算子,然后用它去对原文的各个字节作xor位运算。解密过程同加密。如:

function GetXORKey(key: string): DWORD;
var
i: integer;
begin
Result:=$12345678; // magic starter
for i:=1 to Length(key) do
begin
Result:=Result+ ord(key) shl i;
end;
end;

function ToggleText(var text: string; key: DWORD): string;
var
i: integer;
subKey: array [0..3] of byte;
begin
CopyMemory(@subKey,@key,sizeof(key));
for i:=1 to length(text) do
begin
text:=chr(ord(text) xor subKey[i mod 4]);
end;
end;

procedure Test;
var
s: string;
begin
s:='test text';
ToggleText(s,GetXORKey('JGTM2000'));
ShowMessage(s); // 看看变成什么模样了
ToggleText(s,GetXORKey('JGTM2000')); // 如果不是JGTM2000就不一定对了
ShowMessage(s); // 回来了吧!
end;

容易吧(而且效率相当高)?关键是这里的GetXORKey,要是能对不同的密码字串尽量不生成相同的Key效果更好(那样密码不一样肯定不对,比如可以用32bit CRC算法),我只是随手一写,仅作示意。当然,根据的你的保密要求的不同要具体情况具体分析的。
 
:房客
DELPHI的技术资料上说,不建议使用RANDOMIZE做加密使用,
因为以后版本的RANDOMIZE算法可能修改。这样那时你就需要重新设计加密算法了。

COCO_关注的是"简单".不是安全.
 
谢谢Wint,你的方法很简单也很有效,我注重是简单,而不是安全性,只是想稍微加密。
大家都很厉害,居然有这么多加密的方法:)
 
多人接受答案了。
 
后退
顶部