Untitled
unknown
plain_text
10 months ago
5.3 kB
7
Indexable
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
Editor is loading...
Leave a Comment