4

AESを使用して暗号文のブロックを復号化する方法を理解しようとしています。私はcrypto++ライブラリを使用しています-または少なくともそのライブラリを使用しようとしています。しかし、私は絶対にどこにも行きません。この復号化アルゴリズムを実行するのはほんの数行のコードだと思いますが、理解できません。これは私が書いたものです。今すぐ笑い始めましょう:

#include <stdio.h>
#include <cstdlib>
#include <rijndael.h>
#include <sha.h>

using namespace std;

int main()
{

    // Decryption
    CTR_Mode< AES >::Decryption decryptor;
    decryptor.SetKeyWithIV( cbcKey, AES::DEFAULT_KEYLENGTH, cbcCipher );
}

crypto ++を使用して復号化キーを指定して16バイトの暗号文ブロックを「単純に」復号化する方法について、簡単なチュートリアルを教えてもらえますか?彼らのドキュメントは、上記の暗号文よりもわかりにくいものであり(少なくとも私にとっては)、検索してもほとんど役に立ちません。どうもありがとうございます。

4

4 に答える 4

1

crypto ++を使用して復号化キーを指定して、暗号テキストの16バイトブロックを「単純に」復号化する方法に関する簡単なチュートリアルを誰かに教えてもらえますか?

これはCrypto ++ wikiからのものです。CTR モードの例を示します。

AutoSeededRandomPool prng;

SecByteBlock key(AES::DEFAULT_KEYLENGTH);
prng.GenerateBlock( key, key.size() );

byte ctr[ AES::BLOCKSIZE ];
prng.GenerateBlock( ctr, sizeof(ctr) );

string plain = "CTR Mode Test";
string cipher, encoded, recovered;

/*********************************\
\*********************************/

try
{
    cout << "plain text: " << plain << endl;

    CTR_Mode< AES >::Encryption e;
    e.SetKeyWithIV( key, key.size(), ctr );

    // The StreamTransformationFilter adds padding
    //  as required. ECB and CBC Mode must be padded
    //  to the block size of the cipher. CTR does not.
    StringSource ss1( plain, true, 
        new StreamTransformationFilter( e,
            new StringSink( cipher )
        ) // StreamTransformationFilter      
    ); // StringSource
}
catch( CryptoPP::Exception& e )
{
    cerr << e.what() << endl;
    exit(1);
}

/*********************************\
\*********************************/

// Pretty print cipher text
StringSource ss2( cipher, true,
    new HexEncoder(
        new StringSink( encoded )
    ) // HexEncoder
); // StringSource
cout << "cipher text: " << encoded << endl;

/*********************************\
\*********************************/

try
{
    CTR_Mode< AES >::Decryption d;
    d.SetKeyWithIV( key, key.size(), ctr );

    // The StreamTransformationFilter removes
    //  padding as required.
    StringSource ss3( cipher, true, 
        new StreamTransformationFilter( d,
            new StringSink( recovered )
        ) // StreamTransformationFilter
    ); // StringSource

    cout << "recovered text: " << recovered << endl;
}
catch( CryptoPP::Exception& e )
{
    cerr << e.what() << endl;
    exit(1);
}

サンプルプログラムを実行した結果は次のとおりです。

$ ./crytpopp-test.exe 
key: F534FC7F0565A8CF1629F01DB31AE3CA
counter: A4D16CBC010DACAA2E54FA676B57A345
plain text: CTR Mode Test
cipher text: 12455EDB41020E6D751F207EE6
recovered text: CTR Mode Test
于 2013-10-04T04:49:58.250 に答える
1

crypto++ ライブラリの Web ページの FAQ には、「チュートリアル」へのポインタが含まれてます。

于 2012-07-01T06:58:22.980 に答える
0

Crypto++ のチュートリアルでは、フィルターとソースとシンクの使用法に焦点を当てていますが、これは私の意見では複雑すぎると思います。あなたの場合、コードは実際には非常に単純です。

CTR_Mode< AES >::Decryption decryptor;
decryptor.SetKeyWithIV( cbcKey, AES::DEFAULT_KEYLENGTH, cbcCipher );
decryptor.ProcessData(output, input, size);

// Decrypt another piece of data with the same key
decryptor.Resynchronize(new_iv, new_iv_length);
decryptor.ProcessData(new_output, new_input, size);
于 2017-01-29T15:15:35.857 に答える