2016-11-22 9 views
0

を取得し、私はJavaに似INIT-アップデート - 最終in Crypto++を使用してecrypting以下午前、暗号++のInit-アップデート - 最終暗号++を使用して大容量のファイルを暗号化するための努力では暗号出力

デモコードは毎回、動作するようですプットが呼び出され、出力バイトが画面に出力されます。

encoder.Put(buffer, ready); 

しかし、私は、すべての暗号文の出力を得るために、とにかく見つけることができません。例えば

'H' -> print 01 to screen 
'E' -> print A9 to screen 
'L' -> print 5J to screen 
'L' -> print 13 to screen 
'O' -> print 3d to screen ... 

しかし、私は

...バイト配列 01A95J133dに大きなファイルを暗号化するためのInit-更新-決勝の使用に関連した質問in hereを完全な結果を取得することはできませんがないように見えますまだ実用的なソリューションを提供しています。

これは完全なデモコードです:

enum { ENCRYPT_MODE = 1, DECRYPT_MODE = 2 }; 
struct JavaAlgorithmParameter 
{ 
    JavaAlgorithmParameter() 
     : key(NULL), ksize(0), iv(NULL), vsize(0) {} 

    const byte* key; 
    size_t ksize; 
    const byte* iv; 
    size_t vsize; 
}; 

///////////////////////// 
///////////////////////// 

class JavaCipher 
{ 
public: 
    static JavaCipher* getInstance(const std::string& transformation); 

    void init(int opmode, const JavaAlgorithmParameter& params); 
    size_t update(const byte* in, size_t isize, byte* out, size_t osize); 
    size_t final(byte* out, size_t osize); 

    std::string getAlgorithm() const; 

protected: 
    JavaCipher(const std::string& transformation); 

private: 
    std::string m_transformation; 
    member_ptr<SymmetricCipher> m_cipher; 
    member_ptr<StreamTransformationFilter> m_filter; 
}; 

///////////////////////// 
///////////////////////// 

JavaCipher* JavaCipher::getInstance(const std::string& transformation) 
{ 
    return new JavaCipher(transformation); 
} 

JavaCipher::JavaCipher(const std::string& transformation) 
    : m_transformation(transformation) { } 

std::string JavaCipher::getAlgorithm() const 
{ 
    return m_transformation; 
} 

///////////////////////// 
///////////////////////// 

size_t JavaCipher::final(byte* out, size_t osize) 
{ 
    m_filter.get()->MessageEnd(); 

    if (!out || !osize || !m_filter.get()->AnyRetrievable()) 
     return 0; 

    size_t t = CryptoPP::STDMIN(m_filter.get()->MaxRetrievable(), (word64)osize); 
    t = m_filter.get()->Get(out, t); 
    return t; 
} 

///////////////////////// 
///////////////////////// 

size_t JavaCipher::update(const byte* in, size_t isize, byte* out, size_t osize) 
{ 
    if (in && isize) 
     m_filter.get()->Put(in, isize); 

    if (!out || !osize || !m_filter.get()->AnyRetrievable()) 
     return 0; 

    size_t t = STDMIN(m_filter.get()->MaxRetrievable(), (word64)osize); 
    t = m_filter.get()->Get(out, t); 
    return t; 
} 

///////////////////////// 
///////////////////////// 

void JavaCipher::init(int opmode, const JavaAlgorithmParameter& params) 
{ 
    if (m_transformation == "AES/ECB/PKCSPadding" && opmode == ENCRYPT_MODE) 
    { 
     m_cipher.reset(new ECB_Mode<AES>::Encryption); 
     m_cipher.get()->SetKey(params.key, params.ksize); 
     m_filter.reset(new StreamTransformationFilter(*m_cipher.get(), NULL, BlockPaddingSchemeDef::PKCS_PADDING)); 
    } 
    else if (m_transformation == "AES/ECB/PKCSPadding" && opmode == DECRYPT_MODE) 
    { 
     m_cipher.reset(new ECB_Mode<AES>::Decryption); 
     m_cipher.get()->SetKey(params.key, params.ksize); 
     m_filter.reset(new StreamTransformationFilter(*m_cipher.get(), NULL, BlockPaddingSchemeDef::PKCS_PADDING)); 
    } 
    else if (m_transformation == "AES/CBC/PKCSPadding" && opmode == ENCRYPT_MODE) 
    { 
     m_cipher.reset(new CBC_Mode<AES>::Encryption); 
     m_cipher.get()->SetKeyWithIV(params.key, params.ksize, params.iv); 
     m_filter.reset(new StreamTransformationFilter(*m_cipher.get(), NULL, BlockPaddingSchemeDef::PKCS_PADDING)); 
    } 
    else if (m_transformation == "AES/CBC/PKCSPadding" && opmode == DECRYPT_MODE) 
    { 
     m_cipher.reset(new CBC_Mode<AES>::Decryption); 
     m_cipher.get()->SetKeyWithIV(params.key, params.ksize, params.iv); 
     m_filter.reset(new StreamTransformationFilter(*m_cipher.get(), NULL, BlockPaddingSchemeDef::PKCS_PADDING)); 
    } 
    else if (m_transformation == "AES/CTR/NoPadding" && opmode == ENCRYPT_MODE) 
    { 
     m_cipher.reset(new CTR_Mode<AES>::Encryption); 
     m_cipher.get()->SetKeyWithIV(params.key, params.ksize, params.iv); 
     m_filter.reset(new StreamTransformationFilter(*m_cipher.get(), NULL, BlockPaddingSchemeDef::NO_PADDING)); 
    } 
    else if (m_transformation == "AES/CTR/NoPadding" && opmode == DECRYPT_MODE) 
    { 
     m_cipher.reset(new CTR_Mode<AES>::Decryption); 
     m_cipher.get()->SetKeyWithIV(params.key, params.ksize, params.iv); 
     m_filter.reset(new StreamTransformationFilter(*m_cipher.get(), NULL, BlockPaddingSchemeDef::NO_PADDING)); 
    } 
    else 
     throw NotImplemented(m_transformation + " is not implemented"); 
} 

///////////////////////// 
///////////////////////// 

int main(int argc, char* argv[]) 
{ 
    try 
    { 
     byte key[32], iv[16]; 
     OS_GenerateRandomBlock(false, key, COUNTOF(key)); 
     OS_GenerateRandomBlock(false, iv, COUNTOF(iv)); 

     HexEncoder encoder(new FileSink(cout)); 

     JavaAlgorithmParameter params; 
     params.key = key; 
     params.ksize = COUNTOF(key); 
     params.iv = iv; 
     params.vsize = COUNTOF(iv); 

     //JavaCipher* cipher = JavaCipher::getInstance("AES/CTR/NoPadding"); 
     JavaCipher* cipher = JavaCipher::getInstance("AES/CBC/PKCSPadding"); 
     cipher->init(ENCRYPT_MODE, params); 

     cout << "Algorithm: " << cipher->getAlgorithm() << endl; 

     cout << "Key: "; 
     encoder.Put(key, COUNTOF(key)); 
     cout << endl; 

     cout << "IV: "; 
     encoder.Put(iv, COUNTOF(iv)); 
     cout << endl; 

     char * allText = FileUtil::readAllByte("1MB.txt"); 
     long len = strlen(allText); 

     byte buffer[64]; 

     size_t ready = 0; 

     for (unsigned int i = 0; i <= len; i++) 
     { 
      byte b = allText[i]; 

      //cout << "Put 0x"; 
      encoder.Put(b); 
      cout << endl; 

      ready = cipher->update(&b, 1, buffer, COUNTOF(buffer)); 

      if (ready) 
      { 
       //cout << "Get: "; 
       encoder.Put(buffer, ready); 
       cout << endl; 
      } 
     } 

     ready = cipher->final(NULL, 0); 
     if (ready) 
     { 
      //cout << "Final: "; 
      encoder.Put(buffer, ready); 
      cout << endl; 
     } 

     ready = cipher->final(buffer, COUNTOF(buffer)); 
     if (ready) 
     { 
      //cout << "Final: "; 
      encoder.Put(buffer, ready); 
      cout << endl; 
     } 

     delete cipher; 
     getchar(); 
    } 
    catch (const Exception& ex) 
    { 
     cerr << ex.what() << endl; 
    } 

    return 0; 
} 
+0

あなたはC#の開発者であるように見えます。 C++の代わりにC#を使用してタスクを達成することはできませんか? .Netには必要なものすべてがあるようです。 – jww

+0

申し訳ありません:)私はonedayでC#でそれらをすべて作った。しかし、私は、Crypto ++のようなマルチスレッドのC++ライブラリでは、より速く、速くなると思っています。 – Andiana

+0

私が提供しようとしてきた助けは役に立ちませんでした。 Crypto ++ライブラリを続ける前に、C++についてもっと学ぶべきでしょう。 – jww

答えて

1

しかし、私は、すべての暗号文の出力を得るために、とにかく見つけることができません。無出力バッファと 例

'H' -> print 01 to screen 
'E' -> print A9 to screen 
'L' -> print 5J to screen 
'L' -> print 13 to screen 
'O' -> print 3d to screen ... 

のためではなく、私はバイト配列01A95J133dに完全な結果を取得することはできません...

コールcipher::update

cipher->update(&b, 1, NULL, 0); 

次に、取得呼び出し後のバッファcipher::final

size_t size = <some appropriately size for the cipher text>; 
byte result[size]; 
cipher->final(result, size); 

あなたは<some appropriately size for the cipher text>に問題がある場合は、そのクラスに新しいメソッドを追加するには:

size_t ready() const 
{ 
    return m_filter.get()->MaxRetrievable(); 
} 
関連する問題