为什么Blowfish加密会删除正斜杠?

时间:2016-04-25 15:27:31

标签: java blowfish

考虑以下执行Blowfish加密的方法:

import javax.crypto.Cipher;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Hex;

private static String encryptString(String value, String key)
{
    String encryptedString = "";
    if (value != null)
    {
        SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "Blowfish");
        try
        {
            Cipher cipher = Cipher.getInstance("Blowfish/ECB/PKCS#5");
            cipher.init(Cipher.ENCRYPT_MODE, keySpec);
            byte[] encrypted = cipher.doFinal(value.getBytes());
            encryptedString = new String(Hex.encodeHex(encrypted));
        }
        catch (Exception e)
        {
            // Show error
        }
    }
    return encryptedString;
}

我要编码的String包含正斜杠。当我尝试编码例如" http://www.google.com/Foo"时,由于某种原因,当我对其进行解码时,正斜杠被剥离,例如, " HTTP:www.google.comFoo"

可能的原因是什么,以及如何防止这种情况?

1 个答案:

答案 0 :(得分:1)

您用来检查加密文字的网站(https://webnet77.net/cgi-bin/helpers/blowfish.pl)是错误的。

尝试加密该网站上的文字(http://www.google.com/Foo),您会看到它删除了斜杠。 Java没有。

其他问题:

  • key参数的值是多少?

    如果它是Blowfish密钥的十六进制编码,则getBytes()完全错误,因为您需要对其进行十六进制解码,而不是您当前正在执行的代码页转换。

    SecretKeySpec需要byte[],因为密钥是二进制值,无法以纯文本格式存储。

  • Blowfish/ECB/PKCS#5不是JDK中的有效密码。

    Blowfish/ECB/PKCS5PADDING是。

  • 如果您的value参数可以包含纯ASCII以外的任何内容,那么value.getBytes()就不合适了。在将字符串转换为字节时,总是指定代码页。

    您可以指定"US-ASCII"仅强制执行A​​SCII,或指定服务器所需的代码页,但"UTF-8"通常是一个不错的选择。