وصف أساسيات تحويل التشفير AES

يوم جيد ، هبر! قبل حوالي 3 أشهر ، قابل مطور الواجهة الأمامية وسألت أول سؤال لي: "ما هو AES؟" حسنًا ، كما لو كان لا يزال لدي فكرة غير متبلورة حول تشفير AES المتماثل ، تم استخدامه حتى في أحد المشاريع لتشفير البيانات الشخصية. ولكن لمعرفة خوارزمية ريجنديل ولا تزال قادرة على تنفيذها في جافا سكريبت ، فقد بدا لي في ذلك الوقت مهمة صعبة. لكن! لقد تحدى وقبلت.



انتقل إلى معالجة!

كأساس ، أخذت مواصفات FIPS197 AES بتاريخ 26 نوفمبر 2011.

في مجال تكنولوجيا المعلومات ، بعض أشهر خوارزميات التشفير هي:

  • متماثل
  • غير متماثل

الخوارزميات المتماثلة هي تلك الخوارزميات التي تحتوي على مفتاح سري واحد للتشفير ونفس المفتاح لفك التشفير. ميزة هذه الخوارزمية هي سرعة التشفير. العيوب - الحاجة إلى قناة آمنة لنقل هذا المفتاح لفك التشفير.

وتنقسم الخوارزميات المتناظرة بدورها إلى نوعين:

  • ممتلئ الجسم
  • تدفق

تتمتع الكتل بالقدرة على تشفير البيانات في الكتل ، أي عدد محدود محدد مسبقًا من وحدات البايت. وهذا يعني إمكانية موازية تشفير الكتل المتوازية ، أي تشفير كميات كبيرة من البيانات في نفس الوقت ، مع تقليل مورد الوقت.

دفق تشفير حرف بحرف.

مزايا الخوارزميات غير المتماثلة هي تخزين المفتاح الآمن. غير متماثل - تلك الخوارزميات التي تحتوي على مفتاحين:

  • المفتاح العمومي
  • مفتاح سري

publicKey هو مفتاح التشفير. لا تخضع لفك التشفير ، مما يعني عدم الحاجة إلى نقله. مفتاح
خاص - مفتاح فك التشفير.

تتمثل عيوب الخوارزميات غير المتماثلة في أداء التشفير البطيء نسبيًا.

Rijndael هو خوارزمية تشفير كتلة متناظرة مع القدرة على تغيير حجم الكتل والمفاتيح الخاصة من 128 إلى 256 بت بفارق 32 بت. يستخدم تحويلات الإحلال الخطي ويتكون من 10 أو 12 أو 14 طلقة حسب طول المفتاح.
AES - rijndael بمفتاح 128 بت وكتلة بيانات 16 بايت.

من المفترض أنك على دراية بنظرية المصطلحات التالية:

  • نظام رقم ثنائي
  • نظام الأعداد العشرية
  • بت
  • بايت
  • XOR (^)

إذا لم يكن كذلك ، فلا يهم. اقرأ مقالتي "Image Processing ReactJS - NodeJS» أو ألق نظرة على الأمثلة snipettov responsejs.su

المفاهيم الرياضية في rijndael:


  • الحقل GF (2⁸) هو عدد محدود من العناصر ، والنتيجة هي الدرجة الطبيعية التاسعة للرقم الأولي. في إطار GF (2⁸) ، يتم تنفيذ العمليات التعسفية للجمع والطرح والمنتج والتقسيم. المجال GF (2⁸) محدد.
  • . Rijndael [00000000₂; 11111111₂]. , x. , , :

    a(x)=a₇x⁷ +a₆x⁶ +a₅x⁵ +a₄x⁴ +a₃x³ +a₂x² +a₁x +a₀x;

    , a₇, a₆, a₅, a₄, a₃, a₂, a₁, a₀ {0, 1}, :
    87 = 01010111 ( );
    : x⁶ + x⁴ + x² + x + 1;
  • . , , 1 . rijndael m(x):
    m(x)= x⁸ + x⁴ + x³ + x + 1;
  • . XOR, : 1 ^ 1 = 0 ^ 0 = 0; 1 ^ 0 = 0 ^ 1 = 1, :

    , a₇, a₆, a₅, a₄, a₃, a₂, a₁, a₀;
    B, b₇, b₆, b₅, b₄, b₃, b₂, b₁, b₀;

    A = 87 = 01010111; B = 131 = 10000011;
    A ^ B = a₇, a₆, a₅, a₄, a₃, a₂, a₁, a₀ ^ b₇, b₆, b₅, b₄, b₃, b₂, b₁, b₀ = 11010100;
  • . GF(2⁸) ( | -x | = x ) 8, :

    87 x 131 :
    (x⁶ + x⁴ + x² + x + 1)(x⁷ + x + 1) = x¹³ + x¹¹ + x⁹ + x⁸ + x⁷ + x⁷ + x⁵ + x³ + x² + x + x⁶ + x⁴ + x² + x + 1.
    . (.4):

    x⁷ + x⁷ = x⁷(1 + 1) = x⁷(1 ^ 1) = x⁷0 = 0;
    (x⁶ + x⁴ + x² + x + 1)(x⁷ + x + 1) = x¹³ + x¹¹ + x⁹ + x⁸ + x⁶ + x⁵ + x⁴ + x³ + 1.

    m(x) = x⁸ + x⁴ + x³ + x + 1 ( ), rijndael , 8, . . , . :

    (x⁶ + x⁴ + x² + x + 1)(x⁷ + x + 1)/(x⁸ + x⁴ + x³ + x + 1) =
    (x¹³ + x¹¹ + x⁹ + x⁸ + x⁶ + x⁵ + x⁴ + x³ + 1)/(x⁸ + x⁴ + x³ + x + 1) = |Result| = x⁷ + x⁶ + 1


:


  1. keyExpansion() — ;
  2. addRoundKey() — ;
  3. subBytes() — state;
  4. shiftRows() — state;
  5. mixColumns() — state;
  6. invMixColumns() — mixColumns;
  7. invShiftRows() — shiftRows;
  8. invSubBytes() — subBytes;

AES :


  1. state
    - . [0; 255] ( ASCII Unicode). n- 16 . state ( 4 = [ [], [], [], [] ] ), 16 , 16 :

  2. keyExpansion();
    AES, state. . XOR Rcon.

    Rcon — XOR. keyExpansion() XOR’ Rcon . — 11. 10 .

    let rCon = [
      [ 0x00, 0x00, 0x00, 0x00 ],
      [ 0x01, 0x00, 0x00, 0x00 ],
      [ 0x02, 0x00, 0x00, 0x00 ],
      [ 0x04, 0x00, 0x00, 0x00 ],
      [ 0x08, 0x00, 0x00, 0x00 ],
      [ 0x10, 0x00, 0x00, 0x00 ],
      [ 0x20, 0x00, 0x00, 0x00 ],
      [ 0x40, 0x00, 0x00, 0x00 ],
      [ 0x80, 0x00, 0x00, 0x00 ],
      [ 0x1b, 0x00, 0x00, 0x00 ],
      [ 0x36, 0x00, 0x00, 0x00 ],
    ];
    
  3. addRoundKey();

    state , . addRoundKey XOR’ state, . ’XOR’ state , :




  4. 10 , 10 . 9 4 :

    • subBytes();
    • shiftRows();
    • mixColumns();
    • addRoundKey();

    10- :

    • subBytes();
    • shiftRows();
    • addRoundKey();

  5. subBytes();

    state S-box:



    State hex , : 01010011 -> 0101 | 0011 -> 53h



    53h edh

    S-box
    const sBox = [
      0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
      0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
      0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
      0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
      0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
      0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
      0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
      0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
      0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
      0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
      0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
      0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
      0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
      0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
      0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
      0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16,
    ];
    


  6. shiftRows();

    3- :


  7. mixColumns();

    . a(x) = {03}x³ + {01}x² + {01}x + {02}. state a(x). :







AES :


  1. keyExpansion();


  2. 10 , .

    9 4 , , :

    • addRoundKey();
    • invMixColumns();
    • invShiftRows();
    • invSubBytes();

    10-:

    • addRoundKey();
    • invShiftRows();
    • invSubBytes();

  3. addRoundKey();

    , Rcon
  4. invMixColumns () ؛

    تقوم دالة invMixColumns بإجراء عملية الضرب العكسي المضاعف وفقًا لقواعد ضرب الخوارزمية بالدالة الثابتة a (x) لعمود حالة معينة:




  5. invShiftRows () ؛

    صفوف التحول العكسي () - التحول الدوري إلى اليمين:


  6. invSubBytes () ؛

    وحدات بايت فرعية للانعكاس () - الاستبدال العكسي لبايتات الحالة ، والتي يتم تمثيلها بوضوح بالست عشري وفقًا لجدول S العكسي الثابت:



قائمة المراجع:

  1. مواصفات AES
  2. معيار التشفير المتقدم (AES)
  3. القطب جالوا
  4. الرموز الدورية
  5. كتاب المدارس الثانوية A.N. ستيبانوف - دورة علوم الكمبيوتر - أمن بيانات المعلومات
  6. القصاصات

All Articles