Botan和phpseclib之间的AES实现不兼容

时间:2013-02-13 18:14:22

标签: php cryptography aes phpseclib botan

我正在使用Botan库在C ++中进行AES加密/解密。我无法在phpseclib中使用Botan的输出并获得准确的结果。如果有人为我指出了Botan和phpseclib或任何其他PHP加密库之间的互操作性,我将不胜感激。谢谢!

C ++中使用Botan进行加密的示例

// 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;

使用phpseclib库在php中解密的例子:

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

我也直接在php中试过mcrypt但没有成功:

$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%的尝试。

2 个答案:

答案 0 :(得分:1)

如果你发布了一个你从Botan使用的密钥样本,密码(即预先散列),你正在使用的IV和你正在使用的明文/你正在使用的密文,它会有所帮助。这让人们自己测试各种可能性,而不是让你代表他们做所有事情。

无论如何,我的第一个猜测是Botan默认情况下不会填充,而默认情况下,phpseclib会假设明文已填充。

答案 1 :(得分:1)

我终于解决了这个问题。加密文本在POST数据中以Base64格式发送到某个Web服务器。 Base64中的字符是无效的URL字符,所以在将加密文本作为发布数据发送之前,我会对它们进行编码。这些字符是:'+','/'和'='。请参阅:http://en.wikipedia.org/wiki/Base64#URL_applications