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];
}
}
}
for (int i = 0; i < 48; i++)
{
if (expRight[i] == key[i])
xor[i] = 1;
else
xor[i] = 0;
}
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];
}
}
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];
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;
}
}
}
What I have tried:
I want to make another button to decrypt it the encrypted cipher using the 16 round of DES