【问题标题】:Encryption using Blowfish in CBC mode in Java在 Java 中以 CBC 模式使用 Blowfish 进行加密
【发布时间】:2012-01-18 15:54:39
【问题描述】:

我需要在 CBC 模式下使用 Blowfish 加密对特定字符串进行加密,而在 Java 中没有填充。我做了一些研究,发现了这个问题:encrypting and decrypting using java

我想知道如何在 Cipher 对象的 init 方法中使用基本字符串作为键。在示例中,keySpec 不是字符串,而是使用 SHA-256 加密的字符串。

在示例中:

cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);

其中keySpecSecretKeySpec 对象

我需要什么:

cipher.init(Cipher.ENCRYPT_MODE, keyString, ivSpec);

其中keyStringString 对象

我知道使用基本字符串不如自动生成字符串安全。但是你知道我如何使用字符串作为键吗?

【问题讨论】:

    标签: java encryption key blowfish


    【解决方案1】:

    这行得通吗?

    SecretKey secretKey = new SecretKeySpec(keyString.getBytes(charset), "Blowfish");
    cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec);
    

    【讨论】:

    • 我试过但我有一个错误:“输入长度不是 8 字节的倍数”当我这样做时:byte[] encrypted = cipher.doFinal(token.getBytes());令牌长度需要是8字节的倍数?
    • 我不是 Blowfish 专家,而且今天互联网正在罢工,所以我不能很快成为一名专家,但是 afaik Blowfish 需要至少 32 位的密钥。不过,8 字节的最低要求相当普遍。请问为什么要用这么短的key?
    • 我发现了我的错误。我尝试加密的字符串包含 22 个字符,它的长度应该是 8 的倍数。所以我想我必须使用填充。我应该使用哪一个? (我必须使用与 PERL 中的标准填充相同)
    • 我很确定主要问题不是填充,而是生成的 SecretKey。我真的需要使用 String keyString 进行加密。你知道我可以使用这个字符串而不是 SecretKey 了吗?
    • 您永远不能直接使用密钥字符串,因为河豚算法仅在字节上指定。因此,您可能已经发现,您需要将字符串编码 为 X 字节,然后将其填充为 Y 字节,其中 Y = 密钥大小(以字节为单位)。如果您需要与某人交谈,您需要使用编码和填充,尽管尝试“UTF-8 作为编码和右侧的 00h 填充可能是最常见的(使用密码作为密钥一点也不聪明,您应该始终使用密钥派生机制,例如 PBKDF2)。
    猜你喜欢
    • 2019-09-09
    • 1970-01-01
    • 2015-09-25
    • 2021-05-15
    • 2019-05-15
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    • 2021-05-06
    相关资源
    最近更新 更多