Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.06.2017, 08:00
ComAlex ComAlex вне форума
Прохожий
 
Регистрация: 18.06.2017
Сообщения: 22
Версия Delphi: Delphi XE, C++
Репутация: 10
По умолчанию Использование DcpCrypt

Уважаемые знатоки, не подскажите ли, как при помощи библиотеки DcpCrypt решить задачу:
Зашифровать (расшифровать) данные по алгоритму DEC-CBC c ключом ="0000000000000000" (используется только 56 бит)
и вектором "0000000000000000" (8 байт - используется все 64 бит)
Используется ANSII кодировка

Делаю расшифровку так:
Код:
function DoDecrypt: string;
var
  Cipher: TDCP_des;
  KeyStr: string;
  TextIn, TextOut : String;
  Vector : array of Byte;
  src, enc, b64: TBytes;
  I,index, lunghezza, blocksize, paddingsize: integer;

begin
  SetLength(Vector, 8);
  for i:=0 To 7 do Vector[i] := 0;
  KeyStr:='00000000';
  Cipher := TDCP_des.Create(Nil);
  Cipher.Init(keystr,Length(keystr)*8, addr(Vector[0]));
  TextIn := 'pve%`,n_><Y,RH$nphZd)? K JSN\2';
  Cipher.InitStr(TextIn,TDCP_sha1);
  lunghezza := Length(TextIn);
  index := SizeOf(TextIn);
  blocksize := Cipher.BlockSize div 8;
  paddingsize:= blocksize - (lunghezza mod blocksize);
  Inc(lunghezza, paddingsize);
  SetLength(TextIn, lunghezza);
  for index:=paddingsize downto 1 do
  begin
       TextIn[lunghezza - index] := char(0);
  end;
  index := Length(TextOut);
  SetLength(TextOut, lunghezza);
  Cipher.DecryptCBC(TextIn[1], TextOut[1], length(TextIn));
  Result:=Cipher.DecryptString(TextOut);
End;
Админ: Пользуемся тегами при оформлении кода!

Но получается абракадабра

P.S.: Знаю, что слово 'pve%`,n_><Y,RH$nphZd)? K JSN\2' вполне читаемо должно расшифроваться

Последний раз редактировалось Admin, 20.06.2017 в 21:11.
Ответить с цитированием
  #2  
Старый 20.06.2017, 23:29
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Может быть дело в типе string, строки в хеке вроде юникодные
Ответить с цитированием
  #3  
Старый 27.06.2017, 14:19
ComAlex ComAlex вне форума
Прохожий
 
Регистрация: 18.06.2017
Сообщения: 22
Версия Delphi: Delphi XE, C++
Репутация: 10
По умолчанию

Максимально избавился от string
Всё-равно показывает абрукадабру
Скорее всего проблема в логике - что-то недописываю
Никто не сталкивался?
Код:
function DoDecrypt1: Ansistring;
var
  Cipher: TDCP_des;
  R: Ansistring;
  Key,Vector,Data,TextOut: array of Byte;
  src, enc, b64: TBytes;
  I: Integer;
  index, lunghezza, blocksize, paddingsize: integer;

begin
 SetLength(Data, 32);
 Data[0]:=HexToInt('0');
 Data[1]:=HexToInt('0');
 Data[2]:=HexToInt('0');
 Data[3]:=HexToInt('28');
 Data[4]:=HexToInt('70');
 Data[5]:=HexToInt('76');
 Data[6]:=HexToInt('65');
 Data[7]:=HexToInt('25');
 Data[8]:=HexToInt('E0');
 Data[9]:=HexToInt('2C');
 Data[10]:=HexToInt('6E');

 Data[11]:=HexToInt('5F');
 Data[12]:=HexToInt('90');
 Data[13]:=HexToInt('3E');
 Data[14]:=HexToInt('BC');
 Data[15]:=HexToInt('59');
 Data[16]:=HexToInt('AC');
 Data[17]:=HexToInt('52');
 Data[18]:=HexToInt('13');
 Data[19]:=HexToInt('8B');
 Data[20]:=HexToInt('48');

 Data[21]:=HexToInt('A4');
 Data[22]:=HexToInt('86');
 Data[23]:=HexToInt('EE');
 Data[24]:=HexToInt('84');
 Data[25]:=HexToInt('70');
 Data[26]:=HexToInt('8F');

 SetLength(Vector, 16);
 for i := 0 to 15 do Vector[i]:=0;
 SetLength(Key, 8);
 for i := 0 to 7 do Key[i]:=0;
  Cipher := TDCP_des.Create(nil);
  Cipher.Init(key[0], Length(key) * 8, addr(Vector[0]));
  lunghezza := Length(Data);
  index := SizeOf(Data);
  blocksize := Cipher.BlockSize div 8;
  paddingsize := blocksize - (lunghezza mod blocksize);
  Inc(lunghezza, paddingsize);
  SetLength(Data, lunghezza);
  for index := paddingsize downto 1 do
  begin
   Data[lunghezza - index] := 0;
  end;
  index := Length(TextOut);
  SetLength(TextOut, lunghezza);

  Cipher.CipherMode:=cmCBC;
  Cipher.DecryptCBC(Data[0],TextOut[0], length(Data));
  R:='';
  for i:=0 To lunghezza Do R:=R+AnsiChar(TextOut[i]);
  Cipher.Free;
  Result :=R;
end;
Админ: При последующем нарушении оформления кода последуют санкции!

Последний раз редактировалось Admin, 27.06.2017 в 20:12.
Ответить с цитированием
  #4  
Старый 27.06.2017, 16:27
ComAlex ComAlex вне форума
Прохожий
 
Регистрация: 18.06.2017
Сообщения: 22
Версия Delphi: Delphi XE, C++
Репутация: 10
По умолчанию

Код:
SetLength(Data, 32);
 Data[0]:=HexToInt('0');
 Data[1]:=HexToInt('0');
 Data[2]:=HexToInt('0');
 Data[3]:=HexToInt('28');
 Data[4]:=HexToInt('70');
 Data[5]:=HexToInt('76');
 Data[6]:=HexToInt('65');
 Data[7]:=HexToInt('25');
 Data[8]:=HexToInt('E0');
 Data[9]:=HexToInt('2C');
 Data[10]:=HexToInt('6E');

 Data[11]:=HexToInt('5F');
 Data[12]:=HexToInt('90');
 Data[13]:=HexToInt('3E');
 Data[14]:=HexToInt('BC');
 Data[15]:=HexToInt('59');
 Data[16]:=HexToInt('AC');
 Data[17]:=HexToInt('52');
 Data[18]:=HexToInt('13');
 Data[19]:=HexToInt('8B');
 Data[20]:=HexToInt('48');

 Data[21]:=HexToInt('A4');
 Data[22]:=HexToInt('86');
 Data[23]:=HexToInt('EE');
 Data[24]:=HexToInt('84');
 Data[25]:=HexToInt('70');
 Data[26]:=HexToInt('8F');

 for i :=4 To 32 Do Data[i-4]:=Data[i];
 SetLength(Data,28);

 SetLength(Vector, 16); 
 for i := 0 to 15 do Vector[i]:=0;
 SetLength(Key, 8);
 for i := 0 to 7 do Key[i]:=0;
 R:='';

  Cipher := TDCP_des.Create(nil);
  Cipher.Init(key[0], Length(key)*8, addr(Vector[0]));
  lunghezza := Length(Data);
  index := SizeOf(Data);

  blocksize := Cipher.BlockSize div 8;
  paddingsize := blocksize - (lunghezza mod blocksize);
  Inc(lunghezza, paddingsize);
  SetLength(Data, lunghezza);
  for index := paddingsize downto 1 do Data[lunghezza - index] := 0;

  index := Length(TextOut);
  SetLength(TextOut, lunghezza);
  Cipher.CipherMode:=cmCBC;
  Cipher.DecryptCBC(Data[0],TextOut[0], length(Data));
  for i:=0 To lunghezza Do R:=R+AnsiChar(TextOut[i]);
  Cipher.Free;

 Result :=R;

Заработало на-половину,
т.е. корректно перевелась только половина сообщений (первые 16 символов):

Результат: 5;UNV00000001284іаЏfWжdЧД'#2'Л'#7'EБ¬§:'
Вторые 16 НЕ ПЕРЕВЕЛАСЬ

Ожидаю: 5;UNV000000012844;00008F4A93;20;2

Русских букв нет в результате никогда

Помогите дожать .... !!!!
Ответить с цитированием
  #5  
Старый 27.06.2017, 17:17
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Вот ещё вариант
Вложения
Тип файла: zip DES_CBC.zip (46.7 Кбайт, 8 просмотров)
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
ComAlex (28.06.2017)
  #6  
Старый 27.06.2017, 20:05
ComAlex ComAlex вне форума
Прохожий
 
Регистрация: 18.06.2017
Сообщения: 22
Версия Delphi: Delphi XE, C++
Репутация: 10
По умолчанию

Спасибо, но там я ответа не нашел.
Можете мне явно пример показать??
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:31.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter