function RSAEncrypt(a,p,rsakey:string):string;
var
sD,sR,sM:string;
m,e,d,r:TFGInt;
begin
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:=a+p+#0#0#0#0;
sM:=rsakey;
Base10StringToFGInt('65537',e);
Base256StringToFGInt(sD,d);
Base256StringToFGInt(sM,m);
FGIntMontgomeryModExp(d,e,m,r);
FGIntToBase256String(r,sR);
result:=sR;
end;
как переписать отделавшись легким испугом?? Лучше конечно использовать ява функции.
Тут получатся, что шифруется блок "логин+пароль", или отдельно каждое потом записываются в соответствующие места?
Наверное самое трудно переносимое из одного языка в другой =) Потому что используется тут большие числа и в каждом языке разные модули для этого. Конкретно что делает процедура:
Код:
function RSAEncrypt(a,p,rsakey:string):string;
var
sD,sR,sM:string;
m,e,d,r:TFGInt; //это переменные для работы с большими числами
begin
if length(a)>14 then setlength(a,14); //если логин > 14 символов обрезаем
while length(a)<14 do a:=a+#0; //доводим логин до 14 символов
if length(p)>16 then setlength(p,16); //если пароль > 16 символов, обрезаем
while length(p)<16 do p:=p+#0; //доводим пароль до 16 символов
sD:=a+p+#0#0#0#0; //записывается логин+пароль+4 нулевых байт для нужного размера
sM:=rsakey;
Base10StringToFGInt('65537',e); //инициализируем e числом 65537
Base256StringToFGInt(sD,d); //инициализируем d "числом" sD
Base256StringToFGInt(sM,m); //аналогично
FGIntMontgomeryModExp(d,e,m,r); //выполняется операция r = (d^e) mod m
FGIntToBase256String(r,sR); //переводится r в sR
result:=sR; //PROFIT
end;
т.е. получается что да, шифруется сразу блок логин + пароль.
Последний раз редактировалось Kilatif, 10.02.2012 в 01:51.
Переводится каким способом? Или просто копируется?
sR - массив байт
допустим r = 0xAABBCCDDEEFF11223344
тогда sR = {0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF, 0x11, 0x22, 0x33, 0x44} (порядок записи в массив может будет задом наперед, я точно не помню)
Внешне вроде очень похоже ) Единственное что в BlowfishEngine.java не нашел аналогий функциям bfDecode и bfEncode Видимо их придется дописывать
Они походу есть в других классах, аля логин_крипт, нью_логин_крипт, и бФ_кейген. Сори за русский английский спешил). Только опять же непонятно подойдут эти функции или нет.
MAX_PKT_SIZE=$FFFF;
FillChar(main_buff,Length(main_buff),0); // заполнить буфер 0
Len:=recv(RS_Sock,main_buff,MAX_PKT_SIZE,0); // я так понимаю пишем в буфер но зачем размер MAX_PKT_SIZE, но Len чему будет равно??
inc(RecvPktCount); // +1
LS_parser(main_buff,Len); // тут непонятно чему будет равна длина??
Первый приходящий пакет 186
Код:
procedure LS_parser(buff: array of byte; Len: integer);
var
temp: array [0..MAX_PKT_SIZE-1] of char; // какой размер тут будет ??
s: string;
i: integer;
begin
if RecvPktCount=1 then begin
if buff[2]=0 then DecodeBF:=false
else DecodeBF:=true;
end;
if DecodeBF then begin
Move(buff[2],temp[0],Len-2); // вот это критично.. что тут происходит
bf.bfDecode(temp,Len-2);
if temp[0]=#0 then begin
SetLength(s,Len-2);
for i:=0 to Len-3 do s[i+1]:=temp[i];
s:=AntiXor(s);
for i:=0 to Len-3 do temp[i]:=s[i+1];
//Move(s[1],temp[0],Length(s));
end;
Move(temp[0],buff[2],Len-2);
end;
Пробую уже работать, пока валится наверно из-за Move