Несовместимая реализация AES между Botan и phpseclib

Я использую библиотеку Botan для шифрования/дешифрования AES на С++. Я не могу использовать вывод Botan в phpseclib с точными результатами. Буду признателен, если кто-нибудь укажет мне рабочий код для взаимодействия между Botan и phpseclib или любой другой библиотекой шифрования PHP. Спасибо!

Пример шифрования с помощью Botan на C++

// Key
std::auto_ptr<Botan::HashFunction> tHash ( Botan::get_hash("SHA-256")  );
std::string mykey = "test";
Botan::SecureVector<Botan::byte> tSecVector(32);
tSecVector.set(tHash->process(mykey)); //the hash is actually the key - same size
Botan::SymmetricKey key(tSecVector); 
// IV
Botan::InitializationVector iv(mRng, 16);

// Encryption & Encode
Botan::Pipe pipe(Botan::get_cipher("AES-256/CBC", key, iv, Botan::ENCRYPTION) );
pipe.process_msg(pStdStringTextToEncrypt);
Botan::Pipe pipeb64enc(new Botan::Base64_Encoder );
pipeb64enc.process_msg(pipe.read_all(0));
std::string StrBase64Encoded = pipeb64enc.read_all_as_string(0);

// Return
pReturnEncryptedText = iv.as_string() + StrBase64Encoded;

Пример расшифровки на php с использованием библиотеки phpseclib:

include('Crypt/AES.php');
$aes = new Crypt_AES(CRYPT_AES_MODE_CBC); //mcrypt is used
//Decrypt request from application. [IV 32 CHARS IN HEX] [BASE64 ENCRYPTED TEXT]
$aes->setKeyLength(256);
$key = hash('sha256','test', true) ; // true to output raw binary output
$aes->setKey($key);
//Iv
$IV = hex2bin (substr($_POST['ENC'],0,32) );
$aes->setIV(  $IV    );
// Encrypted text in binary
$encryptedTextBin = base64_decode(substr($_POST['ENC'],32));
$decryptedRequest = $aes->decrypt( $encryptedTextBin );

echo $decryptedRequest; //no match

Я также пробовал mcrypt в php напрямую, но безуспешно:

$decrypted_data="";
//128 is a hack as shown on: http://kix.in/2008/07/22/aes-256-using-php-mcrypt/
$td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''); 
mcrypt_generic_init($td, $key, $iv);

$decrypted_data = mdecrypt_generic($td, $encryptedtext);

mcrypt_generic_deinit($td);
mcrypt_module_close($td);

РЕДАКТИРОВАТЬ:

Я только что протестировал 128-битную версию для Botan и phpseclib, и я получаю правильное расшифрование примерно в 50% случаев. Это так странно. Я протестировал разные режимы заполнения в Botan (CTS,PKCS7,OneAndZeros,X9.23), но снова успех только в 50% попыток.


person Marcus Frenkel    schedule 13.02.2013    source источник


Ответы (2)


Было бы полезно, если бы вы разместили образец ключа, который вы используете от Botan, пароль (т.е. предварительное хэширование), IV, который вы используете, и открытый текст, который вы используете / зашифрованный текст, который вы получаете. Это позволило бы людям самим тестировать различные возможности, а не заставлять вас делать все от их имени.

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

person neubert    schedule 13.02.2013
comment
Я попробовал все режимы заполнения в Botan (в CBC по умолчанию используется дополнение, совместимое с PKCS # 5 / # 7). Похоже, что phpseclib и mcrypt поддерживают только PKCS#1, который не поддерживается Botan. Однако я могу оставить проблему заполнения, насколько мне известно, она влияет только на последний блок открытого текста. В моем случае расшифрованный текст представляет собой всего лишь набор символов, не имеющий ничего общего с исходным текстом. - person Marcus Frenkel; 14.02.2013
comment
Материал mcrypt null pads - он не выполняет заполнение PKCS1, если только это не делает оболочка. В случае с phpseclib.. вы можете отключить отступы и написать свою собственную функцию для заполнения по своему усмотрению. - person neubert; 14.02.2013
comment
Я реализовал правильное заполнение на основе: coderelic.com/2011/ 10/aes-256-шифрование-с-php. Тем не менее результаты случайны. Я также пробовал php openssl, но все же результаты случайны, когда-то получится, когда-то нет. Я подозреваю, что проблема в Ботане, и я не могу изменить эту библиотеку :( - person Marcus Frenkel; 14.02.2013
comment
Ну, как я уже сказал, вы также можете опубликовать несколько образцов ключей / открытого текста / зашифрованного текста... - person neubert; 14.02.2013
comment
Я решил проблему, она была связана с закодированным в Base64 текстом, отправленным в данных POST. Я в любом случае благодарю вас за внимание. - person Marcus Frenkel; 18.02.2013

Я наконец решил проблему. Зашифрованный текст отправляется в формате Base64 в данных POST на определенный веб-сервер. В Base64 есть символы, которые являются недопустимыми символами URL-адреса, поэтому я кодирую их в процентах перед отправкой зашифрованного текста в качестве данных публикации. Эти символы: «+», «/» и «=». См.: http://en.wikipedia.org/wiki/Base64#URL_applications.

person Marcus Frenkel    schedule 18.02.2013