Я создаю приложение, которое использует Socket для связи (сервер < -> клиент).Delphi и NodeJS - Шифровать массив байтового буфера (Rijndael cipher)
Сервер выполнен в NodeJS и клиенте в Delphi.
Для шифрования пакетов на стороне сервера я использую 128-битный ECB Rijndael. Я должен быть в состоянии зашифровать и расшифровать с двух сторон.
Это пример кода на стороне сервера NodeJS скрипт:
var MCrypt = require('mcrypt').MCrypt;
var desEcb = new MCrypt('rijndael-128', 'ecb');
desEcb.open('123456789', 'abcdefghijklmnop'); // key and IV
var encrypted_buffer = desEcb.encrypt(new Buffer([0x4d,0x79,0x20,0x64,0x61,0x74,0x61]));
console.log(encrypted_buffer);
Выходной буфер: 4f ce 37 97 7a dc 11 a9 11 75 97 e6 a3 a4 ae 28
И, в Delphi, это мой код (я использую DCPCrypt2 LIB):
procedure EncryptBuf;
const
buf: array[0..6] of byte = ($4d, $79, $20, $64, $61, $74, $61);
var
Cipher : TDCP_Rijndael;
Key, IV : string;
data: TByteArray; //32768 bytes
begin
// Pad Key, IV and Data with zeros as appropriate
Key := PadWithZeros('123456789', 16);
IV := PadWithZeros('abcdefghijklmnop', 16);
// Create the cipher and initialise according to the key length
Cipher := TDCP_Rijndael.Create(nil);
Cipher.Init(Key[1], 128, @IV[1]); {128, 192, 256}
Cipher.EncryptECB(buf[0], data[0]);
form1.memo1.lines.add(BufferToHex(data[0], length(data)));
// Free the cipher and clear sensitive information
Cipher.Free;
FillChar(Key[1],Length(Key),0);
end;
Однако выходной буфер у меня есть: 06 03 AA D5 51 EB 2B 8C 24 D5 4E BF D3 55 2E AA
Что я делаю неправильно? Кто-нибудь может мне с этим помочь?
Спасибо.
Лучше всего не использовать mcrypt, он является отказом, не обновлялся годами и не поддерживает стандартные дополнения PKCS # 7 (née PKCS # 5), только нестандартное нулевое заполнение, которое невозможно даже использовать с двоичными данными. В mcrypt было много выдающихся [ошибок] (https://sourceforge.net/p/mcrypt/bugs/), относящихся к 2003 году. Вместо этого подумайте об использовании [defuse] (https://github.com/defuse/php-encryption), он поддерживается и является правильным. – zaph