使用BlowFish在Java中加密:结果太长

时间:2018-10-25 11:44:41

标签: java blowfish

我必须使用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());
    }

}

1 个答案:

答案 0 :(得分:1)

仅使用 Blowfish 密码Java隐式表示Blowfish/ECB/Pkcs5padding(根据所使用的框架,它可能有所不同)。您应该始终以算法/模式/填充的形式指定密码。块大小是密码为64位(8字节)。因此,Java自动添加一个空的填充块。

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