سؤال

هل هناك أي طريقة لحساب أكبر حصيلة من التشفير ريجنديل بطول مجموعة ثابت؟

وطريقة التشفير: RijndaelManaged

وحشوة: PKCS7

وCipherMode: CBC

وBlockSize 128

وKeySize: 128

وأنا في حاجة الى ذلك كما ايم تحويل قاعدة بيانات حيث تسير كل سلسلة لتكون مشفرة لذلك أنا بحاجة إلى تغيير حجم جميع حقول السلسلة.

هل كانت مفيدة؟

المحلول

وكل ما تحتاجه لمحاولة ذلك:


   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  });
      }

      /// <summary>
      /// Calculate the encrypted size of input buffer
      /// </summary>
      /// <param name="inputBuffer">The input buffer</param>
      /// <returns>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;
      }
   }

نصائح أخرى

نعم. محاصرة حجم المدخلات الخاصة بك إلى أقرب مضاعف من حجم كتلة الخاص بك (على سبيل المثال 128/8 = 16 بايت).

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

والجواب جيف هو الصحيح تقريبا، إلا أن PKCS7 سوف تضيف دائما الحشو على الرسالة، حتى إذا كانت الرسالة يناسب تماما داخل عدد لا يتجزأ من الكتل. أيضا، لا ننسى أن في حالة استخدام IV العشوائية التي الرابع له ليتم تخزينها أيضا. الصيغة تصحيح لطول رسالة مبطنة PKCS7 هي:

extraBytesNeeded = (16 - (inputSize % 16)); // whole block of padding if input fits exactly
maxSize = inputSize + extraBytesNeeded + IVbytes;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top