2009-06-17 3 views
8

배열 길이가 고정되어있는 Rijndael 암호화에서 가장 큰 결과를 계산할 방법이 있습니까?암호화 된 데이터의 최대 크기 계산

암호화 방법 : PKCS7

CipherMode :

패딩 것은 RijndaelManaged CBC를

블록 크기 128

으로 KeySize : 128

어디서 모든 문자열 데이터베이스를 변환 메신저로이 필요 그래서 나는 모든 문자열 필드의 크기를 변경해야 암호화됩니다.

답변

3

모든 것이 당신이 시도해야합니다 두 번째 방정식


    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

예. 입력 크기를 가장 가까운 블록 크기의 배수로 반올림하십시오 (예 : 128/8 = 16 바이트). 그 PKCS7 항상 메시지가 정확하게 블록의 정수 내부에 맞는 경우에도 메시지에 패딩을 추가합니다 제외

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

주의가 아니라 모든 언어는 음수의 모듈을 처리 당신이 추측하는 방식. 예를 들어 C/C++에서는 (-a % b) == - (a % b)와 같은 잘못된 대답을 줄 것입니다. – Naaff

+1

좋은 지적. 혼란을 피하기 위해 두 번째 파일을 삭제했습니다. –

2

제프의 대답은 거의 정확합니다. 또한 무작위 IV를 사용하면 IV도 저장해야한다는 것을 잊지 마십시오. PKCS7 패딩 메시지의 길이에 대한 보정 공식은 다음과 같습니다

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