poco aes 加密
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;
}
poco 交流羣: 386220502