|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
Использование 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
|
||||
|
||||
Может быть дело в типе 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
|
|||
|
|||
Спасибо, но там я ответа не нашел.
Можете мне явно пример показать?? |