Update chiphers

This commit is contained in:
khalil2535
2018-04-14 06:39:16 +03:00
parent ca8f6dbb38
commit 520ee69e34
2 changed files with 178 additions and 112 deletions

View File

@ -1,19 +1,26 @@
/** package ciphers;
/**
* Columnar Transposition Cipher Encryption and Decryption. * Columnar Transposition Cipher Encryption and Decryption.
*
* @author <a href="https://github.com/freitzzz">freitzzz</a> * @author <a href="https://github.com/freitzzz">freitzzz</a>
*/ */
public class ColumnarTranspositionCipher { public class ColumnarTranspositionCipher {
private static String keyword; private static String keyword;
private static Object[][] table; private static Object[][] table;
private static String abecedarium; private static String abecedarium;
public static final String ABECEDARIUM = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,.;:-@"; public static final String ABECEDARIUM = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,.;:-@";
private static final String ENCRYPTION_FIELD = ""; private static final String ENCRYPTION_FIELD = "";
private static final char ENCRYPTION_FIELD_CHAR = '≈'; private static final char ENCRYPTION_FIELD_CHAR = '≈';
/** /**
* Encrypts a certain String with the Columnar Transposition Cipher Rule * Encrypts a certain String with the Columnar Transposition Cipher Rule
*
* @param word Word being encrypted * @param word Word being encrypted
* @param keyword String with keyword being used * @param keyword String with keyword being used
* @return a String with the word encrypted by the Columnar Transposition Cipher Rule * @return a String with the word encrypted by the Columnar Transposition
* Cipher Rule
*/ */
public static String encrpyter(String word, String keyword) { public static String encrpyter(String word, String keyword) {
ColumnarTranspositionCipher.keyword = keyword; ColumnarTranspositionCipher.keyword = keyword;
@ -21,7 +28,7 @@ public class ColumnarTranspositionCipher {
table = tableBuilder(word); table = tableBuilder(word);
Object[][] sortedTable = sortTable(table); Object[][] sortedTable = sortTable(table);
String wordEncrypted = ""; String wordEncrypted = "";
for(int i=0;i<sortedTable[0].length;i++){ for (int i = 0; i < sortedTable[i].length; i++) {
for (int j = 1; j < sortedTable.length; j++) { for (int j = 1; j < sortedTable.length; j++) {
wordEncrypted += sortedTable[j][i]; wordEncrypted += sortedTable[j][i];
} }
@ -31,10 +38,13 @@ public class ColumnarTranspositionCipher {
/** /**
* Encrypts a certain String with the Columnar Transposition Cipher Rule * Encrypts a certain String with the Columnar Transposition Cipher Rule
*
* @param word Word being encrypted * @param word Word being encrypted
* @param keyword String with keyword being used * @param keyword String with keyword being used
* @param abecedarium String with the abecedarium being used. null for default one * @param abecedarium String with the abecedarium being used. null for
* @return a String with the word encrypted by the Columnar Transposition Cipher Rule * default one
* @return a String with the word encrypted by the Columnar Transposition
* Cipher Rule
*/ */
public static String encrpyter(String word, String keyword, String abecedarium) { public static String encrpyter(String word, String keyword, String abecedarium) {
ColumnarTranspositionCipher.keyword = keyword; ColumnarTranspositionCipher.keyword = keyword;
@ -53,25 +63,33 @@ public class ColumnarTranspositionCipher {
} }
return wordEncrypted; return wordEncrypted;
} }
/** /**
* Decryps a certain encrypted String with the Columnar Transposition Cipher Rule * Decrypts a certain encrypted String with the Columnar Transposition
* @return a String decrypted with the word ecrypted by the Columnar Transpositiion Cipher Rule * Cipher Rule
*
* @return a String decrypted with the word encrypted by the Columnar
* Transposition Cipher Rule
*/ */
public static String decrypter() { public static String decrypter() {
String wordDecrypted = ""; String wordDecrypted = "";
for (int i = 1; i < table.length; i++) { for (int i = 1; i < table.length; i++) {
for(int j=0;j<table[i].length;j++){ for (Object item : table[i]) {
wordDecrypted+=table[i][j]; wordDecrypted += item;
} }
} }
return wordDecrypted.replaceAll(ENCRYPTION_FIELD, ""); return wordDecrypted.replaceAll(ENCRYPTION_FIELD, "");
} }
/** /**
* Builds a table with the word to be encrpyted in rows by the Columnar Transposition Cipher Rule * Builds a table with the word to be encrypted in rows by the Columnar
* @return An Object[][] with the word to be encrypted filled in rows and columns * Transposition Cipher Rule
*
* @return An Object[][] with the word to be encrypted filled in rows and
* columns
*/ */
private static Object[][] tableBuilder(String word) { private static Object[][] tableBuilder(String word) {
Object[][] table=new Object[rows(word)+1][keyword.length()]; Object[][] table = new Object[numberOfRows(word) + 1][keyword.length()];
char[] wordInChards = word.toCharArray(); char[] wordInChards = word.toCharArray();
//Fils in the respective numbers //Fils in the respective numbers
table[0] = findElements(); table[0] = findElements();
@ -79,7 +97,7 @@ public class ColumnarTranspositionCipher {
for (int i = 1; i < table.length; i++) { for (int i = 1; i < table.length; i++) {
for (int j = 0; j < table[i].length; j++) { for (int j = 0; j < table[i].length; j++) {
if (charElement < wordInChards.length) { if (charElement < wordInChards.length) {
table[i][j]=(char)wordInChards[charElement]; table[i][j] = wordInChards[charElement];
charElement++; charElement++;
} else { } else {
table[i][j] = ENCRYPTION_FIELD_CHAR; table[i][j] = ENCRYPTION_FIELD_CHAR;
@ -88,32 +106,38 @@ public class ColumnarTranspositionCipher {
} }
return table; return table;
} }
/** /**
* Determines the number of rows the table should have regarding the Columnar Transposition Cipher Rule * Determines the number of rows the table should have regarding the
* @return an int with the number of rows that the table should have in order to respect the Columnar Transposition Cipher Rule. * Columnar Transposition Cipher Rule
*
* @return an int with the number of rows that the table should have in
* order to respect the Columnar Transposition Cipher Rule.
*/ */
private static int rows(String word){ private static int numberOfRows(String word) {
if ((double) word.length() / keyword.length() > word.length() / keyword.length()) { if ((double) word.length() / keyword.length() > word.length() / keyword.length()) {
return (word.length() / keyword.length()) + 1; return (word.length() / keyword.length()) + 1;
} else { } else {
return word.length() / keyword.length(); return word.length() / keyword.length();
} }
} }
private static Object[] findElements() { private static Object[] findElements() {
Object[] charValues = new Object[keyword.length()]; Object[] charValues = new Object[keyword.length()];
for (int i = 0; i < charValues.length; i++) { for (int i = 0; i < charValues.length; i++) {
for (int j = 0; j < abecedarium.length(); j++) { for (int j = 0; j < abecedarium.length(); j++) {
if(keyword.charAt(i)==abecedarium.charAt(j))charValues[i]=j; if (keyword.charAt(i) == abecedarium.charAt(j)) {
charValues[i] = j;
}
} }
} }
return charValues; return charValues;
} }
private static Object[][] sortTable(Object[][] table) { private static Object[][] sortTable(Object[][] table) {
Object[][] tableSorted = new Object[table.length][table[0].length]; Object[][] tableSorted = new Object[table.length][table[0].length];
for (int i = 0; i < tableSorted.length; i++) { for (int i = 0; i < tableSorted.length; i++) {
for(int j=0;j<tableSorted[i].length;j++){ System.arraycopy(table[i], 0, tableSorted[i], 0, tableSorted[i].length);
tableSorted[i][j]=table[i][j];
}
} }
for (int i = 0; i < tableSorted[0].length; i++) { for (int i = 0; i < tableSorted[0].length; i++) {
for (int j = i + 1; j < tableSorted[0].length; j++) { for (int j = i + 1; j < tableSorted[0].length; j++) {
@ -125,6 +149,7 @@ public class ColumnarTranspositionCipher {
} }
return tableSorted; return tableSorted;
} }
private static Object[] getColumn(Object[][] table, int rows, int column) { private static Object[] getColumn(Object[][] table, int rows, int column) {
Object[] columnArray = new Object[rows]; Object[] columnArray = new Object[rows];
for (int i = 0; i < rows; i++) { for (int i = 0; i < rows; i++) {
@ -132,14 +157,17 @@ public class ColumnarTranspositionCipher {
} }
return columnArray; return columnArray;
} }
private static void switchColumns(Object[][] table, int firstColumnIndex, int secondColumnIndex, Object[] columnToSwitch) { private static void switchColumns(Object[][] table, int firstColumnIndex, int secondColumnIndex, Object[] columnToSwitch) {
for (int i = 0; i < table.length; i++) { for (int i = 0; i < table.length; i++) {
table[i][secondColumnIndex] = table[i][firstColumnIndex]; table[i][secondColumnIndex] = table[i][firstColumnIndex];
table[i][firstColumnIndex] = columnToSwitch[i]; table[i][firstColumnIndex] = columnToSwitch[i];
} }
} }
/** /**
* Creates an abecedarium with a specified ascii inded * Creates an abecedarium with a specified ascii inded
*
* @param value Number of characters being used based on the ASCII Table * @param value Number of characters being used based on the ASCII Table
*/ */
private static void abecedariumBuilder(int value) { private static void abecedariumBuilder(int value) {
@ -148,14 +176,16 @@ public class ColumnarTranspositionCipher {
abecedarium += (char) i; abecedarium += (char) i;
} }
} }
private static void showTable() { private static void showTable() {
for(int i=0;i<table.length;i++){ for (Object[] table1 : table) {
for(int j=0;j<table[i].length;j++){ for (Object item : table1) {
System.out.print(table[i][j]+" "); System.out.print(item + " ");
} }
System.out.println(); System.out.println();
} }
} }
public static void main(String[] args) { public static void main(String[] args) {
String keywordForExample = "asd215"; String keywordForExample = "asd215";
String wordBeingEncrypted = "This is a test of the Columnar Transposition Cipher"; String wordBeingEncrypted = "This is a test of the Columnar Transposition Cipher";

View File

@ -2,34 +2,82 @@ package ciphers;
import java.math.BigInteger; import java.math.BigInteger;
import java.security.SecureRandom; import java.security.SecureRandom;
import javax.swing.JOptionPane;
/** /**
* Created by Nguyen Duy Tiep on 23-Oct-17. * @author Nguyen Duy Tiep on 23-Oct-17.
*/ */
public class RSA { public final class RSA {
/**
* Trivial test program.
*
* @param args
* @deprecated TODO remove main and make JUnit Testing or any other
* methodology
*/
public static void main(String[] args) {
RSA rsa = new RSA(1024);
String text1 = JOptionPane.showInputDialog("Enter a message to encrypt :");
String ciphertext = rsa.encrypt(text1);
JOptionPane.showMessageDialog(null, "Your encrypted message : " + ciphertext);
JOptionPane.showMessageDialog(null, "Your message after decrypt : " + rsa.decrypt(ciphertext));
}
private BigInteger modulus, privateKey, publicKey; private BigInteger modulus, privateKey, publicKey;
/**
*
* @param bits
*/
public RSA(int bits) { public RSA(int bits) {
generateKeys(bits); generateKeys(bits);
} }
/**
*
* @param message
* @return encrypted message
*/
public synchronized String encrypt(String message) { public synchronized String encrypt(String message) {
return (new BigInteger(message.getBytes())).modPow(publicKey, modulus).toString(); return (new BigInteger(message.getBytes())).modPow(publicKey, modulus).toString();
} }
/**
*
* @param message
* @return encrypted message as big integer
*/
public synchronized BigInteger encrypt(BigInteger message) { public synchronized BigInteger encrypt(BigInteger message) {
return message.modPow(publicKey, modulus); return message.modPow(publicKey, modulus);
} }
public synchronized String decrypt(String message) { /**
return new String((new BigInteger(message)).modPow(privateKey, modulus).toByteArray()); *
* @param encryptedMessage
* @return plain message
*/
public synchronized String decrypt(String encryptedMessage) {
return new String((new BigInteger(encryptedMessage)).modPow(privateKey, modulus).toByteArray());
} }
public synchronized BigInteger decrypt(BigInteger message) { /**
return message.modPow(privateKey, modulus); *
* @param encryptedMessage
* @return plain message as big integer
*/
public synchronized BigInteger decrypt(BigInteger encryptedMessage) {
return encryptedMessage.modPow(privateKey, modulus);
} }
/** Generate a new public and private key set. */ /**
* Generate a new public and private key set.
*
* @param bits
*/
public synchronized void generateKeys(int bits) { public synchronized void generateKeys(int bits) {
SecureRandom r = new SecureRandom(); SecureRandom r = new SecureRandom();
BigInteger p = new BigInteger(bits / 2, 100, r); BigInteger p = new BigInteger(bits / 2, 100, r);
@ -47,16 +95,4 @@ public class RSA {
privateKey = publicKey.modInverse(m); privateKey = publicKey.modInverse(m);
} }
/** Trivial test program. */
public static void main(String[] args) {
RSA rsa = new RSA(1024);
String text1 = "This is a message";
System.out.println("Plaintext: " + text1);
String ciphertext = rsa.encrypt(text1);
System.out.println("Ciphertext: " + ciphertext);
System.out.println("Plaintext: " + rsa.decrypt(ciphertext));
}
} }