poco aes 加密

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章