Я должен зашифровать и расшифровать, используя один и тот же секрет BlowFish, используя C, Perl и Java.Хотя C-pgm и Perl дают одинаковые результаты, результирующая строка в Java слишком длинная.Здесь сначала шифруем и дешифруем с помощью pgm, написанного на C:
$ ./enc key Valentin
block: [Valentin]
0a2dc7c9bf82264d
$ ./dec key 0a2dc7c9bf82264d
Valentin
А теперь то же самое написано на Java:
$ java -classpath . BlowFishTest key Valentin
length of pw: 8
length of crypted: 16
0a2dc7c9bf82264dd83df76a225413c1
Интересно, что первая часть результата на Java содержитте же шестнадцатеричные значения, что и в C, но длина 16 байтов.
Код Java:
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class BlowFishTest {
public static void main(String[] args) throws Exception {
String key = args[0];
String clear = args[1];
encrypt(key, clear);
}
private static void encrypt(String key, String password) throws Exception {
byte[] KeyData = key.getBytes("UTF-8");
SecretKeySpec KS = new SecretKeySpec(KeyData, "Blowfish");
Cipher cipher = Cipher.getInstance("Blowfish");
cipher.init(Cipher.ENCRYPT_MODE, KS);
byte[] pw = password.getBytes("UTF-8");
System.out.println("length of pw: " + pw.length);
byte[] crypted = cipher.doFinal(pw);
System.out.println("length of crypted: " + crypted.length);
StringBuilder sb = new StringBuilder();
for (byte b : crypted) {
sb.append(String.format("%02X", b));
}
System.out.println(sb.toString().toLowerCase());
}
}