2009-06-17 74 views
8

Czy istnieje sposób na obliczenie największego wyniku z szyfrowania Rijndael o stałej długości tablicy?Oblicz maksymalny rozmiar dla encypowanych danych

metoda szyfrowania: RijndaelManaged

padding: PKCS7

CipherMode CBC

blocksize 128

rozmiar klucza: 128

muszę to jak im konwersji bazy danych, gdzie cały łańcuch będą zaszyfrowane, więc muszę zmienić rozmiar wszystkich pól łańcuchowych.

Odpowiedz

3

Wszystko trzeba to wypróbować:


    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

Tak. Uzupełnij rozmiar wejściowy do najbliższej wielokrotności rozmiaru bloku (na przykład 128/8 = 16 bajtów).

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

Ostrożnie z drugiego równania, nie każdy język obsługuje modulo z liczby ujemnej sposób w jaki zakładasz. C/C++ na przykład da ci złą odpowiedź jako (-a% b) == - (a% b) w tych językach. – Naaff

+1

Dobra uwaga. Usunąłem drugi, aby uniknąć zamieszania. –

2

odpowiedź Jeffa jest prawie poprawne, z tym że PKCS7 zawsze dodać dopełnienie do wiadomości, nawet jeśli wiadomość dokładnie pasuje wewnątrz całkowitej liczbie bloków. Nie zapominaj także, że jeśli używasz losowego IV, że IV ma być przechowywany również. Poprawiony wzór na długość PKCS7 wyściełanym wiadomości wynosi:

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