2012-11-11 178 views
3

我试图让此代码正常工作。它是从Cryptopp AESAES和密钥长度错误

Demonstrates encryption and decryption using AES in CTR

唯一的区别是,我创建函数encryptAESdecryptAES和插入的代码。 它的工作原理没有创建这些功能。但是现在我得到了以下错误:AES/CTR 4不是有效的密钥长度,但密钥长度为16位。

string encryptAES(const byte key[], const string& plain, const byte iv[]) 
{ 
try 
{ 
    string cipher; 

    CTR_Mode<AES>::Encryption e; 
    e.SetKeyWithIV(key, sizeof(key), iv); 

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

string decryptAES(const byte key[], const string& cipher, const byte iv[]) 
{ 
try 
{ 
    string recovered; 

    CTR_Mode<AES>::Decryption d; 
    d.SetKeyWithIV(key, sizeof(key), iv); 

    // The StreamTransformationFilter removes 
    // padding as required. 
    StringSource s(cipher, true, 
     new StreamTransformationFilter(d, 
      new StringSink(recovered) 
     ) // StreamTransformationFilter 
    ); // StringSource 
    return recovered; 
} 
catch(const CryptoPP::Exception& e) 
{ 
    cerr << e.what() << endl; 
    return ""; 
} 
} 

int main(int argc, char *argv[]) 
{ 
AutoSeededRandomPool prng; 

byte key[AES::DEFAULT_KEYLENGTH]; 
prng.GenerateBlock(key, sizeof(key)); 

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

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

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

// Pretty print key 
encoded.clear(); 
StringSource(key, sizeof(key), true, 
    new HexEncoder(
     new StringSink(encoded) 
    ) // HexEncoder 
); // StringSource 
cout << "key: " << encoded << endl; 

// Pretty print iv 
encoded.clear(); 
StringSource(iv, sizeof(iv), true, 
    new HexEncoder(
     new StringSink(encoded) 
    ) // HexEncoder 
); // StringSource 
cout << "iv: " << encoded << endl; 

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

cout << "plain text: " << plain << endl; 
cipher = encryptAES(key, plain, iv); 

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

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

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

recovered = decryptAES(key, cipher, iv); 
cout << "recovered text: " << recovered << endl; 

cin.sync(); 
cin.get(); 
} 
+1

您的函数正在计算基于退化指针大小的密钥大小。即sizeof(key)!=密钥数组中字节的大小。两个函数都需要一个key_len附加参数。 – WhozCraig

回答

2

你的功能正在采取const byte key[]参数,基本上是作为指针处理。因此sizeof(key)是平台上指针的大小。

string encryptAES(const byte key[], const string& plain, const byte iv[]) 

// sizeof(key) is the size of a pointer 
e.SetKeyWithIV(key, sizeof(key), iv); 

可以使用std::vector<>作为一个选项,或通过key_len,如:

string encryptAES(const byte key[], size_t key_len, const string& plain, const byte iv[]) 

// using key_len for the length of the key 
e.SetKeyWithIV(key, key_len, iv); 

我希望是有道理的,因为同样的错误是在几个地方。

+0

非常感谢。就是这样。你知道,我对C++很陌生。 ;) – nt2005

相关问题