2009-06-17 28 views
8

Có cách nào để tính kết quả lớn nhất từ ​​mã hóa Rijndael với chiều dài mảng cố định không?Tính kích thước tối đa cho dữ liệu được mã hóa

Encryption method: RijndaelManaged

Padding: PKCS7

CipherMode: CBC

kích cỡ khối 128

KeySize: 128

tôi cần điều này như im chuyển đổi cơ sở dữ liệu mà tất cả các chuỗi sẽ được mã hóa vì vậy tôi cần phải thay đổi kích thước của tất cả các trường chuỗi.

Trả lời

3

Tất cả những gì bạn cần phải cố gắng này ra:


    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

Có. Làm tròn kích thước đầu vào của bạn thành bội số gần nhất của kích thước khối của bạn (ví dụ: 128/8 = 16 byte).

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

Cẩn thận với phương trình thứ hai, không phải mọi ngôn ngữ xử lý các modulo của một số âm cách bạn đang giả định. Ví dụ C/C++ sẽ cho bạn câu trả lời sai như (-a% b) == - (a% b) trong các ngôn ngữ đó. – Naaff

+1

Điểm tốt. Tôi đã xóa cái thứ hai để tránh nhầm lẫn. –

2

Câu trả lời của Jeff gần như chính xác, ngoại trừ PKCS7 sẽ luôn thêm đệm vào thư, ngay cả khi thư khớp chính xác trong một số khối. Ngoài ra, đừng quên rằng nếu sử dụng một IV ngẫu nhiên thì IV cũng phải được lưu trữ. Công thức điều chỉnh cho chiều dài của một thông điệp đệm PKCS7 là:

extraBytesNeeded = (16 - (inputSize % 16)); // whole block of padding if input fits exactly 
maxSize = inputSize + extraBytesNeeded + IVbytes; 
Các vấn đề liên quan