Я использую библиотеку 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% попыток.