![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
RSA шифрование по публичному ключу [D5]
raduga15 © (2015-06-03 16:04:00)Пытаюсь авторизоваться в Steam. Раньше я использовал модуль "rsacalc"
RSACALC:
procedure TRSACalculator.Calculate(const Plaintext,Modulus: ANSIString; var Ciphertext: ANSIString);
var i:integer;
begin
i:=0;
while busy do begin
inc(i);
if i>1000 then exit;
sleep(50);
Application.ProcessMessages;
end;
//
Password.setAttribute('value',Plaintext,0);
ModulusE.setAttribute('value',Modulus,0);
web.RunJS('Go();');
Ciphertext:=CiphertextE.getAttribute('value',0);
end;
constructor TRSACalculator.Create(form: TForm);
begin
busy:=true;
p:=TPanel.Create(Form);
p.Parent:=Form;
web:=TWebBrowser.Create(p);
web.Visible:=false;
TWinControl(web).Parent:=p;
p.Height:=0;
p.Width:=0;
web.OnDocumentComplete:=self.WebDocumentComplete;
web.OnBeforeNavigate2:=self.WebNavigate2;
web.Navigate(iniName);
end;
Всё прекрасно работало и до сих пор работает, но нужно сделать авторизацию непосредственно в потоке. А модуль "rsacalc" уже там не работает.
От сервера Steam я получаю:
1) Публичный ключ: "DE2C23F5B87C4535CF1241B85ED5DC9C97E2E2A9C411B93F417718D92D4F0294A37A36E8FF1C346 FCB56426405F0CEB59C6BA21EC5C70
F046930B800E830091F62F7B76252458FAB026A0F8ACF59246203EFCA254C057C55A648385A9E27D 29BD0F83802C1C55091884A048E34DBEF316B0AF9B2199CE2
B6C81F258F45E8944CB0F122B4BF2757BD881CE967EC7B5346F7469E8C8F7FE0AAEDBC9B7B300188 6B6D50641961F5CF0D160BD5E7D1BF55D1BAFF8908025773
4D06C171AE3AD69708ACBA119AE5D1DDF1199784170FCF586E982ADB502057C4910ED6FB52E26CF1 37B247DB47A9486140B8BF385113C4578D0749E254E19062
CBE4139E09FBE60775"
2) Публичный экспонент: "010001"
Нужно зашифровать пароль методом RSA и в результате должно получиться что-то вроде этого: http://www.sources.ru/csharp/RSACryptoPad.png
Попытки использования:
Пробовал использовать FGINT
authkey = 'DE2C23F5B87C4535CF1241B85ED5DC9C97E2E2A9C411B93F417718D92D4F0294A37A36E8FF1C346 FCB56426405F0CEB59C6BA21EC5C70F046930B800E830091F62F7B76252458FAB026A0F8ACF59246 203EFCA254C057C55A648385A9E27D29BD0F83802C1C55091884A048E34DBEF316B0AF9B2199CE2B 6C81F258F45E8944CB0F122B4BF2757BD881CE967EC7B5346F7469E8C8F7FE0AAEDBC9B7B3001886 B6D50641961F5CF0D160BD5E7D1BF55D1BAFF89080257734D06C171AE3AD69708ACBA119AE5D1DDF 1199784170FCF586E982ADB502057C4910ED6FB52E26CF137B247DB47A9486140B8BF385113C4578 D0749E254E19062CBE4139E09FBE60775';
kexp:='010001';
Base256StringToFGInt(authkey,authkeys);//BASE 256
Base10StringToFGInt(kexp,kexps);//binary
rsaencrypt('password_here', authkeys, kexps, passw);
В результате получаются пустые кубики и другие непонятные иероглифы.
Пытаюсь сделать так:
function Bit(Value, n: Integer): Boolean;
asm
bt eax, edx
setc al
and eax, 0FFh
end;
//Функция быcтрого возведения в степень
function FastPower(a, b, n: integer): integer;
var i: integer;
ai: extended;
begin
ai := a;
for I := Trunc(log2(b)) - 1 downto 0 do
if Bit(b, i) then ai := Round(sqr(ai) * a) mod n else ai := Round(sqr(ai)) mod n;
result := Round(ai);
end;
function Encrypt(s: string; e, n: integer): TIncodeMes;
var I: Integer;
begin
SetLength(result, length(s));
for I := 0 to Length(s) - 1 do
result[i] := FastPower(ord(s[i + 1]), e, n)
end;
n := StrToIntDef(Edit3.Text, strtoint(edit3.text)); //n=Публичный экспонент:
e := StrToIntDef(Edit2.Text, strtoint(Edit2.Text));//e=Публичный ключ:
FMes := Encrypt(Memo1.Lines.Text, e, n);
Происходит ошибка при конвертирование e. "Публичный ключ" (здесь написан сам ключ) is not a valid integer value
Буду рад любому совету, а ещё больше сделанной функции
кгшзх (2015-06-03 18:02:00) [1]Ну и конечно
ShowMessage('В интегер число влезает только ' + IntToStr(SizeOf(integer)) + ' байт ; в то время как я пытаюсь запихать туда ' + IntToStr(Length(Edit2.text) div 2) + ' байт');
кгшзх (2015-06-03 17:51:00) [2]а что это за ересь?
e := StrToIntDef(Edit2.Text, strtoint(Edit2.Text));
преобразовать строку из эдит2 в интегер, а если не получилось, то все равно преобразовать строку из эдит2 в интегер.