Crypt_AES phpseclib эквивалент C # без IV - PullRequest
0 голосов
/ 29 августа 2018

Мне нужно интегрировать службу xml в наше приложение, а веб-служба использует шифрование и дешифрование phpseclib AES. Итак, мне нужно понять поток phpseclib. Мы работаем в среде .NET C # и не можем проанализировать этот php-код. Пожалуйста, найдите пример php-кода для реализации и посоветуйте мне, как преобразовать его в C #.

set_include_path('vendor/pear'); 
require_once '/Crypt/AES.php';
require_once '/SOAP/Client.php'; 

$password = 'ewad3x45efc542b3897e23esgy4s6xnm';
$data = '  
<WorkRequest version="3.0"> 
 <work>WORK NOW!</work>
</WorkRequest> '; 

$crypt = new Crypt_AES();      
$crypt->setKey($password);  
$data = gzencode($data);
$data = $crypt->encrypt($data);

Как видите, внутривенно и так далее не существует. В примере кода используются только методы setKey и encrypt.

1 Ответ

0 голосов
/ 31 августа 2018

phpseclib по умолчанию использует режим CBC. Этот режим требует IV. Как отмечалось в некоторых других комментариях, версия phpseclib, которую вы используете, использует IV всех нулевых байтов, когда их нет.

$crypt->setKey($password); 

Тот факт, что имя переменной равно $password, заставляет задуматься, используется ли какой-либо тип PBKDF в вашей реализации C #. Трудно сказать, потому что у вас нет кода на C #.

Я уже получаю "Заполнение недействительно и не может быть удалено." ошибка при попытке расшифровать зашифрованную строку

phpseclib по умолчанию использует заполнение PKCS8. то есть. если открытый текст кратен длине блока, он добавит 16x 0x16 байтов. Если это два байта, кратные длине блока, он добавит 2x 0x02 байта.

Возможно, ваша реализация на C # использует другой тип заполнения. Если это так, вы можете реализовать свой собственный, сначала отключив заполнение PKCS8, выполнив $crypt->disablePadding();, а затем применив собственный пользовательский заполнитель перед выполнением шифрования.

...