hill2x2.java
86 linesjava
DOWNLOAD
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}