delphi Код:
procedure RSAkeyDecode(var raw);
var
ab: array[0..127] of Byte absolute raw;
i: Word;
b: Byte;
begin
for i:=0 to $3f do ab[$40+i]:=ab[$40+i] xor ab[i];
for i:=0 to $03 do ab[$0d+i]:=ab[$0d+i] xor ab[$34+i];
for i:=0 to $3f do ab[i]:=ab[i] xor ab[$40+i];
for i:=0 to $03 do begin
b:=ab[i];
ab[i]:=ab[$4d+i];
ab[$4d+i]:=b;
end;
end;
function RSAEncrypt_GMP(a, p: string; var rsakey): string;
var
sD:string;
m,d,r: mpz_t;
count: Integer;
begin
RSAkeyDecode(rsakey);
if length(a)>14 then setlength(a,14);
while length(a)<14 do a:=a+#0;
if length(p)>16 then setlength(p,16);
while length(p)<16 do p:=p+#0;
sD:=#$24#0#0+a+p+#0#0#0#0;
mpz_init(m);
mpz_import(m,128,1,1,0,0,rsakey);
mpz_init(d);
mpz_import(d,Length(sD),1,1,0,0,sD[1]);
mpz_init(r);
mpz_powm_ui(r,d,65537,m);
count:=32;
SetLength(Result,128);
mpz_export(Result[1],count,1,4,1,0,r);
mpz_clear(r);
mpz_clear(d);
mpz_clear(m);
end;
function RequestAuthLogin_c621(Login, Pasword: String; var rsakey; sessionID: Integer): string;
var
Packet: TPacket;
lpRSA: string;
sock, i: Integer;
strSizes: array[0..3] of Byte;
begin
lpRSA:=RSAEncrypt_GMP(Login,Pasword,rsakey);
with Packet do begin
InitWrite;
WriteB(0); // Packet ID
Write(lpRSA[1],128); // Login, Password
WriteD(sessionID); // sessionID
WriteD(0); WriteD(0); WriteD(0); WriteD(0);
WriteB(8);
WriteD(0); WriteD(0); WriteD(0); WriteD(0);
WriteD(0); WriteD(0); WriteH(0);
AddChecksum(data[3],160);
Result:=data;
end;
end;