帮我看看这段加密代码,我搞不懂它的原理是什么,如何解密啊???!!!(100分)

  • 主题发起人 主题发起人 诸葛白痴
  • 开始时间 开始时间

诸葛白痴

Unregistered / Unconfirmed
GUEST, unregistred user!
这是一个加解密函数,其中tsUserName代表是一个注册公司名称,tdDate代表注册日期,谁能帮
我解开这个函数啊,给个解密思路也行,我实在反推不出来啊,谢谢!!!
function DecryptKey(tsUserName:string;
tsKey:string;
tdDate:TDate;
lShowRegist:Boolean=True):Boolean;
var nYear,nMonth,nDay :word;
ts :string;
aPlain,aCipher :Array[1..8] of integer;
i,n :integer;
lResult :Boolean;
begin
if tdDate < EncodeDate(2002,1,1) then
begin
Result :=True;
Exit;
end;

lResult :=False;
tsUserName :=Trim(tsUserName);
if Length(tsUserName) >=8 then
if Length(tsKey) =8 then
//tsKey是注册码,我现在就是不知如何算出这个注册码
begin
ts :=Copy(UpperCase(tsKey), 1, 8);
//根据注册码换算成比较码
for i :=1 to 8 do
aPlain :=(Ord(ts) -Ord('A')) mod 26;
aCipher[1] :=23*aPlain[1] + 20*aPlain[2] + 5*aPlain[3] + 1*aPlain[4];
aCipher[2] :=2*aPlain[1] + 11*aPlain[2] + 18*aPlain[3] + 1*aPlain[4];
aCipher[3] :=2*aPlain[1] + 20*aPlain[2] + 6*aPlain[3] + 25*aPlain[4];
aCipher[4] :=25*aPlain[1] + 2*aPlain[2] + 22*aPlain[3] + 25*aPlain[4];
aCipher[5] :=23*aPlain[5] + 20*aPlain[6] + 5*aPlain[7] + 1*aPlain[8];
aCipher[6] :=2*aPlain[5] + 11*aPlain[6] + 18*aPlain[7] + 1*aPlain[8];
aCipher[7] :=2*aPlain[5] + 20*aPlain[6] + 6*aPlain[7] + 25*aPlain[8];
aCipher[8] :=25*aPlain[5] + 2*aPlain[6] + 22*aPlain[7] + 25*aPlain[8];
for i :=1 to 8 do
aCipher :=(aCipher mod 26);
DecodeDate(tdDate, nYear,nMonth,nDay);
n :=(nYear -2002) *12 +nMonth;
n :=n mod 26 +1;
//根据注册公司名生成注册原码
ts :=tsUserName;
for i :=1 to 8 do
aPlain :=n;
for i :=Length(ts) do
wnto 1 do
aPlain[i mod 8 +1] :=(aPlain[i mod 8 +1] *Ord(ts)) mod 26 +1;
for i :=1 to 8 do
aPlain :=aPlain mod 26;
//生成完毕
lResult :=True;
for i :=1 to 8 do
if aPlain <> aCipher then
begin
lResult :=False;
Break;
end;
end;
if lResult then
Result :=True
else
if lShowRegist then
begin
frmSoftRegist :=TfrmSoftRegist.Create(nil);
Result :=frmSoftRegist.ShowRegist(tdDate);
frmSoftRegist.Release;
end
else
Result :=False;
end;



 
学习一下
 
研究研究
 
注册公司名+注册时间——〉注册原码——〉注册码
最后一步,就是解两个四元一次方程组
 
老大,俺就是小学没毕业,不知道那个方程式怎么解啊,能不能帮人帮到底,帮助做个
解开的小代码或详细的思路
 
用此方法对数据加密两次,看看是否又回来了。
 
下面是别人的代码,未经测试:
用最小二乘法解线性方程组:
type
TMatrix = array of array of do
uble;
procedure MinSqrMul(m, n: Integer;
A: TMatrix;
b: array of do
uble;
var x: array of do
uble);
var
i, j, k: Integer;
ATA: array of array of do
uble;
ATb: array of do
uble;
Elem: do
uble;
begin
SetLength(ATA, n, n);
SetLength(ATb, n);
for i := 0 to n - 1 do
for j := 0 to n - 1 do
begin
ATA[i, j] := 0;
for k := 0 to m - 1 do
ATA[i, j] := ATA[i, j] + A[k, i] * A[k, j];
end;
for i := 0 to n - 1 do
begin
ATb := 0;
for j := 0 to m - 1 do
ATb := ATb + A[j, i] * b[j];
end;
for i := 0 to n - 1 do
begin
Elem := ATA[i, i];
for j := i to n - 1 do
ATA[i, j] := ATA[i, j] / Elem;
ATb := ATb / Elem;
for k := i + 1 to n - 1 do
begin
Elem := -ATA[k, i];
for j := k to n - 1 do
ATA[k, j] := ATA[k, j] + ATA[i, j] * Elem;
ATb[k] := ATb[k] + ATb * Elem;
end;
end;
x[n - 1] := ATb[n - 1];
for i := n - 2 do
wnto 0 do
begin
for j := i + 1 to n - 1 do
ATb := ATb - ATA[i, j] * x[j];
x := ATb;
end;
end;

用法:
var
m,n:integer;
a:array[1..2] of array[1..2] do
uble ;
b: array[1..2] of do
uble;
x: array[1..2] of do
uble
begin
m:=2;
n:=2;
a:={{3,4},{5,6}}
b:={7,8};
MinSqrMul(m, n, A, b,x);
end;
得出的x数组就是
3a+4b=7;
5a+6b=8;
的解

 
多人接受答案了。
 
后退
顶部