Axborotni himoyalashning kriptografik usullari fanidan 1 amaliy mashg‘uloti Affin Sezar shifrlash algoritmi va uning dasturi Affin kriptotizimlari
Download 274.84 Kb.
|
Narimonoov 1 amaliy topshiriq
- Bu sahifa navigatsiya:
- Shifrlash usullari
- 2-Metod. Koordinatali transformatsiya
- Polybius shifrini amalga oshirish
Kalitdan foydalanish
Kvadrat alfavit tartibida emas, balki tasodifiy belgilar bilan to'ldirilishi mumkin. Biroq, bunday to'ldirishni eslab qolish qiyin, shuning uchun takrorlanadigan belgilar bo'lmagan tugmachani ishlatish yaxshiroq (takrorlashni ham e'tiborsiz qoldirish mumkin), qolganlarning hammasi jadvalga ortish tartibida kiritilishi kerak. Masalan, biz PASSWORD parol so'zidan foydalanamiz, undan takroriylarni olib tashlaymiz va jadvalga yozamiz, so'ngra qolgan qiymatlarni yozamiz va quyidagilarni olamiz:
Shifrlash usullari Polybius kvadrati yordamida ma'lumotlarni shifrlashning bir nechta variantlari mavjud. Lotin matnini kvadrat yordamida kalit yordamida ishlatmasdan shifrlash misolida ulardan eng mashhurlarini ko'rib chiqamiz. 1-Metod. Pastki yonidagi belgidan foydalanish Ushbu usulda kvadrat ichida shifrlash uchun ular asl harfni qidiradilar va undan pastki qismini kod bilan bir xil ustunda joylashgan, yoki kerakli belgi oxirgi satrda joylashgan bo'lsa, eng yuqori qismini oladi.
2-Metod. Koordinatali transformatsiya Birinchidan, manba matni belgilar koordinatalarini yozishingiz kerak:
Shundan so'ng, koordinatalar ketma-ket o'qiladi va matnga aylantiriladi: 54 ⇨ U, 14 ⇨ Q, 24 ⇨ R, 53 ⇨ P, 33 ⇨ N, 35 ⇨ X, 12 ⇨ F, 44 ⇨ T UQRPNXFT Polybius shifrini amalga oshirish using System; // yuqorida muhokama qilingan shifrlash usuli public enum Method { Method1, Method2 } class PolybiusSquare { char[,] square; string alphabet; Method encryptMethod; public PolybiusSquare(string alphabet = null, Method cipherMethod = Method.Method1) { this.alphabet = alphabet ?? "ABCDEFGHIJKLMNOPQRSTUVWXYZ "; encryptMethod = cipherMethod; } // Polybius kvadratini qaytaradi char[,] GetSquare(string key) { var newAlphabet = alphabet; // kalit tarkibidagi barcha belgilarni alifbodan olib tashlang for (int i = 0; i < key.Length; i++) { newAlphabet = newAlphabet.Replace(key[i].ToString(), ""); } // parolni alfavitning boshiga va oxiriga qo'shimcha belgilarni qo'shing // bo'sh hujayralardan qochish uchun newAlphabet = key + newAlphabet + "0123456789!@#$%^&*)_+-=<>?,."; // biz kvadrat tomonining o'lchamini olamiz // kvadrat ildizni kattaroq butun songa qarab yaxlitlash orqali var n = (int)Math.Ceiling(Math.Sqrt(alphabet.Length)); // massiv yaratish va to'ldirish square = new char[n, n]; var index = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (index < newAlphabet.Length) { square[i, j] = newAlphabet[index]; index++; } } } return square; } // ikki o'lchovli massivda belgini qidirish bool FindSymbol(char[,] symbolsTable, char symbol, out int column, out int row) { var l = symbolsTable.GetUpperBound(0) + 1; for (int i = 0; i < l; i++) { for (int j = 0; j < l; j++) { if (symbolsTable[i, j] == symbol) { // topilgan qiymat row = i; column = j; return true; } } } // agar siz hech narsa topmagan bo'lsangiz row = -1; column = -1; return false; } public string PolibiusEncrypt(string text, string password) { var outputText = ""; var square = GetSquare(password); switch (encryptMethod) { case Method.Method1: for (int i = 0; i < text.Length; i++) { if (FindSymbol(square, text[i], out int columnIndex, out int rowIndex)) { var newRowIndex = rowIndex == square.GetUpperBound(1) ? 0 : rowIndex + 1; outputText += square[newRowIndex, columnIndex].ToString(); } } break; case Method.Method2: var m = text.Length; var coordinates = new int[m * 2]; for (int i = 0; i < m; i++) { if (FindSymbol(square, text[i], out int columnIndex, out int rowIndex)) { coordinates[i] = columnIndex; coordinates[i + m] = rowIndex; } } for (int i = 0; i < m * 2; i += 2) { outputText += square[coordinates[i + 1], coordinates[i]]; } break; } return outputText; } public string PolybiusDecrypt(string text, string password) { var outputText = ""; var square = GetSquare(password); var m = text.Length; switch (encryptMethod) { case Method.Method1: for (int i = 0; i < m; i++) { if (FindSymbol(square, text[i], out int columnIndex, out int rowIndex)) { var newRowIndex = rowIndex == 0 ? square.GetUpperBound(1) : rowIndex - 1; outputText += square[newRowIndex, columnIndex].ToString(); } } break; case Method.Method2: var coordinates = new int[m * 2]; var j = 0; for (int i = 0; i < m; i++) { if (FindSymbol(square, text[i], out int columnIndex, out int rowIndex)) { coordinates[j] = columnIndex; coordinates[j + 1] = rowIndex; j += 2; } } for (int i = 0; i < m; i++) { outputText += square[coordinates[i + m], coordinates[i]]; } break; } return outputText; } } Download 274.84 Kb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling