0

C++ での AES 暗号化/復号化に Botan ライブラリを使用しています。Botan の出力を phpseclib で使用して正確な結果を得ることができません。Botan と phpseclib またはその他の PHP 暗号化ライブラリとの間の相互運用性のための実用的なコードを教えていただければ幸いです。ありがとう!

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;

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% にすぎません。

4

2 に答える 2

1

私は最終的に問題を解決しました。暗号化されたテキストは、POST データの Base64 形式で特定の Web サーバーに送信されます。Base64 には無効な URL 文字である文字があるため、暗号化されたテキストを投稿データとして送信する前にそれらをパーセント エンコードします。これらの文字は、「+」、「/」、および「=」です。参照: http://en.wikipedia.org/wiki/Base64#URL_applications

于 2013-02-18T12:39:49.317 に答える
1

ボタンから使用しているキーのサンプル、パスワード(つまり、事前ハッシュ)、使用しているIV、使用している平文/取得している暗号文を投稿すると役立ちます。そうすれば、あなたが代わりにすべてを行うのではなく、人々がさまざまな可能性を自分でテストできるようになります.

とにかく、私の最初の推測では、Botan はデフォルトでパディングされていない可能性がありますが、phpseclib はデフォルトで平文がパディングされていると想定しています。

于 2013-02-13T21:23:05.063 に答える