2013-07-09 3 views
2

AES CBC 및 CTR 모드를 사용하여 데이터를 해독하려고합니다. 암호문에는 16 바이트 IV가 앞에 붙습니다.AES CBC 암호 해독 작동, CTR이 없음

나는 다음과 같은 형식으로 내 암호문 데이터가 : 나는 암호화를 사용하고

vector<vector<byte>> CBCMessages; 
vector<vector<byte>> CBCKeys; 
vector<vector<byte>> CTRMessages; 
vector<vector<byte>> CTRKeys; 

++ 데이터를 해독 할 수 있습니다. 당신이 볼 수 있듯이

for (int i = 0; i < CBCMessages.size(); i++) 
{ 
    std::string decryptedtext; 

    // split IV from ciphertext 
    byte iv[16]; 
    std::copy(CBCMessages[i].begin(), CBCMessages[i].begin()+16, iv); 
    CBCMessages[i].erase(CBCMessages[i].begin(), CBCMessages[i].begin()+16); 

    // this block works fine 
    AES::Decryption aesDecryption(&(CBCKeys[i][0]), CBCKeys[i].size()); 
    CBC_Mode_ExternalCipher::Decryption cbcDecryption(aesDecryption, iv); 
    StreamTransformationFilter stfDecryptor(cbcDecryption, new CryptoPP::StringSink(decryptedtext)); 
    stfDecryptor.Put(reinterpret_cast<const unsigned char*>(&(CBCMessages[i][0])), CBCMessages[i].size()); 
    stfDecryptor.MessageEnd(); 

    std::cout << decryptedtext << std::endl; 
} 

for (int i = 0; i < CTRMessages.size(); i++) 
{ 
    std::string decryptedtext; 

    // split IV from ciphertext 
    byte iv[16]; 
    std::copy(CTRMessages[i].begin(), CTRMessages[i].begin()+16, iv); 
    CTRMessages[i].erase(CTRMessages[i].begin(), CTRMessages[i].begin()+16); 

    // this block produces junk 
    AES::Decryption aesDecryption(&(CTRKeys[i][0]), CTRKeys[i].size()); 
    CTR_Mode_ExternalCipher::Decryption ctrDecryption(aesDecryption, iv); 
    StreamTransformationFilter stfDecryptor(ctrDecryption, new CryptoPP::StringSink(decryptedtext)); 
    stfDecryptor.Put(reinterpret_cast<const unsigned char*>(&(CTRMessages[i][0])), CTRMessages[i].size()); 
    stfDecryptor.MessageEnd(); 

    std::cout << decryptedtext << std::endl; 

    // try again with different method - this works fine 
    decryptedtext.clear(); 
    CTR_Mode<AES>::Decryption d; 
    d.SetKeyWithIV(&(CTRKeys[i][0]), CTRKeys[i].size(), iv, 16); 
    StringSource(reinterpret_cast<const unsigned char*>(&(CTRMessages[i][0])), CTRMessages[i].size(), true, 
     new StreamTransformationFilter(d, 
      new StringSink(decryptedtext) 
     ) 
    ); 

    std::cout << decryptedtext << std::endl; 
} 

가, 중간 블록 (CTR 암호 해독을위한 첫 번째 블록)이 정크 출력을 생성 : 이것은 내 코드입니다. 이 블록은 실제로 CBC 암호 해독에 사용 된 블록과 매우 동일해야합니다.

CBC 암호 해독에 사용되는 블록은 기본적으로 this FAQ entry (2005 년 10 월 21 일 10:38 am jeffrey)에서 복사됩니다. 그런 다음이 블록을 변경하여 CTR 암호 해독에 사용합니다.이 암호 해독은 작동하지 않을 때 사용합니다. 두 번째 CTR 블록은 "샘플 프로그램"섹션 here에서 영감을 얻었습니다.

첫 번째 CTR 코드 블록의 문제점은 무엇입니까?

+0

코 세라의 암호화 클래스를 해독하는 데 AES :: 암호화을 필요로? – c00000fd

답변