Vigenere
Vigenere cipher
import java.util.*;
public class Vigenere {
static String vig(String t, String k, boolean e) {
String r=""; k=k.repeat(t.length()/k.length()+1).substring(0,t.length());
for(int i=0;i<t.length();i++){
int a=t.charAt(i)-'a', b=k.charAt(i)-'a';
r+=(char)((e?(a+b):(a-b+26))%26+'a');
}
return r;
}
public static void main(String[] a){
Scanner s=new Scanner(System.in);
System.out.print("Text: "); String p=s.next();
System.out.print("Key: "); String k=s.next();
String c=vig(p,k,true);
System.out.println("Cipher: "+c);
System.out.println("Decrypted: "+vig(c,k,false));
}
}
Playfair
import java.util.*;
public class PlayfairMini {
static char[][] B=new char[5][5];
public static void main(String[] x){
Scanner sc=new Scanner(System.in);
System.out.print("Key: "); String k=sc.nextLine().toUpperCase().replace("J","I");
System.out.print("Text: "); String t=sc.nextLine().toUpperCase().replace("J","I");
make(k);
String p=prep(t);
String c=run(p,1);
String d=run(c,-1);
System.out.println("Cipher: "+c);
System.out.println("Decrypted: "+d);
}
static void make(String k){
boolean u[]=new boolean[26];
// remove everything except A-Z to avoid indexing errors
String safe = k.replaceAll("[^A-Z]","") + "ABCDEFGHIKLMNOPQRSTUVWXYZ";
int r=0,c=0;
for(char ch: safe.toCharArray())
if(!u[ch-'A']){
B[r][c++]=ch; u[ch-'A']=true;
if(c==5){c=0;r++;} if(r==5)break;
}
}
static String prep(String t){
StringBuilder o=new StringBuilder();
t=t.replaceAll("[^A-Z]","");
for(int i=0;i<t.length();){
char a=t.charAt(i), b=i+1<t.length()?t.charAt(i+1):'X';
if(a==b){b='X';i++;} else i+=2;
o.append(a).append(b);
}
return o.toString();
}
static String run(String t,int s){
StringBuilder o=new StringBuilder();
for(int i=0;i<t.length();i+=2){
int[] A=pos(t.charAt(i)),B2=pos(t.charAt(i+1));
if(A[0]==B2[0]){
o.append(B[A[0]][(A[1]+s+5)%5]);
o.append(B[B2[0]][(B2[1]+s+5)%5]);
} else if(A[1]==B2[1]){
o.append(B[(A[0]+s+5)%5][A[1]]);
o.append(B[(B2[0]+s+5)%5][B2[1]]);
} else {
o.append(B[A[0]][B2[1]]);
o.append(B[B2[0]][A[1]]);
}
}
return o.toString();
}
static int[] pos(char ch){
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
if(B[i][j]==ch) return new int[]{i,j};
return null;
}
}
Comments
Post a Comment