برنامه نویسی

ایجاد AE در C/Java || Subbytes / Shiftrows / آسیب پذیری (قسمت دوم)

1 قسمت-https://dev.to/dima853/create-aes-on-cjava-forward-s-box-first-part-4lef

1. Subbytes: تعویض بایت غیر خطی

مبنای ریاضی:

  • هر بایت از حالت مطابق جدول S-Box جایگزین می شود.
  • جعبه S در 2 مرحله ساخته می شود:
    1. یافتن عنصر معکوس در قسمت Galois GF(28).
  • تحول Affine (ضرب ماتریس + XOR با ثابت).

فرمول S-Box:

S (x) = m ⋅ x-1 + c

کجا:

  • x بایت ورودی (8 بیت) است
  • X⁻1 عنصر معکوس در Galois Field GF (2⁸) است
  • M یک ماتریس تحول Affine (8 8 8 بیت) است
  • C ثابت 0x63 (01100011 به صورت باینری) است
  • + عمل XOR است (علاوه بر این در GF (2))
  • · – ضرب ماتریس (ضرب رشته های بیت)
  • در چند برابر عنصر معکوس بایت X در قسمت محدود Galois Field GF (28) ، که در آن ضرب و علاوه بر این انجام می شود یک چند جمله ای غیرقابل برگشت. “

2. Shiftrows: تغییر ردیف چرخه ای

ردیف های ماتریس حالت به ترتیب با 0 ، 1 ، 2 ، 3 بایت به سمت چپ منتقل می شوند.

هدف این است که بایت بین ستون ها برای تقویت انتشار تغییر دهید.

تجسم:

قبل از shiftrows:
| A00 A01 A02 A03 |
| A10 A11 A12 A13 |
| A20 A21 A22 A23 |
| A30 A31 A32 A33 |

بعد از shiftrows:
| A00 A01 A02 A03 | // خط 0: بدون تغییر
| A11 A12 A13 A10 | // خط 1: تغییر توسط 1
| A22 A23 A20 A21 | // خط 2: تغییر توسط 2
| A33 A30 A31 A32 | // خط 3: تغییر توسط 3

#include  // Include the header file for uint8_t (unsigned 8-bit integer type)

// Function: sub_bytes
// Performs the SubBytes transformation in AES by substituting each byte in the state matrix
// with the corresponding byte from the S-box.
void sub_bytes(uint8_t state[4][4]) // The state is a 4x4 matrix of bytes (uint8_t)
{
    for (int i = 0; i < 4; i++) // Iterate through the rows of the state matrix
    {
        for (int j = 0; j < 4; j++) // Iterate through the columns of the state matrix
        {
            state[i][j] = sbox[state[i][j] >> 4][state[i][j] & 0x0F]; // Substitute the byte at state[i][j] with the value from the sbox
            // Explanation of sbox indexing:
            // state[i][j] >> 4:  Gets the upper nibble (4 bits) of the byte at state[i][j].  This is used as the row index for sbox.
            // state[i][j] & 0x0F: Gets the lower nibble (4 bits) of the byte at state[i][j]. This is used as the column index for sbox.
            // The value in the sbox at the row and column determined by these nibbles is then used to replace the original value in state.
        }
    }
}

// Function: swap
// Swaps the values of two uint8_t variables using pointers.
void swap(uint8_t *a, uint8_t *b) // Takes two pointers to uint8_t as input
{
    uint8_t temp = *a; // Store the value pointed to by 'a' in a temporary variable 'temp'
    *a = *b;           // Assign the value pointed to by 'b' to the memory location pointed to by 'a'
    *b = temp;          // Assign the value in 'temp' (the original value of 'a') to the memory location pointed to by 'b'
}

// Function: shift_rows
// Performs the ShiftRows transformation in AES by cyclically shifting the rows of the state matrix.
void shift_rows(uint8_t state[4][4]) // The state is a 4x4 matrix of bytes (uint8_t)
{
    // Row 1: cyclic shift by 1 byte to the left
    uint8_t tmp = state[1][0]; // Store the first element of the second row in a temporary variable
    state[1][0] = state[1][1]; // Shift the second element to the first position
    state[1][1] = state[1][2]; // Shift the third element to the second position
    state[1][2] = state[1][3]; // Shift the fourth element to the third position
    state[1][3] = tmp;         // Assign the temporary variable (original first element) to the fourth position

    // Row 2: cyclic shift by 2 bytes to the left (implemented with swap)
    swap(&state[2][0], &state[2][2]); // Swap the first and third elements of the third row
    swap(&state[2][1], &state[2][3]); // Swap the second and fourth elements of the third row

    // Row 3: cyclic shift by 3 bytes to the left (equivalent to shifting 1 byte to the right)
    tmp = state[3][3];         // Store the last element of the fourth row in a temporary variable
    state[3][3] = state[3][2]; // Shift the third element to the fourth position
    state[3][2] = state[3][1]; // Shift the second element to the third position
    state[3][1] = state[3][0]; // Shift the first element to the second position
    state[3][0] = tmp;         // Assign the temporary variable (original last element) to the first position
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

3. آسیب پذیری های AES

اگرچه AES (استاندارد رمزگذاری پیشرفته) یکی از قابل اطمینان ترین و به طور گسترده ترین الگوریتم های رمزگذاری است ، اما کاملاً غیرقابل نفوذ نیست. انواع مختلفی از حملات وجود دارد که می تواند برای AE اعمال شود ، اگرچه بسیاری از آنها پیچیده هستند و به منابع قابل توجهی یا شرایط خاص نیاز دارند. درک این نکته حائز اهمیت است که بیشتر حملات موفق به AES از نقص های الگوریتم بلکه نقاط ضعف در اجرای آن یا پروتکل ها با استفاده از AES استفاده می کنند.

در اینجا مروری بر انواع اصلی آسیب پذیری ها و حملات به AES آورده شده است:

1. حملات کانال جانبی:

  • حملات زمان بندی: این حملات از اطلاعات مربوط به زمان عملیات رمزگذاری برای آشکار کردن کلید مخفی استفاده می کنند. عملیات مختلف در AE بسته به کلید می تواند زمان متفاوتی را به خود اختصاص دهد و این تفاوت ها را می توان اندازه گیری کرد.
  • حملات مصرف انرژی (حملات تجزیه و تحلیل قدرت): این حملات ، مصرف برق دستگاه را در هنگام رمزگذاری تجزیه و تحلیل می کند. تفاوت در مصرف برق ممکن است مربوط به کلید مخفی باشد. حملات مصرف انرژی ساده (SPA) و حملات مصرف انرژی دیفرانسیل (DPA) وجود دارد که پیچیده تر و مؤثرتر هستند.
  • حملات تابش الکترومغناطیسی (تجزیه و تحلیل الکترومغناطیسی – EMA): مشابه حملات به مصرف انرژی ، اما آنها تابش الکترومغناطیسی دستگاه را تجزیه و تحلیل می کنند.
  • حملات تزریق خطا: این حملات عمداً خطاها را در فرآیند رمزگذاری (به عنوان مثال ، با تغییر ولتاژ تأمین یا استفاده از لیزر) وارد می کنند و داده های خروجی را با خطاها تجزیه و تحلیل می کنند تا اطلاعات مربوط به کلید را بدست آورند.
  • حملات صوتی: در موارد نادر ، می توانید اطلاعات مربوط به کلید را از صداهای ساخته شده توسط دستگاه هنگام رمزگذاری دریافت کنید.

اقدامات متقابل در برابر حملات از طریق کانال های شخص ثالث:

  • نقاب زدن: تقسیم داده های مخفی به قسمت های تصادفی برای پنهان کردن رابطه بین داده ها و مصرف برق یا زمان اجرای.
  • مخفی کردن: تساوی مصرف برق یا زمان اجرای کلیه عملیات برای دشوارتر شدن تجزیه و تحلیل.
  • با استفاده از اقدامات متقابل خاص الگوریتم: به عنوان مثال ، استفاده از جداول جستجوی مقاوم در برابر زمان.

2. حملات بازیابی کلیدی:

  • حمله بی رحمانه: از طریق تمام کلیدهای ممکن تا زمانی که صحیح پیدا شود ، تکرار کنید. اثربخشی حمله بی رحمانه به طول کلیدی بستگی دارد. AES با کلیدهای 128 ، 192 و 256 بیتی در برابر حملات بی رحمانه با استفاده از قدرت محاسباتی مدرن مقاوم است.
  • حمله در میانه: این حمله برای طرح های رمزگذاری که از چندین مرحله رمزگذاری استفاده می کنند ، اعمال می شود. او در تلاش است تا یک کلید را پیدا کند که هم با رمزگذاری و هم رمزگشایی مطابقت داشته باشد ، “جلسه در وسط”.
  • حملات مرتبط با کلید: این حملات از آسیب پذیری ها در طرح های مدیریت کلیدی بهره برداری می کنند. اگر یک مهاجم بتواند به چندین کلید که به هم وصل شده اند دسترسی پیدا کند (به عنوان مثال ، کلیدهای حاصل از یک کلید اصلی) ، می توانند از این اطلاعات برای بازیابی کلید مخفی استفاده کنند.

3. حملات ریاضی (حملات رمزنگاری):

  • رمزنگاری خطی: تلاش برای ساخت تقریبی خطی (تقریبی) برای عملیات رمزگذاری و استفاده از آنها برای بازیابی کلید.
  • رمزنگاری دیفرانسیل: تجزیه و تحلیل چگونگی تفاوت در داده های ورودی بر تفاوت در داده های خروجی تأثیر می گذارد. تلاشی برای یافتن الگوهایی که می تواند برای بازیابی کلید استفاده شود.
  • حملات جبری: بازنمایی الگوریتم رمزگذاری به شکل سیستم معادلات جبری و تلاش برای حل این سیستم برای بازیابی کلید.

توجه به این نکته مهم است:

  • AES در برابر حملات ریاضی مقاوم است: تا به امروز ، هیچ حملات ریاضی عملی شناخته شده ای به AE ها وجود ندارد که مؤثرتر از نیروی بی رحمانه باشد. با این حال ، تحقیقات در این زمینه ادامه دارد.
  • پیچیدگی اجرای: اجرای AE در عمل می تواند چالش برانگیز باشد و خطاهای اجرای آن می تواند منجر به آسیب پذیری شود. به عنوان مثال ، استفاده نادرست از حالت رمزگذاری ، تولید تعداد تصادفی ضعیف برای IV (بردار اولیه سازی) یا ذخیره سازی کلید ناامن می تواند مشکلات جدی ایجاد کند.
  • حمله به پروتکل ها با استفاده از AES: آسیب پذیری ها اغلب در خود AES ، بلکه در پروتکل هایی که از آن استفاده می کنند یافت می شود. به عنوان مثال ، آسیب پذیری در پروتکل TLS (امنیت لایه حمل و نقل) می تواند به یک مهاجم اجازه دهد تا رمزگذاری AES را دور بزند.

سناریوهای عملیاتی:

بیشترین حملات موفق به AE در سناریوهای زیر رخ می دهد:

  • سیستم ها و دستگاه های تعبیه شده با منابع محدود: این دستگاه ها به دلیل قابلیت های حفاظت محدود ، اغلب در برابر حملات شخص ثالث آسیب پذیر هستند.
  • پیاده سازی های نادرست: خطاهای موجود در نرم افزار یا اجرای سخت افزار AE می تواند در را برای حملات مختلف باز کند.
  • کلیدهای ذخیره شده در یک مکان ناامن: اگر یک مهاجم بتواند به کلید دسترسی پیدا کند (به عنوان مثال ، اگر در حافظه یا دیسک به صورت بدون رمزگذاری ذخیره شود) ، پس AES بی فایده می شود.

خروجی:

AES یک الگوریتم رمزگذاری قوی است ، اما امنیت آن به پروتکل های موجود بستگی دارد.

(ما به طور مفصل برخی از روش ها را با نمونه ای از حملات تجزیه و تحلیل خواهیم کرد)

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا