2009-06-17 9 views
8

क्या एक निश्चित सरणी लंबाई के साथ रिजेंडेल एन्क्रिप्शन से सबसे बड़े परिणाम की गणना करने का कोई तरीका है?एन्क्रिप्टेड डेटा के लिए अधिकतम आकार की गणना करें

एन्क्रिप्शन विधि: RijndaelManaged

पैडिंग: PKCS7

CipherMode: सीबीसी

blocksize 128

KeySize: 128

मैं एक डेटाबेस परिवर्तित जहां सभी स्ट्रिंग im के रूप में इस की जरूरत है एन्क्रिप्टेड होने जा रहे हैं इसलिए मुझे सभी स्ट्रिंग फ़ील्ड के आकार को बदलने की जरूरत है।

उत्तर

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

दूसरे समीकरण के साथ सावधान, नहीं हर भाषा एक ऋणात्मक संख्या के सापेक्ष संभालती जिस तरह से आप मान रहे हैं। उदाहरण के लिए सी/सी ++, आपको उन भाषाओं में गलत जवाब देगा (-a% b) == - (% b)। – Naaff

+1

अच्छा बिंदु। मैंने भ्रम से बचने के लिए दूसरा हटा दिया। –

2

जेफ के जवाब है, लगभग सही है। साथ ही, यह न भूलें कि यदि यादृच्छिक चतुर्थ का उपयोग करना है तो चौथाई भी संग्रहीत किया जाना चाहिए। एक PKCS7 गद्देदार संदेश की लंबाई के लिए सही सूत्र है:

extraBytesNeeded = (16 - (inputSize % 16)); // whole block of padding if input fits exactly 
maxSize = inputSize + extraBytesNeeded + IVbytes; 
संबंधित मुद्दे