字符串加密(50分)

  • 主题发起人 主题发起人 浮生
  • 开始时间 开始时间

浮生

Unregistered / Unconfirmed
GUEST, unregistred user!
我写了一个登陆界面,密码放在注册表,想把密码加密,可是不会:)(我是一个新手,
大虾们,别笑,笑也小声点,呵呵)请大家,提点提点,不知有几种方法:)
 
1。字符加密,就是经过一个函数变换。读的时候再反变换。
2。和一个密钥字符串加密,用一些与或非变换,读的时候反变换。
 
我倒是曾经写过一个Vigenere算法加密,很浅显的,也很容易破解,只能用来骗骗外行,
你要的话我email给你,也许对你有些借鉴
 
所谓密码与解码就是你自己定一个规矩(算法)编码,然后根据这个算法解码
就好了。
比如: 加密:abcd->zyxw
读取时:a+25,b+24....

 
procedure TForm1.Button1Click(Sender: TObject);
var
IniStr,TarStr : String;
I : Integer;
begin
IniStr := 'sSF34%esSDF23234@#$DSFsdf234fdWER@#$dtyiuOIUDCB';
//需要加密的字符串
TarStr := IniStr;
for I := 1 to Length(IniStr) do
TarStr := Chr(Ord(IniStr)+33 );
//加密后的字符串:攖gTUF啍tegSTSTUaDEetg攨嘢TU噮xfsaDE厱殜杙jvedc
end;
//程序比较简单,没有什么很好的安全性:)
 
我不是高手,但我想说一下
其实有很多加密方法的,比如说,换位法,playfair密码,DES算法,背包算法,总之了,
你自己找本书看看,有很多加密方法的。
我也曾经变了个加密算法的程序,继承了很多加密算法,遗憾的源程序和可执行文件都
遗失了,要不可以给你看看的
 
type
TDynByteArray = array of byte;

const
SeedA = 5678
/// 常量,你可以修改
SeedB = 5432
/// 常量,你可以修改

/// 对数组加密
function Crypt(const s: TDynByteArray
Key: Word
const bEncrypt: boolean = true): TDynByteArray
overload;
var
i : integer;
begin
SetLength(Result, Length(s));
for i := Low(s) to High(s) do
begin
Result := s xor (key shr 8);
if bEncrypt then
Key := (Result + key) * SeedA + SeedB
else
Key := (s + Key) * SeedA + SeedB;
end;
end;

/// 字符串
function Crypt(const s: string
Key: Word
const bEncrypt: boolean = True): string
overload;
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;

/// 也可以对记录进行加密,只要把TResultData改成你的记录类型即可!!!!!!
function Crypt(const s: TResultData
Key: Word
const bEncrypt: boolean = True): TResultData
overload;
var
i : integer;
ps, pr : ^byte;
begin
ps := @s;
pr := @Result;
for i := 1 to SizeOf(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;
***************************
function cryptstr(const s:string
stype: dword):string;
var
i: integer;
fkey: integer;
begin
result:='';
case stype of
0:
begin
randomize;
fkey := random($ff);
for i:=1 to length(s) do
result := result+chr( ord(s) xor i xor fkey);
result := result + char(fkey);
end;
1:
begin
fkey := ord(s[length(s)]);
for i:=1 to length(s) - 1 do
result := result+chr( ord(s) xor i xor fkey);
end;
end;
 
算法有用吗?算法比对后不是还是要对某个boolean赋值?
找到这个内存地址,然后直接修改,不就crack了。
 
保障系统安全性的首要原则之一就是永远不要自己编写加密算法,
如果只是密码的话,用Indy控件提供的MD5不可逆算法hash一把
将hash值放入注册表,然后需要验证时hash用户输入,比较结果即可
 
做个字典库,通过字典库取加密符,
 
多人接受答案了。
 
后退
顶部