JavaAlgorithms/Ciphers/AffineCipher.java
2021-10-18 08:43:38 +03:00

99 lines
2.9 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//The key for the Affine cipher consists of 2 numbers, well call them a and b.
// The following discussion assumes the use of a 26 character alphabet (m = 26).
// a should be chosen to be relatively prime to m (i.e. a should have no factors in common with m).
package Ciphers;
import java.util.Scanner;
class AffineCipher
{
static Scanner in = new Scanner(System.in);
static String encryptMessage(char[] msg)
{
System.out.println("Enter key value a for encryption : ");
int a = in.nextInt();
System.out.println("Enter key value b for encryption : ");
int b = in.nextInt();
/// Initially empty cipher String
String cipher = "";
for (int i = 0; i < msg.length; i++)
{
// Avoid space to be encrypted
/* applying encryption formula ( a x + b ) mod m
{here x is msg[i] and m is 26} and added 'A' to
bring it in range of ascii alphabet[ 65-90 | A-Z ] */
if (msg[i] != ' ')
{
cipher = cipher
+ (char) ((((a * (msg[i] - 'A')) + b) % 26) + 'A');
} else // append space character
{
cipher += msg[i];
}
}
return cipher;
}
static String decryptCipher(String cipher)
{
System.out.println("Enter key value a for decryption : ");
int a = in.nextInt();
System.out.println("Enter key value b for decryption : ");
int b = in.nextInt();
String msg = "";
int a_inv = 0;
int flag = 0;
//Find a^-1 (the multiplicative inverse of a
//in the group of integers modulo m.)
for (int i = 0; i < 26; i++)
{
flag = (a * i) % 26;
// Check if (a*i)%26 == 1,
// if so, then i will be the multiplicative inverse of a
if (flag == 1)
{
a_inv = i;
}
}
for (int i = 0; i < cipher.length(); i++)
{
/*Applying decryption formula a^-1 ( x - b ) mod m
{here x is cipher[i] and m is 26} and added 'A'
to bring it in range of ASCII alphabet[ 65-90 | A-Z ] */
if (cipher.charAt(i) != ' ')
{
msg = msg + (char) (((a_inv *
((cipher.charAt(i) + 'A' - b)) % 26)) + 'A');
}
else // append space character
{
msg += cipher.charAt(i);
}
}
return msg;
}
// Main method
public static void main(String[] args)
{
String msg = "AFFINE CIPHER";
// Encrypting message
String cipherText = encryptMessage(msg.toCharArray());
System.out.println("Encrypted Message is : " + cipherText);
// Decrypting message
System.out.println("Decrypted Message is: " + decryptCipher(cipherText));
}
}