我必须使用BlowFish加密和解密使用C,Perl和Java的相同机密。尽管C-pgm和Perl给出相同的结果,但是Java中的结果字符串太长。这里首先使用C语言编写的pgm进行加密和解密:
$ ./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());
}
}
答案 0 :(得分:1)
仅使用 Blowfish 密码Java隐式表示Blowfish/ECB/Pkcs5padding
(根据所使用的框架,它可能有所不同)。您应该始终以算法/模式/填充的形式指定密码。块大小是密码为64位(8字节)。因此,Java自动添加一个空的填充块。
如果您不想使用任何填充,则可以指定Blowfish/ECB/NoPadding
。我想说您幸运的是正在加密单个块(8字节)的数据,尝试不同的长度,您会看到