1// Aim: Program to perform Hill cipher (Hill Cipher).
2public class hill2x2{
3 private static int[][] keyMatrix = {{2,3},{3,5}};
4 public static int modInverse(int a,int m){
5 a=a%m;
6 for(int x=1;x<m;x++){
7 if((a*x)%m==1){
8 return x;
9 }
10 }
11 return -1;
12 }
13
14 public static String hillencrypt(String plain , int[][] keyMatrix){
15 StringBuilder ct = new StringBuilder();
16 for(int k=0;k<plain.length();k+=2){
17 int[] vector = new int[2];
18 vector[0]=plain.charAt(k)-'A';
19 vector[1]=plain.charAt(k+1)-'A';
20
21 int[] result = new int[2];
22 for(int i =0;i<2;i++){
23 result[i]=0;
24 for(int j=0;j<2;j++){
25 result[i]+=keyMatrix[i][j]*vector[j];
26 }
27 result[i]%=26;
28 }
29 for(int val : result){
30 ct.append((char)(val+'A'));
31 }
32
33 }return ct.toString();
34 }
35
36 public static String hilldecrypt(String cipher , int[][] keyMatrix){
37 int det = (keyMatrix[0][0]*keyMatrix[1][1]-keyMatrix[0][1]*keyMatrix[1][0])%26;
38 det = ((det%26)+26)%26;
39
40 int detinv = modInverse(det, 26);
41 int[][] inv = new int[2][2];
42
43 int[][] adj = new int[2][2];
44 adj[0][0] = keyMatrix[1][1];
45 adj[0][1] = -keyMatrix[0][1];
46 adj[1][0] = -keyMatrix[1][0];
47 adj[1][1] = keyMatrix[0][0];
48
49 for(int i=0 ; i<2;i++){
50 for(int j=0;j<2;j++){
51 inv[i][j]=(adj[i][j]*detinv)%26;
52 if(inv[i][j]<0){
53 inv[i][j]+=26;
54 }
55 }
56 }
57 StringBuilder pt = new StringBuilder();
58 for(int k=0;k<cipher.length();k+=2){
59 int[] vector = new int[2];
60 vector[0]=cipher.charAt(k)-'A';
61 vector[1]=cipher.charAt(k+1)-'A';
62
63 int[] result = new int[2];
64 for(int i =0;i<2;i++){
65 result[i]=0;
66 for(int j=0;j<2;j++){
67 result[i]+=inv[i][j]*vector[j];
68 }
69 result[i]%=26;
70 }
71 for(int val : result){
72 pt.append((char)(val+'A'));
73 }
74
75 }return pt.toString();
76 }
77
78 public static void main(String[] args) {
79 String msg = "HOPE";
80 String encrypted = hillencrypt(msg, keyMatrix);
81 String decrypted = hilldecrypt(encrypted, keyMatrix);
82
83 System.out.println("encrypted : "+encrypted);
84 System.out.println("decrypted : "+decrypted);
85 }
86}