powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / CryptoAPI- разные строки после шифровния
4 сообщений из 4, страница 1 из 1
CryptoAPI- разные строки после шифровния
    #39586930
Oleg6619
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Использую CryptoAPI. На 90% данных все в порядке. Но иногда возникает ситуация, когда CryptEncrypt при одном сессионном ключе в одной сессии ПОСЛЕДОВАТЕЛЬНО возвращает разные зашифрованные данные при одном и том же входном блоке.
Ошибок при шифровке и расшифровке не выдает.
Версия Delphi2007.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
const _512=2048
const Size_512=_512*2
//Ф-ция шифрования
function TCrypter.xeEncodeStringBySessionKey(const Input: RawByteString): RawByteString;
var
  keyLen: integer;
  MemStream: TMemoryStream;
  xbuf: array [0 .. Size_512] of byte;
  len: DWORD;
begin
  len := Length(Input);
  Result := '';
  MemStream := TMemoryStream.Create;
  try
    MemStream.WriteBuffer(Input[1], len);
    MemStream.Seek(0, soFromBeginning);
    keyLen := 1;
    while keyLen > 0 do
    begin
      FillChar(xbuf,Sizeof(xbuf),0);
      keyLen := MemStream.Read(xbuf, _512);
      if keyLen <= 0 then
        break;
      if not CryptEncrypt(HSessionKey, 0, (keyLen <= 0) or (keyLen < _512), 0, @xbuf, @keyLen, Size_512) then
        raise ECtyptIniError.Create('xeEncodeStringBySessionKey:' + SysErrorMessage(GetLastError));
      len := Length(Result);
      SetLength(Result, len + keyLen);
      Move(xbuf[0], Result[len + 1], keyLen);
    end;
  finally
    MemStream.Free;
  end;
end;
//Ф-ция расшифрования
function TCrypter.xeDecodeStringBySessionKey(const Input: RawByteString): RawByteString;
var
  keyLen: integer;
  MemStream: TMemoryStream;
  xbuf: array [0 .. Size_512] of byte;
  len: integer;
begin
  len := Length(Input);
  Result := '';
  MemStream := TMemoryStream.Create;
  try
    MemStream.WriteBuffer(Input[1], len);
    MemStream.Seek(0, soFromBeginning);
    keyLen := 1;
    while keyLen > 0 do
    begin
      FillChar(xbuf,Sizeof(xbuf),0);
      keyLen := MemStream.Read(xbuf, _512);
      if keyLen <= 0 then
        break;
      if not CryptDecrypt(HSessionKey, 0, (keyLen <= 0) or (keyLen < _512), 0, @xbuf, @keyLen) then
        raise ECtyptIniError.Create('xeDecodeStringBySessionKey:' + SysErrorMessage(GetLastError));
      len := Length(Result);
      SetLength(Result, len + keyLen);
      Move(xbuf[0], Result[len + 1], keyLen);
    end;
  finally
    MemStream.Free;
  end;

end;


Вызов
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 sOutput := xeEncodeStringBySessionKey(sInput);
// После появления ошибок добавил проверку
    for I := 0 to 4 do
    begin
      s3:=xeDecodeStringBySessionKey(sOutput); // расшифровываю для проверки
      if s3<>sInput then 
        sOutput := xeEncodeStringBySessionKey(sInput)
      else
       Break;
    end;
...
Рейтинг: 0 / 0
CryptoAPI- разные строки после шифровния
    #39586948
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg6619,

Ну если расшифровка нормально проходит, то скорее всего она какую-то псевдослучайную инициализацию использует для затруднения взлома зашифрованного текста. Либо из-за разницы в длине данных и блока шифрования она может заполнять "хвост" случайными данными.
...
Рейтинг: 0 / 0
CryptoAPI- разные строки после шифровния
    #39586951
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg6619,

Код: pascal
1.
(keyLen <= 0) or (keyLen < _512)


Отличное условие!
...
Рейтинг: 0 / 0
CryptoAPI- разные строки после шифровния
    #39586969
Oleg6619
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поменял CALG_RC2 на CALG_RC4 и ошибки ушли вроде....
Спасибо, кто читал.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / CryptoAPI- разные строки после шифровния
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]