package security; import javax.crypto.*; import javax.crypto.spec.SecretKeySpec; /** * @author Abdelkader Laouid * @author Massinissa Saoudi */ public class Blowfish { final protected static char[] hexArray = "0123456789ABCDEF".toCharArray(); public String key; public String message; public Blowfish(String key, String message) { this.key = key; this.message = message; } // Converts byte array to hex string public static String bytesToHex(byte[] bytes) { char[] hexChars = new char[bytes.length * 2]; for ( int j = 0; j < bytes.length; j++ ) { int v = bytes[j] & 0xFF; hexChars[j * 2] = hexArray[v >>> 4]; hexChars[j * 2 + 1] = hexArray[v & 0x0F]; } return new String(hexChars); } // Converts hex string to byte array public static byte[] hexStringToByteArray(String s) { int len = s.length(); byte[] data = new byte[len / 2]; for (int i = 0; i < len; i += 2) { data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i+1), 16)); } return data; } public String encrypt() throws Exception{ byte[] byteKey = key.getBytes(); String IV = "12345678"; // Create new Blowfish cipher SecretKeySpec keySpec = new SecretKeySpec(byteKey, "Blowfish"); Cipher cipher = Cipher.getInstance("Blowfish/CBC/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, keySpec, new javax.crypto.spec.IvParameterSpec(IV.getBytes())); byte [] encoding = cipher.doFinal(message.getBytes()); return bytesToHex(encoding); } public String decrypt() throws Exception{ byte[] byteKey = key.getBytes(); String IV = "12345678"; // Create new Blowfish cipher SecretKeySpec keySpec = new SecretKeySpec(byteKey, "Blowfish"); Cipher cipher = Cipher.getInstance("Blowfish/CBC/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, keySpec, new javax.crypto.spec.IvParameterSpec(IV.getBytes())); byte [] coded = hexStringToByteArray(message); byte[] decoded = cipher.doFinal(coded); return new String(decoded); } }