Member 12931994 Ответов: 1

Как я пишу код для расшифровки кода после его шифрования с помощью 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

Мы здесь не для того, чтобы делать за тебя уроки.

1 Ответов

Рейтинг:
0

Ayodeji Oluwatomiwo

проверьте эту статью

Шифрование и дешифрование данных с помощью C#

https://www.codeproject.com/articles/14150/encrypt-and-decrypt-data-with-c


Richard MacCutchan

Пожалуйста, используйте обычный текст для текста и кликабельные ссылки для URI.

Ayodeji Oluwatomiwo

исправленный