2009-06-17 15 views
8

Bir Rijndael şifrelemesinden en büyük sonucu sabit bir dizi uzunluğa göre hesaplamanın bir yolu var mı?İşlemci verileri için maksimum boyutu hesapla

Şifreleme yöntemi: PKCS7

CipherMode:

Dolgu RijndaelManaged CBC

BlockSize 128

KeySize: 128

nerede tüm dize bir veritabanı dönüştürme im olarak buna ihtiyacım şifrelenecek, böylece tüm dize alanlarının boyutunu değiştirmem gerekiyor.

cevap

3

herşey bu denemek gerekir: İkinci denklemle


    public partial class Form1 : Form 
    { 
     private SymmetricAlgorithm mEncryptionType; 

     public Form1() 
     { 
     mEncryptionType = new RijndaelManaged(); 
     mEncryptionType.Padding = PaddingMode.PKCS7; //PaddingMode.None; 
     mEncryptionType.Mode = CipherMode.CBC; 
     mEncryptionType.BlockSize = 128; // 192; // 256; // Update byte array to IV when changed 
     mEncryptionType.KeySize = 128; // 192; // 256; // Update byte array to Key when changed 
     mEncryptionType.IV = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 
              0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F}; 
     mEncryptionType.Key = new byte[] { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 
              0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF }; 

     int encrypted_size = CalculateEncryptedSize(new byte[] { 0x22, 0x23, 0x44 }); 
     // Shows Theran's point about exact block size 
     encrypted_size = CalculateEncryptedSize(new byte[] { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 
              0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF }); 
     } 

     /// &ltsummary> 
     /// Calculate the encrypted size of input buffer 
     /// </summary> 
     /// &ltparam name="inputBuffer">The input buffer</param> 
     /// &ltreturns>Size of the encrypted buffer</returns> 
     public int CalculateEncryptedSize(byte[] inputBuffer) 
     { 
     int extra_padding = 0; 
     if (mEncryptionType.Padding != PaddingMode.None) 
     { 
      int padding_size = (mEncryptionType.BlockSize/8); 
      extra_padding = (padding_size - (inputBuffer.Length % padding_size)); 
     } 
     return inputBuffer.Length + extra_padding; 
     } 
    } 
2

Evet. Giriş boyutunuzu, blok boyutunuzun en yakın katına yuvarlayın (örn. 128/8 = 16 bayt). O PKCS7 hep mesajı tam olarak blokların ayrılmaz bir dizi içine sığar bile iletiye dolgu katacak dışında

extraBytesNeeded = (16 - (inputSize % 16)) % 16; 
maxSize = inputSize + extraBytesNeeded. 
+1

Dikkatli, her dil Negatif bir sayının modulo kolları varsaydığın gibi. Örneğin C/C++, bu dillerdeki yanlış yanıtı (-a% b) == - (a% b) olarak verecektir. – Naaff

+1

İyi nokta. Karışıklığı önlemek için ikincisini sildim. –

2

Jeff'in cevap, neredeyse doğrudur. Ayrıca, eğer IV'ün de saklanması gerektiğine dair bir rastgele IV kullanıyorsanız bunu unutmayın. Bir PKCS7 yastıklı mesajın uzunluğu için düzeltilmiş bir formüldür:

extraBytesNeeded = (16 - (inputSize % 16)); // whole block of padding if input fits exactly 
maxSize = inputSize + extraBytesNeeded + IVbytes; 
İlgili konular