Contoh Hill Cipher Dalam Java
Dalam kriptografi klasik, Hill cipher yaitu cipher substitusi polygraphic menurut aljabar linier. Diciptakan oleh Lester S. Hill pada tahun 1929. Hill cipher yaitu cipher polygraphic pertama di dunia yang bisa mengenkripsi / mendekripsi 3 atau lebih huruf dalam satu waktu.
Teknik kriptografi ini diciptakan dengan maksud untuk sanggup membuat cipher (kode) yang tidak sanggup dipecahkan memakai teknik analisis frekuensi.
Hill Cipher tidak mengganti setiap aksara yang sama pada plaintext dengan aksara lainnya yang sama pada ciphertext sebab memakai perkalian matriks pada dasar enkripsi dan dekripsinya.
Setiap huruf diwakili oleh sejumlah modulo 26. Skema yang digunakannya cukup sederhana, dimana yang dipakai huruf A = 0, B = 1, ..., Z = 25, namun bahwasanya bukan ini fitur atau kemampuan utama dari Hill cipher . Untuk mengenkripsi pesan, setiap blok n huruf (dianggap sebagai vektor n-komponen) dikalikan dengan n × n matriks, terhadap modulus 26. Untuk mendekripsi pesan, setiap blok dikalikan dengan kebalikan dari matriks yang dipakai untuk enkripsi.
Matriks yang dipakai untuk enkripsi yaitu kunci cipher, dan itu harus dipilih secara acak dari himpunan n × n matriks (modulo 26). Kenapa memakai modulo 26? Cipher harus diadaptasi dengan alfabet dengan jumlah huruf.
Dalam rangka untuk mendekripsi, kita beralih ciphertext kembali ke dalam vektor, maka cukup kalikan dengan matriks inverse dari matriks kunci. Ada metode standar untuk menghitung invers matriks, lihat matriks inversi untuk rincian.
Dalam hal ini memang sangat diharapkan pengetahuan untuk persamaan matematika perkalian matrik dan bagaimana mencari matrik invers dari matrik kunci, termasuk bagaiamana mencari modular invers dari sebuah matrik.
package ciphers;
import java.io.*;
import java.lang.*;
public class hillcipher
{
public static void main(String []arg)throws Exception
{
int k[][]={{17,17,5}, {21,18,21}, {2,2,19}};
int p[]=new int[300];
int c[]=new int[300];
int i=0;
//System.out.println("enter key");
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
/*for(i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
String str=br.readLine();
k[i][j]=Integer.parseInt(str);
}
}*/
System.out.println("enter plain text");
String str=br.readLine();
for( i=0;i<str.length();i++)
{
int c1=str.charAt(i);
//System.out.println(c1);
p[i]=(c1)-97;
}
i=0;int zz=0;
for( int b=0;b<str.length()/3;b++)
{
for(int j=0;j<3;j++)
{
for(int x=0;x<3;x++)
{
c[i]+=k[j][x]*p[x+zz];
}i++;
}
zz+=3;
}
System.out.println("Encrypted Text : ");
for(int z=0;z<str.length();z++)
System.out.print((char)((c[z]%26)+97));
}
}