2016-11-19 41 views
0

我正在用C++進行AES加密,我在GitHub上發現了一個AES的實現,問題是輸入字節數組的大小應該可以被16整除,而且我的數據在大多數時間裏都不會滿足這個要求。我想添加填充(0-s到數組的末尾),直到大小被16整除。如何在C++中將填充添加到BYTE數組中?

我有一個計算最接近大小的函數,但我不知道如何向數組添加填充。

PBYTE AddPadding(PBYTE Array, int size) 
{ 
    if (size % 16 != 0) 
    { 
     size += (16 - size % 16); 
     size = ceil(size/16) * 16; 
    } 

    BYTE* tmp = new BYTE[size]; 

    //the magic should happen here 

    return tmp; 
} 

的輸入和電話是:

BYTE in[] = { 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, 
     0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, 
     0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11, 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef, 
     0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17, 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10, 0x25 }; 

PBYTE tmp = AddPadding(in, sizeof(in)); 
+0

您不能假定緊隨該數組的字節是空閒的。因此,如果你這樣做,你應該傳遞一個指向數組的指針,分配一個合適大小的新數組(+錯誤處理),將內容複製到新數組中,添加零,釋放原始數組( ,並返回新的數組。 很明顯,這是低效的,可能會失敗。 最好按原樣處理原始數組,並在最後一次迭代中添加虛擬零。 –

+0

使用處理加密填充的庫並在解密時刪除它,這是很常見的。通常有一個選項,很多時候它是默認的。如果實現不支持那個查找另一個庫。 – zaph

回答

1

大多數加密庫將添加填充你。如果你想自己做,那麼:

  1. 計算你需要多少填充。

  2. 由於C數組不可擴展,您將需要創建一個新數組來保存明文和填充。

  3. PKCS#7填充很常見,所以除非你有理由不這樣做。

  4. 將明文後跟填充符複製到新數組中。

  5. 將新陣列傳遞給AES進行加密;它現在可以平分爲塊。

  6. 解密時檢查填充是否存在並正確形成。格式不正確的填充表示問題。

  7. 刪除填充並返回解密的文本。