AES加密數據塊分組長度必須為128比特,密鑰長度可以是128比特、192比特、256比特中的任意一個(如果數據塊及密鑰長度不足時,會補齊)。
poco aes 加密需要注意的兩點: 使用的填充方式是 PKCS5Padding 使用的密鑰最好是16的整數倍。如果不是的話,就不知道他會用啥密鑰來加密了。最好是這樣 setKey() 一下。
Cipher::ByteVec b(16); for( int i = 0; i< 16; ++i ) { b[i] = 's'; } CipherKey key("aes-128-ecb" ); key.setKey( b );驗證網站
下面是別人總結的經驗不知道對不對,但是感覺很有道理的樣子。
來源
不帶模式和填充來獲取AES算法的時候,其默認使用ECB/PKCS5Padding。 算法/模式/填充 16字節加密后數據長度 不滿16字節加密后長度 AES/CBC/NoPadding 16 不支持 AES/CBC/PKCS5Padding 32 16 AES/CBC/ISO10126Padding 32 16 AES/CFB/NoPadding 16 原始數據長度 AES/CFB/PKCS5Padding 32 16 AES/CFB/ISO10126Padding 32 16 AES/ECB/NoPadding 16 不支持 AES/ECB/PKCS5Padding 32 16 AES/ECB/ISO10126Padding 32 16 AES/OFB/NoPadding 16 原始數據長度 AES/OFB/PKCS5Padding 32 16 AES/OFB/ISO10126Padding 32 16 AES/PCBC/NoPadding 16 不支持 AES/PCBC/PKCS5Padding 32 16 AES/PCBC/ISO10126Padding 32 16 可以看到,在原始數據長度為16的整數倍時,假如原始數據長度等于16*n,則使用NoPadding時加密后數據長度等于16*n,其它情況下加密數據長度等于16*(n+1)。在不足16的整數倍的情況下,假如原始數據長度等于16*n+m[其中m小于16],除了NoPadding填充之外的任何方式,加密數據長度都等于16*(n+1);NoPadding填充情況下,CBC、ECB和PCBC三種模式是不支持的,CFB、OFB兩種模式下則加密數據長度等于原始數據長度。
以下代碼與網站的結果相同。
int main(){ Cipher::ByteVec b(16); for( int i = 0; i< 16; ++i ) { b[i] = 's'; } CipherKey key("aes-128-ecb" ); key.setKey( b ); Cipher::Ptr pCipher = CipherFactory::defaultFactory().createCipher(key); std::string in("123"); std::string out = pCipher->encryptString(in, Cipher::ENC_BASE64); std::string result = pCipher->decryptString(out, Cipher::ENC_BASE64); std::cout<<"加密后:"<<out<<std::endl; std::cout<<"解密后:"<<result<<std::endl;}新聞熱點
疑難解答