![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Уважаемые знатоки, не подскажите ли, как при помощи библиотеки 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
|
||||
|
||||
|
Может быть дело в типе string, строки в хеке вроде юникодные
|
|
#3
|
|||
|
|||
|
Максимально избавился от 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
|
|||
|
|||
|
Код:
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
|
||||
|
||||
|
Вот ещё вариант
|
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
ComAlex (28.06.2017)
| ||
|
#6
|
|||
|
|||
|
Спасибо, но там я ответа не нашел.
Можете мне явно пример показать?? |
|
#7
|
|||
|
|||
|
на входе всего 23 символа:
0x70 0x76 0x65 0x25 0xE0 0x2C 0x6E 0x5F 0x90 0x3E 0xBC 0x59 0xAC 0x52 0x13 0x8B 0x48 0xA4 0x86 0xEE 0x84 0x70 0x8F Предполагаю, целых 8 блоков убралось только два- вот и перевелось два блока, но чем-то надо дополнить последовательность символов до 40, чтоб было 5 целых 8-блоков То, что длина последовательности =40, знаю точно (по задаче). Какими же символами (пустыми, нечитаемыми...) нужно дополнить последовательность, чтоб переводилась? |
|
#8
|
||||
|
||||
|
Цитата:
|
|
#9
|
|||
|
|||
|
Ты прав - в задание корректное было
Сейчас всё разрулили. Все решилось! Всем спасибо |