【问题标题】:Incompatible AES implementation between Botan and phpseclibBotan 和 phpseclib 之间不兼容的 AES 实现
【发布时间】:2013-02-13 18:14:22
【问题描述】:

我在 C++ 中使用 Botan 库进行 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);

编辑:

我刚刚对 Botan 和 phpseclib 进行了 128 位测试,在大约 50% 的情况下我得到了正确的解密。这太奇怪了。我在 Botan 中测试了不同的填充模式(CTS、PKCS7、OneAndZeros、X9.23),但同样只有 50% 的尝试成功。

【问题讨论】:

    标签: php cryptography aes phpseclib botan


    【解决方案1】:

    如果您发布了您从 Botan 使用的密钥、密码(即预散列)、您使用的 IV 和您使用的明文/您获得的密文的示例,将会有所帮助.这会让人们自己测试各种可能性,而不是让你代表他们做所有事情。

    无论如何,我的第一个猜测是 Botan 默认可能不填充,而 phpseclib 默认假设明文已被填充。

    【讨论】:

    • 我尝试了 Botan 中的所有填充模式(在 CBC 中,它默认为 PKCS #5/#7 兼容的填充)。似乎 phpseclib 和 mcrypt 只支持 PKCS#1,Botan 不支持。但是,我可以离开填充问题,据我所知,它只影响最后一个纯文本块。就我而言,解密后的文本只是一堆字符,与原始文本无关。
    • mcrypt null pads 的东西 - 它不做 PKCS1 填充,除非包装器这样做。在 phpseclib.. 的情况下,您可以禁用填充并根据需要编写自己的函数来填充。
    • 我根据coderelic.com/2011/10/aes-256-encryption-with-php 实现了正确的填充。结果仍然是随机的。我也尝试过 php openssl 但结果仍然是随机的,一次成功一次不成功。我怀疑问题出在 Botan 中,我无法更改该库:(
    • 正如我所说,您还可以发布一些示例密钥/明文/密文...
    • 我解决了这个问题,它与 POST 数据中发送的 Base64 编码文本有关。无论如何,我感谢您的关注。
    【解决方案2】:

    我终于解决了这个问题。加密后的文本以 POST 数据中的 Base64 格式发送到某个 Web 服务器。 Base64 中有一些字符是无效的 URL 字符,因此我在将加密文本作为发布数据发送之前对它们进行了百分比编码。这些字符是:“+”、“/”和“=”。见:http://en.wikipedia.org/wiki/Base64#URL_applications

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多