Как я пишу код для расшифровки кода после его шифрования с помощью 16 раундов DES с использованием C#
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace ISE_CR_S16 { public partial class DES : Form { int[] left = new int[32]; int[] right = new int[32]; int[] initial = new int[64]; int[] expRight = new int[48]; int[] key = new int[48]; int[] xor = new int[48]; int[] s = new int[32]; int[][,] s1 = new int[8][,]; int[] straightPer = new int[32]; bool final = true; int[] outleft = new int[32]; int[] outright = new int[32]; int[] code = new int[64]; public DES() { InitializeComponent(); s1[0] = new int[,] { { 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7 }, { 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8 }, { 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0 }, { 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13 } }; s1[1] = new int[,] { { 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10 }, { 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5 }, { 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15 }, { 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9 } }; s1[2] = new int[,] { { 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8 }, { 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1 }, { 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7 }, { 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12 } }; s1[3] = new int[,] { { 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15 }, { 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9 }, { 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4 }, { 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14 } }; s1[4] = new int[,] { { 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9 }, { 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6 }, { 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14 }, { 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3 } }; s1[5] = new int[,] { { 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11 }, { 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8 }, { 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6 }, { 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13 } }; s1[6] = new int[,] { { 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1 }, { 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6 }, { 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2 }, { 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12 } }; s1[7] = new int[,] { { 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7 }, { 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2 }, { 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8 }, { 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11 } }; key=new int[]{1,1,1,0,1,0,0,1,0,0,0,0,1,1,1,0,1,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,1,1,1,1,1}; } private int[] ConvertToBits(byte[] bytes) { int[] bits = new int[bytes.Length * 8]; for (int i = 0; i < bytes.Length; i++) { int temp = bytes[i]; for (int j = 0; j <= 7; j++) { bits[(7 - j) + (i * 8)] = temp % 2; temp = temp / 2; } } return bits; } private byte[] ConvertFromBits(int[] bits) { byte[] bytes = new byte[bits.Length / 8]; for (int i = 0; i < bytes.Length; i++) { byte value = 0; for (int j = 0; j < 8; j++) { value += Convert.ToByte(bits[j + (i * 8)] * (Math.Pow(2, (7 - j)))); } bytes[i] = value; } return bytes; } private byte GetValue(int[] bits) { byte value = 0; for (int i = 0; i < bits.Length; i++) { value += Convert.ToByte(bits[i] * (Math.Pow(2, (bits.Length - 1 - i)))); } return value; } private int[] GetBits(int value) { int[] bits = new int[4]; int temp = value; for (int j = 0; j <= 3; j++) { bits[(3 - j)] = temp % 2; temp = temp / 2; } return bits; } private void fu(ref int[] left, ref int[] right) { for (int j = 0; j < 32; j++) { expRight[(j + 1) + ((j / 4) * 2)] = right[j]; if (((j + 1) % 4 == 0) && j != 31) { expRight[(j + 3) + ((j / 4) * 2)] = right[j]; expRight[(j + 2) + ((j / 4) * 2)] = right[j + 1]; } else { if (j == 31) { expRight[47] = right[0]; expRight[0] = right[31]; } } } //second for (int i = 0; i < 48; i++) { if (expRight[i] == key[i]) xor[i] = 1; else xor[i] = 0; } //third for (int i = 0; i <= 42; i += 6) { int[] x = { xor[i], xor[i + 5] }; int[] y = { xor[i + 1], xor[i + 2], xor[i + 3], xor[i + 4] }; byte row = GetValue(x); byte column = GetValue(y); int[] newValue = GetBits(s1[i / 6][row, column]); for (int u = 0; u < 4; u++) { s[u + ((i / 6) * 4)] = newValue[u]; } } //forth straightPer[0] = s[15]; straightPer[1] = s[6]; straightPer[2] = s[19]; straightPer[3] = s[20]; straightPer[4] = s[28]; straightPer[5] = s[11]; straightPer[6] = s[27]; straightPer[7] = s[16]; straightPer[8] = s[0]; straightPer[9] = s[14]; straightPer[10] = s[22]; straightPer[11] = s[25]; straightPer[12] = s[4]; straightPer[13] = s[17]; straightPer[14] = s[30]; straightPer[15] = s[9]; straightPer[16] = s[1]; straightPer[17] = s[7]; straightPer[18] = s[23]; straightPer[19] = s[13]; straightPer[20] = s[31]; straightPer[21] = s[26]; straightPer[22] = s[2]; straightPer[23] = s[8]; straightPer[24] = s[18]; straightPer[25] = s[12]; straightPer[26] = s[29]; straightPer[27] = s[5]; straightPer[28] = s[21]; straightPer[29] = s[10]; straightPer[30] = s[3]; straightPer[31] = s[24]; //fifth int[] temp = new int[32]; if (!finalCheck.Checked) { for (int i = 0; i < 32; i++) { temp[i] = right[i]; } for (int i = 0; i < 32; i++) { if (straightPer[i] == left[i]) right[i] = 1; else right[i] = 0; } for (int i = 0; i < 32; i++) { left[i] = temp[i]; } } else { for (int i = 0; i < 32; i++) { if (straightPer[i] == left[i]) left[i] = 1; else left[i] = 0; } } } private void roundBtn_Click(object sender, EventArgs e) { string text = sourceTxt.Text; while (text.Length % 8 > 0) { text += " "; } byte[] chars = System.Text.Encoding.ASCII.GetBytes(text.ToCharArray()); initial = ConvertToBits(chars); for (int i = 0; i < 32; i++) { left[i] = initial[i]; right[i] = initial[i + 32]; } fu(ref left, ref right); for (int i = 0; i < 32; i++) { code[i] = left[i]; code[i + 32] = right[i]; } string d = ""; byte[] f = ConvertFromBits(code); d += System.Convert.ToBase64String(f); codingTxt.Text = d; } } }
Что я уже пробовал:
Я хочу сделать еще одну кнопку для расшифровки зашифрованного шифра с помощью 16 раунда DES
NotPolitcallyCorrect
Мы здесь не для того, чтобы делать за тебя уроки.