2012-09-10 21 views
0

我有一個代碼,使用三重DES封裝和解密數據。 一切工作正常的代碼。將TripleDes改變數據大小

我有一個三重Des查詢。 三重DES在執行加密過程時會改變數據大小。 我google了一下,完全被我得到的答案搞糊塗了。

它會改變。如果是,則表示如何查找加密數據的大小。

下面是代碼:

unsigned char initVector[8]; 
unsigned char* block; 
int  j; 

    memset(initVector, 0xEE, sizeof(initVector)); 
    nBlocks = dwDataSize/8; 

    for (i=0; i < nBlocks; i++) 
    { 
     block = (unsigned char*) pData + i*8; 
     memset(initVector, 0xEE, sizeof(initVector)); 
     des_ede3_cbc_encrypt((unsigned char *)block,(unsigned char *)block, 8, 
       m_Schedule1 , m_Schedule2, m_Schedule3, (C_Block *)initVector, DES_ENCRYPT); 

我在尺寸將會改變另一個討論看到的。

這是鏈接。 Length of Encrypted String

問候, Siva./

+0

請發一些你的代碼 –

+0

只做了基礎代碼。沒關係。但我需要知道尺寸的變化。 – siva111

回答

4

TripleDes的是一個塊密碼原語。分組密碼通過基於密鑰創建輸入數據塊(其應該與隨機數據不可區分)的置換排列來工作,該密鑰只​​有在密鑰已知時才能被反轉。因此,加密數據佔據與輸入數據完全相同的空間量(除了可能用於填充最終塊)。典型的塊大小是從4到32字節的任何兩個冪。 (一個思想實驗:密文不可能是比輸入短,因爲那麼兩個不同的輸入將不得不映射到相同的密文,這是不可能的;相反,如果密碼文本是更長的,那麼將會有某些密文不可能是加密的結果,因此不能與「隨機數據區分開來」。)

+0

+1。用於所有實際目的的輸入和輸出大小相同(模數填充) – Thilo

+0

什麼是+1。以一些填充爲模。 – siva111

+0

請注意,RSA密文總是大於輸入。所以最後的假設只適用於分組密碼。 –

0

這取決於。爲了更加精確,這取決於以下因素:

  1. 密文和明文的編碼
  2. 加密模式
  3. 填充模式&塊大小
  4. 的隨機數或IV
  5. (可選)驗證標記

3DES是一個分組密碼。它是一個看似隨機的位置換(主要使用字節作爲最小元素)。單個3DES使用64位/ 8字節作爲輸入並生成相同的大小

從第一個開始:如果您加密一段文本(字符串),則需要先將字符串編碼爲字節。如果您希望將密文存儲在字符串中,則需要將結果轉換爲字符串。

接下來是加密模式:如果這是一種將3DES塊密碼轉換爲流密碼(例如CTR)的模式,則輸入大小與輸出大小相同,但不包括NONCE。

然後是填充模式。如果使用ECB或CBC模式加密,則必須爲,如果明文長度爲x,則x % n != 0n爲塊大小(以字節爲單位)。如果可以區分純文本和填充,則可以將0添加到n - 1字節的填充。如果你不能,那麼你需要經常填充,加入1n字節的填充。 PKCS#5填充(最常見)填充。

通常情況下,您還需要傳輸IV或NONCE。它們通常與塊大小大致相同。一個常見的選擇是將IV添加到密文中。這通常用於您應用的CBC模式加密。唯一一次你不應該創建一個新的(隨機)IV是當你只使用一次密鑰。

大多數情況下,您應該爲密文添加完整性保護。如果你使用例如GCM模式加密,那麼您需要一些額外的認證標籤空間。如果您使用MAC或HMAC,則應該將其包含在密文的頂部。

也有這樣的事情,密文竊取,可以用來消除填充。最後,對於某些單塊加密模式,您可能不需要IV。

你的情況

如果用字節工作,使用CBC模式加密,前置的IV和使用PKCS#5填充然後計算將是(n) + ((x) + (n - x % n))。對於3DES,n = 8