LISTING PROGRAM
1. Form Menu Utama
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; using System.IO; using hybrid.Controller; namespace KriptografiHybrid.Controller {
public partial class mainForm : Form {
#region VAR ############
private Boolean bIsExit = false;
#endregion #region KONSTRUKTOR ################### public mainForm() { InitializeComponent(); } #endregion #region PROPERTIES public Boolean isExit {
get { return bIsExit; } }
#endregion
private void enkripsiToolStripMenuItem_Click(object sender, EventArgs e)
{
encryptForm oForm2 = new encryptForm(); oForm2.ShowDialog(); if (oForm2.IsAccessible) { this.Close(); } }
private void dekripsiToolStripMenuItem_Click(object sender, EventArgs e)
{
decryptForm oForm3 = new decryptForm(); oForm3.ShowDialog(); if (oForm3.IsAccessible) { this.Close(); } }
private void exitToolStripMenuItem_Click(object sender, EventArgs e) { bIsExit = true; this.Close(); }
private void bantuanToolStripMenuItem_Click(object sender, EventArgs e)
{ }
private void tentangProgrammerToolStripMenuItem_Click(object
sender, EventArgs e) {
programmerForm oForm4 = new programmerForm(); oForm4.ShowDialog();
}
private void menggunakanAplikasiToolStripMenuItem_Click(object
sender, EventArgs e) {
HelpForm oForm5 = new HelpForm(); oForm5.ShowDialog(); } } }
2. Form Enkripsi
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; using System.IO; using hybrid.Lib; using System.Diagnostics; namespace KriptografiHybrid.Controller {public partial class encryptForm : Form {
long jum; int nckey; int n = 0;
long[] nil_w = new long[1000]; int[,] tempval = new int[4, 4]; int a;
int[,] kunci = new int[4, 4]; private String fileExt; DoubleMatrix k = null;
#region VAR ############
// private Boolean bIsExit = false;
// private Boolean pembangkitKunciValid = false;
#endregion #region KONSTRUKTOR ################### public encryptForm() { InitializeComponent(); } #endregion
#region SUDAH DIRAPIKAN /// <summary>
/// Set default /// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void encryptForm_Load(object sender, EventArgs e) {
cbMatrixKunci.SelectedIndex = 0; }
/// <summary>
/// Cari file yang akan di enkripsi /// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnPilihSumberFile_Click(object sender, EventArgs e) {
OpenFileDialog FileDialog = new OpenFileDialog(); if (FileDialog.ShowDialog() == DialogResult.OK) { txtSumberFile.Text = FileDialog.FileName.ToString(); fileExt = Path.GetExtension(FileDialog.FileName).Substring(1); txtExtensiSumberFile.Text = fileExt; } } /// <summary>
/// Generate matrix kunci /// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnGenerateKunci_Click(object sender, EventArgs e) {
cbJumlahW.Items.Clear();
if (cbMatrixKunci.Text == "2x2") {
a = 2;
for (int i = 2; i < ((32 / 2) + 1); i++) { if (32 % i == 0) { cbJumlahW.Items.Add(i.ToString()); } } } else if (cbMatrixKunci.Text == "3x3")
{
a = 3;
for (int i = 2; i < ((72 / 2) + 1); i++) { if (72 % i == 0) { cbJumlahW.Items.Add(i.ToString()); } } } else if (cbMatrixKunci.Text == "4x4") { a = 4;
for (int i = 2; i < ((128 / 2) + 1); i++) { if (128 % i == 0) { cbJumlahW.Items.Add(i.ToString()); } } } else {
MessageBox.Show("Secara Otomatis 2x2"); a = 2;
for (int i = 2; i < 17; i++) {
if (32 % i == 0)
cbJumlahW.Items.Add(i.ToString()); }
}
Random rand = new Random(); int b = rand.Next(1, 256); richTextBox1.Text = ""; bool kondisi = false; while (!kondisi) {
for (int i = 0; i < a; i++) { for (int j = 0; j < a; j++) { kunci[i, j] = rand.Next(0, 255); //richTextBox1.Text += kunci[i,j].ToString() + " "; } richTextBox1.Text += "\n"; } int det = 0; if (a == 2) {
det = (kunci[0, 0] * kunci[1, 1]) - (kunci[1, 0] * kunci[0, 1]);
// MessageBox.Show("hasi determinanan" + det); }
else if (a == 3) {
det = ((kunci[0, 0] * kunci[1, 1] * kunci[2, 2]) + (kunci[0, 1] * kunci[1, 2] * kunci[2, 0]) + (kunci[0, 2] * kunci[1, 0] * kunci[2, 1])) - ((kunci[2, 0] * kunci[1, 1] * kunci[0, 2]) + (kunci[2, 1] * kunci[1, 2] * kunci[0, 0]) + (kunci[2, 2] * kunci[1, 0] * kunci[0, 1])); }
else if (a == 4) {
det = (
((kunci[0, 0] * kunci[1, 1]) - (kunci[0, 1] * kunci[1, 0])) *
((kunci[2, 2] * kunci[3, 3]) - (kunci[3, 2] * kunci[2, 3])) -
((kunci[2, 0] * kunci[3, 1]) - (kunci[3, 0] * kunci[2, 1])) *
((kunci[0, 2] * kunci[1, 3]) - (kunci[1, 2] * kunci[0, 3])) ); } while (det < 0) { det += 256; } if (det % 2 != 0) { while (((256 * b) + 1) % det == 0) { b = rand.Next(1, 256); } richTextBox1.Text = ""; for (int i = 0; i < a; i++) {
for (int j = 0; j < a; j++) {
richTextBox1.Text += kunci[i, j].ToString() + " "; } richTextBox1.Text += "\n"; } detInv.Text = b.ToString(); kondisi = true; } }
// Knoversi dari array kunci ke class DoubleMatrix // (nilai byte = 1 {2x2},2{3x3},3{4x4})
int selectedIndexKeyMatrix = cbMatrixKunci.SelectedIndex + 1; if (selectedIndexKeyMatrix == 1) // 2x2
{
k = new DoubleMatrix(2, 2);
// baris dan kolom pada DoubleMatrix terbalik // baris 0 k[0, 0] = kunci[0, 0]; k[1, 0] = kunci[0, 1]; // baris 1 k[0, 1] = kunci[1, 0]; k[1, 1] = kunci[1, 1];
} else if (selectedIndexKeyMatrix == 2) // 3x3 { k = new DoubleMatrix(3, 3); // baris 0 k[0, 0] = kunci[0, 0]; k[1, 0] = kunci[0, 1]; k[2, 0] = kunci[0, 2]; // baris 1 k[0, 1] = kunci[1, 0]; k[1, 1] = kunci[1, 1]; k[2, 1] = kunci[1, 2]; // baris 2 k[0, 2] = kunci[2, 0]; k[1, 2] = kunci[2, 1]; k[2, 2] = kunci[2, 2]; } else if (selectedIndexKeyMatrix == 3) // 4x4 { k = new DoubleMatrix(4, 4); // baris 0 k[0, 0] = kunci[0, 0]; k[1, 0] = kunci[0, 1]; k[2, 0] = kunci[0, 2]; k[3, 0] = kunci[0, 3]; // baris 1 k[0, 1] = kunci[1, 0]; k[1, 1] = kunci[1, 1]; k[2, 1] = kunci[1, 2]; k[3, 1] = kunci[1, 3]; // baris 2 k[0, 2] = kunci[2, 0]; k[1, 2] = kunci[2, 1]; k[2, 2] = kunci[2, 2]; k[3, 2] = kunci[2, 3]; // baris 3 k[0, 3] = kunci[3, 0]; k[1, 3] = kunci[3, 1]; k[2, 3] = kunci[3, 2]; k[3, 3] = kunci[3, 3]; } Console.WriteLine(k); } /// <summary>
/// Ambil tujuan file enkripsi /// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnPilihTujuanFile_Click(object sender, EventArgs e) {
SaveFileDialog saveDialog = new SaveFileDialog(); saveDialog.DefaultExt = fileExt;
saveDialog.AddExtension = true;
saveDialog.Filter = fileExt + " (*." + fileExt + ")|" + fileExt;
if (saveDialog.ShowDialog() == DialogResult.OK) {
txtTujuanFile.Text = saveDialog.FileName.ToString(); }
}
/// <summary>
/// Lakukan enkripsi cipher hill /// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnEnkripsi_Click(object sender, EventArgs e) {
Stopwatch stopwatch = new Stopwatch(); stopwatch.Start();
//DateTime awal, akhir; //awal = DateTime.Now;
FileBitReader reader = new FileBitReader(txtSumberFile.Text); FileBitWriter writer = new FileBitWriter(txtTujuanFile.Text); // 1. Simpan pengenal personal
writer.writeByte("HANNA"); // 2. Simpan ukuran file
int fileSize = (int)reader.getFileSize(); int byteFileSize1 = fileSize >> 24;
int byteFileSize2 = (fileSize >> 16) % 256; int byteFileSize3 = (fileSize >> 8) % 256; int byteFileSize4 = fileSize % 256;
writer.writeByte(byteFileSize1); writer.writeByte(byteFileSize2); writer.writeByte(byteFileSize3); writer.writeByte(byteFileSize4);
// 3. Simpan ukuran key matrix cipher hill (nilai byte = 1 {2x2},2{3x3},3{4x4})
int selectedIndexKey = cbMatrixKunci.SelectedIndex + 1; writer.writeByte(selectedIndexKey); HillCipher.encrypt(reader, writer, k); this.timer1.Start(); reader.close(); writer.close(); stopwatch.Stop();
MessageBox.Show("Enkripsi File Berhasil! (" + txtTujuanFile.Text + ")"); //lama enkripsi textBox4.Text = stopwatch.ElapsedMilliseconds + " ms ".ToString(); //ukuran file
FileBitReader fileAsli = new FileBitReader(txtSumberFile.Text); textBox6.Text = fileAsli.getFileSize() + " byte ".ToString(); fileAsli.close();
//ukuran cipherfile
FileBitReader fileTerenkrip = new
FileBitReader(txtTujuanFile.Text);
textBox3.Text = fileTerenkrip.getFileSize() +" byte ".ToString();
fileTerenkrip.close(); //} } /// <summary> /// Pilih jumlah w /// </summary> /// <param name="sender"></param> /// <param name="e"></param>
private void cbJumlahW_SelectedIndexChanged(object sender, EventArgs e) { //int bitnil = 0; if (cbMatrixKunci.Text == "2x2") { // bitnil = 32; } else if (cbMatrixKunci.Text == "3x3") { // bitnil = 72; } else if (cbMatrixKunci.Text == "4x4") { // bitnil = 128; } //else } // bitnil = 32; // } /// <summary> /// Bangkitkan w,q,r /// </summary> /// <param name="sender"></param> /// <param name="e"></param>
private void btnGenerate_Click(object sender, EventArgs e) {
if (cbJumlahW.Text == "") {
MessageBox.Show("piih terlebih dahulu banyak item w"); }
else
{
Random rand = new Random(); long temp = 0;
n = Convert.ToInt32(cbJumlahW.Text); nil_w[0] = 1;
jum = nil_w[0];
txtW.Text = nil_w[0].ToString(); for (int i = 1; i < n; i++) { for (int j = 0; j < i; j++) { temp += nil_w[j]; } nil_w[i] = temp + 1; jum += nil_w[i]; txtW.Text += " " + nil_w[i].ToString(); temp = 0;
} {
Random bil = new Random(); int acak = bil.Next(1, 256);
txtQ.Text = (acak + jum).ToString(); }
{
Random bil = new Random(); int acak = bil.Next(1, 255);
long Q = Convert.ToInt64(txtQ.Text); while (GCD.GCD1(acak, Q) != 1) { acak = bil.Next(1, 255); } txtR.Text = acak.ToString(); } { long r = Convert.ToInt32(txtR.Text), q = Convert.ToInt64(txtQ.Text); n = Convert.ToInt32(cbJumlahW.Text); long[] nilpublic = new long[n]; txtKunciPublik.Text = ""; for (int i = 0; i < n; i++) { nilpublic[i] = ((nil_w[i] * r) % q); txtKunciPublik.Text += nilpublic[i].ToString() + " "; } } { txtKunciPrivate.Text = txtW.Text; } } // dr sini } /// <summary>
/// Pilih tujuan key disimpan /// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnPilihTujuanKey_Click(object sender, EventArgs e) {
SaveFileDialog saveDialog = new SaveFileDialog(); saveDialog.DefaultExt = "cipherkey";
saveDialog.AddExtension = true;
saveDialog.Filter = "cipherkey (*.cipherkey)|cipherkey"; if (saveDialog.ShowDialog() == DialogResult.OK) { txtTujuanKey.Text = saveDialog.FileName.ToString(); } } /// <summary>
/// Lakukan enkripsi pada key (Knapsack) /// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
{
Stopwatch stopwatch = new Stopwatch(); stopwatch.Start();
String cipher = Knapsack.encrypt(n, txtKunciPublik.Text, a, kunci, nckey, txtTujuanKey.Text, txtQ.Text, txtR.Text, cbJumlahW.Text, txtKunciPrivate.Text);
textBox1.Text = cipher; stopwatch.Stop();
MessageBox.Show("Enkripsi Key Berhasil! (" + txtTujuanKey + ") - ");
textBox5.Text = stopwatch.ElapsedMilliseconds + " ms ".ToString();
} /// <summary>
/// Keluar dari form enkripsi /// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnBatal_Click(object sender, EventArgs e) {
Close(); }
#region fungsi pembantu
public int bin2int(string bin) {
int num = 0, count = 0;
for (int i = (bin.Length - 1); i >= 0; i--) {
if (bin[i] == '1')
num += pangkat(2, count); count++;
}
return num; }
public int pangkat(int a, int b) {
int hasil = 1;
for (int i = 1; i <= b; i++) {
hasil *= a; }
return hasil; }
public Int64 bruteModulo(Int64 a, Int64 b, Int64 c) {
return (((a % c) * (b % c)) % c); }
#endregion
private void timer1_Tick(object sender, EventArgs e) {
this.progressBar1.Increment(1); }
#endregion } }
3. Form Dekripsi
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; using System.IO; using hybrid.Lib; using System.Diagnostics; namespace KriptografiHybrid.Controller {public partial class decryptForm : Form {
// long jum; //int n = 0;
long[] nil_w = new long[1000]; int[,] tempval = new int[4, 4]; //int a;
int[,] kunci = new int[4, 4]; private String fileExt;
// DoubleMatrix k = null;
#region VAR ############
// private Boolean bIsExit = false;
#endregion #region KONSTRUKTOR ################### public decryptForm() { InitializeComponent(); } #endregion
#region Sudah Dirapikan /// <summary>
/// Pilih file cipher key dan baca w,q,r,cipherkey ke textbox /// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnPilihFileCipherKey_Click(object sender, EventArgs e)
{
OpenFileDialog openKey = new OpenFileDialog();
openKey.Filter = "cipherkey(*.cipherkey)|*.cipherkey"; if (openKey.ShowDialog() == DialogResult.OK)
{
string read = "";
StreamReader objReader = new
StreamReader(openKey.FileName);
read = objReader.ReadLine(); int count = 0;
while (read != null) { if (count == 0) { txt_Q.Text = read; } else if (count == 1) { txt_R.Text = read; } else if (count == 3) { txt_KunciPrivat.Text = read; } else if (count == 4) { txtCipherKey.Text = read; } count++; read = objReader.ReadLine(); } objReader.Close(); } } /// <summary>
/// Lakukan dekripsi knapsack terhadap cipherkey, q, w, r /// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_DekripsiCipherkey_Click(object sender, EventArgs e)
{ try
{
Stopwatch stopwatch = new Stopwatch(); stopwatch.Start();
String result = Knapsack.decrypt(txt_KunciPrivat.Text, txtCipherKey.Text, txt_Q.Text, txt_R.Text);
txt_CipherMatrix.Text = result; stopwatch.Stop();
MessageBox.Show("Dekripsi Key Berhasil! ");
textBox2.Text = stopwatch.ElapsedMilliseconds + " ms ".ToString();
}
catch (Exception TerjadiKesalahan) {
MessageBox.Show("Error\n" + TerjadiKesalahan.ToString()); }
}
/// <summary>
/// Pilih sumber file yang sudah terenkripsi /// </summary>
/// <param name="sender"></param>
private void btnPilihSumberFile_Click(object sender, EventArgs e) {
OpenFileDialog FileDialog = new OpenFileDialog(); if (FileDialog.ShowDialog() == DialogResult.OK) { txtSumberFileDekripsi.Text = FileDialog.FileName.ToString(); fileExt = Path.GetExtension(FileDialog.FileName).Substring(1); } } /// <summary>
/// Pilih dimana file hasil dekripsi disimpan (Cipherhill) /// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnPilihTujuanFile_Click(object sender, EventArgs e) {
SaveFileDialog saveDialog = new SaveFileDialog(); saveDialog.DefaultExt = fileExt;
saveDialog.AddExtension = true;
saveDialog.Filter = fileExt + " (*." + fileExt + ")|"+fileExt; if (saveDialog.ShowDialog() == DialogResult.OK) { txtTujuanFileDekripsi.Text = saveDialog.FileName.ToString(); } } /// <summary>
/// Lakukan proses dekripsi dan simpan file hasil dekripsi /// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_Dekripsi_Click(object sender, EventArgs e) {
Stopwatch stopwatch = new Stopwatch(); stopwatch.Start();
String key = txt_CipherMatrix.Text; // 45 34 54 23 45 23 45 23 //buang spasi terakhir
key = key.Substring(0, key.Length - 1); // posisi terakhir adalah spasi
String[] keyArr = key.Split(' ');
if (keyArr.Length == 4 || keyArr.Length == 9 || keyArr.Length == 16)
{
int jenisMatrix = (int)Math.Sqrt(keyArr.Length); DoubleMatrix k = new DoubleMatrix(jenisMatrix, jenisMatrix);
int keyArrReaded = 0;
for (int baris = 0; baris < jenisMatrix; baris++) {
for (int kolom = 0; kolom < jenisMatrix; kolom++) {
k[kolom, baris] = Convert.ToDouble(keyArr[keyArrReaded]); keyArrReaded++; }
}
Console.WriteLine("k = " + k); FileBitReader reader = new
FileBitReader(txtSumberFileDekripsi.Text); FileBitWriter writer = new
FileBitWriter(txtTujuanFileDekripsi.Text);
String identifier = String.Empty; for (int i = 0; i < 5; i++) {
identifier += (char)reader.readByte(); }
if (identifier != "HANNA") {
MessageBox.Show("File yang anda pilih, tidak bisa di dekripsi!");
} else
{
//(nilai byte = 1 {2x2},2{3x3},3{4x4}) int byteFileSize1 = reader.readByte(); int byteFileSize2 = reader.readByte(); int byteFileSize3 = reader.readByte(); int byteFileSize4 = reader.readByte(); byteFileSize1 = byteFileSize1 << 24; byteFileSize2 = byteFileSize2 << 16; byteFileSize3 = byteFileSize3 << 8;
long ukuranFile = byteFileSize1 + byteFileSize2 + byteFileSize3 + byteFileSize4;
jenisMatrix = reader.readByte(); if (jenisMatrix + 1 != k.RowCount) {
throw new Exception("Jenis matrix tidak cocok!"); }
HillCipher.decrypt(reader, writer, k, ukuranFile); stopwatch.Stop();
MessageBox.Show("Dekripsi File Berhasil! " + txtTujuanFileDekripsi.Text + ")"); //lama dekripsi textBox1.Text = stopwatch.ElapsedMilliseconds + " ms ".ToString(); } //MessageBox.Show(identifier); writer.close(); reader.close(); } else {
MessageBox.Show("Key yang anda masukkan salah! Key harus berupa 2x2; 3x3; 4x4");
} }
#region Fungsi pembantu
public string int2bin(int num, int jum) {
string bin = "";
for (int i = 0; i < jum; i++) {
if (num % 2 == 1) { bin = "1" + bin; } else { bin = "0" + bin; } num = num / 2; } return bin; } #endregion
private void btnBatal_Click(object sender, EventArgs e) {
Close(); }
#endregion
private void groupBox1_Enter(object sender, EventArgs e) {
} } }
4. Form Menggunakan Aplikasi
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 hybrid.Controller {
public partial class HelpForm : Form { public HelpForm() { InitializeComponent(); } } }
5. Form Tentang
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 hybrid.Controller {
public partial class programmerForm : Form {
public programmerForm() {
InitializeComponent(); }
private void programmerForm_Load(object sender, EventArgs e) {
} } }
6. Class Hill Cipher
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; namespace hybrid.Lib { class HillCipher {
public static void encrypt(FileBitReader reader, FileBitWriter writer, DoubleMatrix k)
{
// ambil jenis matrix
int jenisMatrix; // total baris = total kolom jenisMatrix = k.RowCount;
// ambil ukuran file
long fileSize = reader.getFileSize();
// variabel count jumlah byte yang sudah dibaca long readedByte = 0;
// lakukan pembacaan sampai seluruh file terbaca while (readedByte < fileSize) {
// ambil sebanyak jumlah matrix dan ciptakan matrix DoubleMatrix matrixP = new DoubleMatrix(1, jenisMatrix); int readedP = 0;
while (readedP < jenisMatrix) {
if (readedByte < fileSize) {
matrixP[0, readedP] = reader.readByte(); readedByte++; } else { matrixP[0, readedP] = 0; } readedP++;
}
DoubleMatrix matrixC = new DoubleMatrix(1, jenisMatrix); matrixC = k * matrixP;
matrixC.mod(256);
//Console.WriteLine("matrixC setelah mod = " + matrixC); for (int baris = 0; baris < matrixC.RowCount; baris++ ) {
writer.writeByte((int) matrixC[0, baris]); }
} }
public static void decrypt(FileBitReader reader, FileBitWriter writer, DoubleMatrix k, long oriFileSize)
{
DoubleMatrix adjK = k.adjoint(); double detK = k.determinant(); double x = 0;
for (int i = 1; i < 10000; i++) {
double hasilModulo = (detK * i) % 256;
if (hasilModulo == 1 || (hasilModulo + 256) == 1) { x = i; break; } //if (((256 * i) + 1) % detK == 0 ) { // x = ((256 * i) + 1) / detK; //} } if (x == 0) {
throw new Exception("Tidak bisa menemukan nilai invers Det K");
}
DoubleMatrix invK = (x * adjK); invK.mod(256);
for (int baris = 0; baris < invK.RowCount; baris++ ) {
for (int kol = 0; kol < invK.ColumnCount; kol++) { if (invK[kol, baris] < 0) { invK[kol, baris] += 256; } } } // pembuktian
DoubleMatrix bukti = k * invK; bukti.mod(256);
for (int baris = 0; baris < invK.RowCount; baris++) {
for (int kol = 0; kol < invK.ColumnCount; kol++) {
if (baris == kol) {
throw new Exception("Inverse matrix benar!"); } } else { if (bukti[kol, baris] != 0) {
throw new Exception("Inverse matrix salah!"); } } } } long readedByte = 0; long writtenByte = 0;
int jenisMatrix = k.RowCount;
//Console.WriteLine("jenisMatrix = " + jenisMatrix); //Console.WriteLine("fileSize = " + fileSize); // lakukan pembacaan sampai seluruh file terbaca while (readedByte < oriFileSize)
{
// ambil sebanyak jumlah matrix dan ciptakan matrix DoubleMatrix matrixC = new DoubleMatrix(1, jenisMatrix); int readedP = 0;
while (readedP < jenisMatrix) {
matrixC[0, readedP] = reader.readByte(); readedByte++;
readedP++; }
//Debug.WriteLine("matrixC = " + matrixC); //Console.WriteLine("matrixP = " + matrixP);
DoubleMatrix matrixP = new DoubleMatrix(1, jenisMatrix); matrixP = invK * matrixC;
//Console.WriteLine("matrixC sebelum mod = " + matrixC); matrixP.mod(256);
//Debug.WriteLine("matrixP = " + matrixP);
//Console.WriteLine("matrixC setelah mod = " + matrixC); for (int baris = 0; baris < matrixP.RowCount; baris++) {
if (writtenByte < oriFileSize) {
writer.writeByte((int)matrixP[0, baris]); writtenByte++; } } } } } }
7. Class Knapsack
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO;namespace hybrid.Lib {
class Knapsack {
public static String encrypt(int jlhW, string KunciPub, int
jnsMatrix, int[,] kunci, int nckey, String txtTujuanKey
, String txtQ, String txtR, String cbJumlahW, String txtKunciPrivate)
{
String temp = String.Empty; string kTempPub = ""; int indeks = 0;
int[] kPublic = new int[jlhW];
for (int i = 0; i < KunciPub.Length; i++) {
if (KunciPub.ElementAt(i) >= '0' && KunciPub.ElementAt(i) <= '9') { kTempPub += KunciPub.ElementAt(i); } else { if (kTempPub != "") { kPublic[indeks] = Convert.ToInt32(kTempPub); indeks++; kTempPub = ""; } else { } } } //int to Biner temp = "";
for (int i = 0; i < jnsMatrix; i++) {
for (int j = 0; j < jnsMatrix; j++) {
temp += Knapsack.int2bin(kunci[i, j], 8); }
}
//MessageBox.Show(temp.Text); //Pisah Menjadi Blok Biner indeks = 0;
kTempPub = "";
nckey = (temp.Length / jlhW); int counter = 0;
string[] sesiKeyCipher = new string[nckey];
//MessageBox.Show(temp.Text+" "+temp.TextLength); for (int i = 0; i < temp.Length; i++)
{
counter++;
if (counter == jlhW) {
sesiKeyCipher[indeks] = kTempPub; kTempPub = ""; indeks++; counter = 0; } else { kTempPub += temp.ElementAt(i); } }
//Perkalian Blok Cipher
int[] KeyCipher = new int[nckey]; temp = "";
for (int i = 0; i < nckey; i++) { KeyCipher[i] = 0; for (int j = 0; j < jlhW; j++) { if (sesiKeyCipher[i].ElementAt(j) == '1') KeyCipher[i] += kPublic[j]; } temp += KeyCipher[i].ToString() + " "; } // Simpan // @TODO!!! try {
FileStream teks = new FileStream(txtTujuanKey, FileMode.CreateNew, FileAccess.Write);
StreamWriter tulis = new StreamWriter(teks); tulis.WriteLine(txtQ); tulis.WriteLine(txtR); tulis.WriteLine(cbJumlahW); tulis.WriteLine(txtKunciPrivate); tulis.WriteLine(temp); tulis.Write(nckey.ToString()); tulis.Close(); teks.Close(); } catch { } return temp; }
public static string int2bin(int num, int jum) {
string bin = "";
for (int i = 0; i < jum; i++) { if (num % 2 == 1) { bin = "1" + bin; } else { bin = "0" + bin; } num = num / 2; } return bin; }
public static int bin2int(string bin) {
int num = 0, count = 0;
for (int i = (bin.Length - 1); i >= 0; i--) {
if (bin[i] == '1')
num += Knapsack.pangkat(2, count); count++;
}
return num; }
public static int pangkat(int a, int b) {
int hasil = 1;
for (int i = 1; i <= b; i++) {
hasil *= a; }
return hasil; }
public static Int64 bruteModulo(Int64 a, Int64 b, Int64 c) {
return (((a % c) * (b % c)) % c); }
public static String decrypt(String KunciPri, String cipher, String txt_Q, String txt_R)
{
String txt_CipherMatrix; int nckey = 0;
String temp = String.Empty; int n = 0;
string kTempPub; //string KunciPub; int indeks = 0;
int[] kPublic = new int[n]; indeks = 0;
kTempPub = ""; int counter = 0;
string[] sesiKeyCipher = new string[100]; int[] KeyCipher = new int[100];
temp = "";
int[] kPrivate = new int[100]; counter = indeks = 0;
kTempPub = "";
for (int i = 0; i < KunciPri.Length; i++) {
if (KunciPri.ElementAt(i) >= '0' && KunciPri.ElementAt(i) <= '9') { kTempPub += KunciPri.ElementAt(i); } else {
if (kTempPub != "") { kPrivate[indeks] = Convert.ToInt32(kTempPub); indeks++; kTempPub = ""; n++; } else { } } if (i == KunciPri.Length - 1) { if (kTempPub != "") { kPrivate[indeks] = Convert.ToInt32(kTempPub); indeks++; n++; kTempPub = ""; } else { } } } indeks = 0; kTempPub = "";
for (int i = 0; i < cipher.Length; i++) {
if (cipher.ElementAt(i) >= '0' && cipher.ElementAt(i) <=
'9') { kTempPub += cipher.ElementAt(i); } else { if (kTempPub != "") { KeyCipher[indeks] = Convert.ToInt32(kTempPub); indeks++; kTempPub = ""; nckey++; } else { } } if (i == cipher.Length - 1) { if (kTempPub != "") { KeyCipher[indeks] = Convert.ToInt32(kTempPub); indeks++; // MessageBox.Show(KeyCipher[i].ToString()); kTempPub = ""; } else { } } }
kTempPub = "";
for (int i = 0; i < n; i++) {
kTempPub += "1"; }
int kombinasi = (Knapsack.bin2int(kTempPub) + 1); string[] binKombi = new string[kombinasi];
for (int i = 0; i < kombinasi; i++) {
binKombi[i] = int2bin(i, n); }
//Biner Total Hasil Dekripsi
Int64 q = Convert.ToInt32(txt_Q), r = Convert.ToInt32(txt_R), nInv, k = 0;
while ((1 + (q * k)) % r != 0) k++;
nInv = (1 + (q * k)) / r;
int[] hasildekrip = new int[nckey]; //int temp1 = 0;
String hasildekripBin; hasildekripBin = "";
int nkey_temp = Convert.ToInt32(Math.Pow(2, n)); string[] dataBit = new string[nkey_temp];
int[] dataDec = new int[nkey_temp]; int n_bit = Convert.ToInt32(n); for (int i = 0; i < nkey_temp; i++) {
dataBit[i] = int2bin(i, n_bit); dataDec[i] = 0;
for (int j = 0; j < n_bit; j++) { dataDec[i] += (Convert.ToInt32(dataBit[i][j].ToString()) * kPrivate[j]); } } string hasilbittotal = ""; for (int i = 0; i < nckey; i++) {
hasildekrip[i] = Convert.ToInt32(bruteModulo(KeyCipher[i], nInv, q));
for (int j = 0; j < nkey_temp; j++) { if (hasildekrip[i] == dataDec[j]) { hasilbittotal += dataBit[j]; break; } } }
//MessageBox.Show("Hasil\n" + hasilbittotal); int[] hasil = new int[hasilbittotal.Length / 8]; indeks = counter = 0;
txt_CipherMatrix = ""; kTempPub = "";
for (int i = 0; i < hasilbittotal.Length; i++) { counter++; if (counter == 8) { kTempPub += hasilbittotal.ElementAt(i); hasil[indeks] = Knapsack.bin2int(kTempPub); txt_CipherMatrix += hasil[indeks].ToString() + " "; kTempPub = ""; indeks++; counter = 0; } else { kTempPub += hasilbittotal.ElementAt(i); } } return txt_CipherMatrix; } } }
8. Class Baca File
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace hybrid.Lib { class FileBitReader {
private String fileName; private FileStream fileIn;
private BufferedStream buffFileIn; public FileBitReader(String fileName) {
this.fileName = fileName;
fileIn = new FileStream(this.fileName, FileMode.Open); buffFileIn = new BufferedStream(fileIn);
}
public int readByte() {
return buffFileIn.ReadByte(); }
public long getFileSize() {
return buffFileIn.Length; }
public void close() { buffFileIn.Close(); fileIn.Close(); } } }
9. Class Tulis File
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace hybrid.Lib { class FileBitWriter {
private String fileName; private FileStream fileOut;
private BufferedStream buffFileOut; public FileBitWriter(String fileName) {
this.fileName = fileName;
fileOut = new FileStream(this.fileName, FileMode.Create); buffFileOut = new BufferedStream(fileOut);
}
public void writeByte(String str) {
for (int i = 0; i < str.Length; i++) {
char karakter = str[i];
byte toWrite = (byte) karakter; buffFileOut.WriteByte(toWrite); }
}
public void writeByte(byte b) {
buffFileOut.WriteByte(b); }
public void writeByte(int i) {
buffFileOut.WriteByte((byte) i); }
public void close() {
buffFileOut.Close(); fileOut.Close(); }
} }
10. Class Double Matrix
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; namespace hybrid.Lib {
public class DoubleMatrix {
public double determinant() {
if (this.ColumnCount != this.RowCount) {
throw new Exception("Determinan berlaku pada matrix NxN"); } if (this.ColumnCount == 1) { return this[0, 0]; } if (this.ColumnCount != 2) {
throw new NotImplementedException("Fungsi hanya bisa melakukan determinant n=2");
}
int n = this.RowCount; if (n == 2) {
//(kunci[0, 0] * kunci[1, 1]) - (kunci[1, 0] * kunci[0, 1]);
return (this[0, 0] * this[1, 1]) - (this[0, 1] * this[1, 0]);
}
public DoubleMatrix adjoint() {
if (this.ColumnCount != this.RowCount) {
throw new Exception("Adjoint berlaku pada matrix NxN"); }
DoubleMatrix cofactor = new DoubleMatrix(this.ColumnCount,
this.RowCount);
for (int baris = 0; baris < this.RowCount; baris++ ) {
for (int kolom = 0; kolom < this.ColumnCount; kolom++ ) {
// ambil matrix yang sisa DoubleMatrix matrixSisa = new
DoubleMatrix(this.ColumnCount - 1, this.RowCount-1); int traceBaris = 0;
int traceKolom = 0;
for (int loopBaris = 0; loopBaris < this.RowCount; loopBaris++) {
for (int loopKolom = 0; loopKolom <
this.ColumnCount; loopKolom++) {
if (baris == loopBaris || kolom == loopKolom) { continue;
}
matrixSisa[traceKolom, traceBaris] =
this[loopKolom, loopBaris]; traceKolom++; if (traceKolom >= matrixSisa.ColumnCount) { traceKolom = 0; traceBaris++; } } }
cofactor[kolom, baris] = Math.Pow(-1, baris + kolom) * matrixSisa.determinant();
} }
return cofactor.Transposed; }
public void mod(int mod) {
for (int baris = 0; baris < this.RowCount; baris++) {
for (int kol = 0; kol < this.ColumnCount; kol++) {
this[kol, baris] = this[kol, baris] % mod; } } } } }
11. Class GCD
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace hybrid.Lib { class GCD {public static long GCD1(long a, long b) { while (b != 0) { long tmp = b; b = a % b; a = tmp; } return a; } } }