gpt4 book ai didi

java - 使用 BlowFish 在 Java 中加密 : result is too long

转载 作者:行者123 更新时间:2023-12-02 10:39:55 25 4
gpt4 key购买 nike

我必须使用 C、Perl 和 Java 使用 BlowFish 加密和解密相同的 secret 。虽然 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());
}

}

最佳答案

仅使用Blowfish密码Java隐式意味着Blowfish/ECB/Pkcs5padding(这可能会有所不同,具体取决于所使用的框架)。您应该始终以算法/模式/填充的形式指定密码。 block 大小是密码是 64 位(8 字节)。所以Java会自动添加一个空的填充 block 。

如果您不想使用任何填充,可以指定Blowfish/ECB/NoPadding。我想说你幸运的是加密单个 block (8字节)的数据,尝试不同的长度,你会看到

关于java - 使用 BlowFish 在 Java 中加密 : result is too long,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52988503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com