Untitled
import java.io.*; import java.util.Scanner; public class HillCipher { static double[][] decrypt = new double[3][1]; static double[][] a = new double[3][3]; static double[][] b = new double[3][3]; static double[][] mes = new double[3][1]; static double[][] res = new double[3][1]; static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); static Scanner sc = new Scanner(System.in); public static void main(String[] args) throws IOException { getkeymes(); // Encryption for (int i = 0; i < 3; i++) for (int j = 0; j < 1; j++) for (int k = 0; k < 3; k++) res[i][j] += a[i][k] * mes[k][j]; System.out.print("\nEncrypted string is: "); for (int i = 0; i < 3; i++) { System.out.print((char) (res[i][0] % 26 + 97)); } // Inverse key matrix inverse(); // Decryption for (int i = 0; i < 3; i++) for (int j = 0; j < 1; j++) for (int k = 0; k < 3; k++) decrypt[i][j] += b[i][k] * res[k][j]; System.out.print("\nDecrypted string is: "); for (int i = 0; i < 3; i++) { System.out.print((char) (Math.round(decrypt[i][0]) % 26 + 97)); } System.out.print("\n"); } public static void getkeymes() throws IOException { System.out.println("Enter 3x3 matrix for key (It should be invertible): "); for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) a[i][j] = sc.nextDouble(); System.out.print("\nEnter a 3-letter string: "); String msg = br.readLine(); if (msg.length() != 3) { throw new IllegalArgumentException("Input must be exactly 3 letters."); } for (int i = 0; i < 3; i++) mes[i][0] = msg.charAt(i) - 97; } public static void inverse() { double p, q; double[][] c = new double[3][3]; // Copy matrix a to c for (int i = 0; i < 3; i++) System.arraycopy(a[i], 0, c[i], 0, 3); // Initialize identity matrix for b for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) b[i][j] = (i == j) ? 1 : 0; // Perform matrix inversion for (int k = 0; k < 3; k++) { for (int i = 0; i < 3; i++) { p = c[i][k]; q = c[k][k]; for (int j = 0; j < 3; j++) { if (i != k) { c[i][j] = c[i][j] * q - p * c[k][j]; b[i][j] = b[i][j] * q - p * b[k][j]; } } } } for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) b[i][j] /= c[i][i]; System.out.println("\nInverse Matrix is: "); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) System.out.print(b[i][j] + " "); System.out.println(); } } } PROGRAM: import java.io.*; import java.util.*; import java.io.*; public class HillCipher { static float[][] decrypt = new float[3][1]; static float[][] a = new float[3][3]; static float[][] b = new float[3][3]; static float[][] mes = new float[3][1]; static float[][] res = new float[3][1]; static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); static Scanner sc = new Scanner(System.in); public static void main(String[] args) throws IOException { // TODO code application logic here getkeymes(); for(int i=0;i<3;i++) for(int j=0;j<1;j++) for(int k=0;k<3;k++) { res[i][j]=res[i][j]+a[i][k]*mes[k][j]; } System.out.print("\nEncrypted string is : "); for(int i=0;i<3;i++) { System.out.print((char)(res[i][0]%26+97)); res[i][0]=res[i][0]; } inverse(); for(int i=0;i<3;i++) for(int j=0;j<1;j++) for(int k=0;k<3;k++) { decrypt[i][j] = decrypt[i][j]+b[i][k]*res[k][j]; } System.out.print("\nDecrypted string is : "); for(int i=0;i<3;i++){ System.out.print((char)(decrypt[i][0]%26+97)); } System.out.print("\n"); } public static void getkeymes() throws IOException { System.out.println("Enter 3x3 matrix for key (It should be inversible): "); for(int i=0;i<3;i++) for(int j=0;j<3;j++) a[i][j] = sc.nextFloat(); System.out.print("\nEnter a 3 letter string: "); String msg = br.readLine(); for(int i=0;i<3;i++) mes[i][0] = msg.charAt(i)-97; } public static void inverse() { floatp,q; float[][] c = a; for(int i=0;i<3;i++) for(int j=0;j<3;j++) { //a[i][j]=sc.nextFloat(); if(i==j) b[i][j]=1; else b[i][j]=0; } for(int k=0;k<3;k++) { for(int i=0;i<3;i++) { p = c[i][k]; q = c[k][k]; for(int j=0;j<3;j++) { if(i!=k) {c[i][j] = c[i][j]*q-p*c[k][j]; b[i][j] = b[i][j]*q-p*b[k][j]; } } } } for(int i=0;i<3;i++) for(int j=0;j<3;j++) { b[i][j] = b[i][j]/c[i][i]; } System.out.println(""); System.out.println("\nInverse Matrix is : "); for(int i=0;i<3;i++) { for(int j=0;j<3;j++) System.out.print(b[i][j] + " "); System.out.print("\n"); } } } Output: Enter a 3 letter string: hai Encrypted string is :fdx Inverse Matrix is : 0.083333336 0.41666666 -0.33333334 -0.41666666 -0.083333336 0.6666667 0.5833333 -0.083333336 -0.33333334 Decrypted string is: hai
Leave a Comment