2016-08-09 5 views
3

Мне нужно зашифровать 10-байтовую строку в Delphi с помощью 3DES.Шифровать строку с 3DES usingDelphi 10.1 Berlin

Он должен получить тот же результат, чем это PHP код:

function encrypt_3DES($message, $key){ 
$bytes = array(0,0,0,0,0,0,0,0); 
$iv = implode(array_map("chr", $bytes)); 

$ciphertext = mcrypt_encrypt(MCRYPT_3DES, $key, $message, MCRYPT_MODE_CBC, $iv); 
return $ciphertext; 

Я пытался кодировать его, используя DCPCrypt и LockBox 3. Я окончательно отбрасывается DCPCrypt, потому что не было обновление в последнее время, и я «Не уверен, правильно ли он работает с Delphi 10.1 Berlin, поэтому я сосредоточился на LockBox 3, но мне не удалось получить шифрование.

Ключ шифрования - это 24-байтовый ключ (который имеет представление base64). Я не могу найти, как создать такой ключ, используя класс TSymetricKey LockBox, чтобы передать его методу Codec.Init. Поэтому я поместил его в AnsiString и установил его в свойстве Password (хотя в документах говорится, что есть utf8Password, но я не могу его найти).

Тогда есть метод под названием EncryptAnsiString, но он снова ожидает строки (utf16 на Delphi 10.1 Berlin) вместо AnsiStrings (хотя в документации говорится об обратном), поэтому я не удивлен, что результат не соответствует тому, что Я ищу (такое же значение, зашифрованное в этом фрагменте PHP).

Это мой Delphi код:

function Encrypt(Data: AnsiString; LocalKey: AnsiString): AnsiString; 
    var 
    BinaryLocalKey: TBytes; 
    strLocalKey, strTripleDes: AnsiString; 
    begin 
    BinaryLocalKey := DecodeBase64(LocalKey); 
    setString(strLocalKey, PAnsiChar(@BinaryLocalKey[0]), Length(BinaryLocalKey)); 

    Codec1.Rest; 
    Codec1.Password := strLocalKey; 
    Codec1.EncryptAnsiString(Data, strTripleDES); 
    Codec1.Reset; 

    Result := strTripleDes; 
    end; 

Но этот код не только не получить тот же результат, что и код PHP, но при каждом звонке она возвращает другой результат тот же вход.

Примечание: CODEC1 представляет собой компонент связан с компонентом TCryptographicLibrary, и с Propertis ChainMode установлен CBC * и Cipher установлен 3DES (манипуляция вариант 1)

Знает ли кто, как правильно получить это шифрование 3DES? ,

спасибо.

+2

Почему вы работаете с текстом, а не с байтами? –

+0

Я не вижу, как установить ключ/пароль с помощью байтов. Но да, я должен был бы сделать шифрование, используя байты вместо строк. Я попробую, спасибо. –

+0

Я вполне уверен, что проблема должна заключаться в установке пароля/ключа, и я не вижу, как установить их как двоичный. После того, как набор ключей, я должен иметь возможность расшифровать в памяти, но довольно сложный (вам нужно инициировать и завершить дешифрование и получить результат через Stream), выглядит слишком много, чтобы зашифровать 10-байтовую строку, используя 24- байтовый ключ, так как мне просто нужно сделать. –

ответ

1

Для каждого сообщения создается случайное IV. Низкие 8 байтов IV - это nonce, а высокие байты равны нулю. Эти низкие 8 байтов добавляются к выходу.

Если вы хотите отправить IV через боковой канал, отделите первые 8 байтов от номинального зашифрованного текста.

Если вы хотите контролировать IV, используйте версию 3.7.0 (https://github.com/SeanBDurkin/tplockbox). Вам нужно будет установить дополнительные параметры и реализовать метод OnGetIV.

Звездочка (*), отображаемая в редакторе свойств для выбора шифрования и выбора режима цепочки, означает, что этот выбор является рекомендуемым.

Смежные вопросы