0

我有加密字符串的功能:

BASE64Decoder decoder = new BASE64Decoder();
BASE64Encoder encoder = new BASE64Encoder();

public String encryptValueWithBlowfish(String data, String secretKey) {

    Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
    try {
        SecretKeySpec key = new SecretKeySpec(decoder.decodeBuffer(secretKey), "Blowfish");
        Cipher cipher = Cipher.getInstance("Blowfish/CBC/NoPadding", "BC");
        String iv = "\0\0\0\0\0\0\0\0";
        IvParameterSpec ivs = new IvParameterSpec(iv.getBytes());
        cipher.init(Cipher.ENCRYPT_MODE, key, ivs);
        MessageDigest sha = MessageDigest.getInstance("SHA-1");
        return encoder.encode(sha.digest(cipher.doFinal(decoder.decodeBuffer(data))));
    } catch (Exception e) {
        lg.info("Failed to encryptValueWithBlowfish: " + e.getMessage());
        return "";
    }
}

线cipher.init(Cipher.ENCRYPT_MODE, key, ivs);升异常 "Unsupported keysize or algorithm parameters"。这段代码在另一台 Linux 机器上可以很好地分叉。两种情况下传递的参数是相同的。我不擅长加密货币。可能有什么问题?

4

1 回答 1

1

可能有什么问题?

好吧,您在这里使用默认字符编码:iv.getBytes()- 这绝不是一个好的开始。也许两台不同的机器有不同的默认编码。

如果你想创建一个全零和特定大小的字节数组,为什么不直接使用:

IvParameterSpec ivs = new IvParameterSpec(new byte[8]);

如果你想要一个 16 字节的 IV,或者使用 16。

目前尚不清楚decoder这里是什么 - 但您会一次又一次地使用它,如果使用的是默认字符编码,它可能会因机器而异。

于 2013-03-19T11:03:44.033 回答