1

我已经在 java 中实现了 AES 加密,但该算法不被团队接受,因为它是在不符合安全性的 ECB 模式下实现的。我对密码学和安全性要求非常陌生。

有人可以帮我将算法更改为 CBC 模式。我附上了我在 ECB 模式下实现的代码。

public String encrypt(String plainPwd)
{
    byte[] outputBytes = new byte[] {};
    String returnString = "";
    try
    {
        byte[] raw = "XXXXX@XXXXXX.XXX".getBytes("UTF-8");

        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec);

        outputBytes = cipher.doFinal(plainPwd.getBytes("UTF-8"));
        if (null != outputBytes)
        {
            returnString = Base64Encrypter.getInstance().encode(outputBytes);
        }
        return returnString.trim();

    }
    catch (Exception e)
    {
        System.out.println(e);
    }

    return new String(outputBytes).trim();
}

public String decrypt(String encryptedPwd)
{
    byte[] outputBytes = new byte[] {};
    try
    {
        byte[] raw = "XXXXX@XXXXXX.XXX".getBytes("UTF-8");

        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, skeySpec);

        byte[] inputBytes = Base64Encrypter.getInstance().decode(encryptedPwd);
        if (null != inputBytes)
        {
            outputBytes = cipher.doFinal(inputBytes);
        }
    }
    catch (Exception e)
    {
        System.out.println(e);
    }

    return new String(outputBytes).trim();
}

早日回复将不胜感激。提前致谢

4

3 回答 3

0

如果您的数据很短并且随机 ECB 可能是可以接受的(至少不比 CBC 差)。但最好不要尝试做对。

请记住,CBC 也不提供完整性保护。使用额外的 HMAC 或专用模式来包装机密 (AESKeywrap) 或使用身份验证模式 (AES/GCM) 会更好。(这不仅是一个避免修改的问题,它还关闭了一类针对协议隐私保护的攻击)。

如果数据不是随机/不可预测的,您需要使用也使用 IV 的模式。在 CBC 的情况下,如果未指定,Java 将选择一个随机 IV。

但是对于解密(特别是如果您有一个进行验证的填充),您需要指定完全相同的 IV,所以不要忘记检索和传输它。因此(不安全,因为未经过身份验证)加密变为:

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
byte[] iv = cipher.getIV(); // randomly filled.
...

// on decrypt specify this IV again
cipher.init(Cipher.DECRYPT_MODE, skeySpec, new IvParameterSpec(iv));

这还有一个优点,它实际上指定了要使用的填充,因此您不依赖于 Java 的默认选择(始终指定完整的模式字符串)。

于 2016-06-03T13:00:59.327 回答
0

AES 有大约 6 种不同的加密模式。为使用它的应用程序使用正确的模式很重要。正如@eckes 所说,ECB 适用于随机加密/解密访问有用的少量数据。ECB 的缺点是相同的输入将具有相同的输出,因此如果实际值的数量有限,攻击者可以看到模式并可能对其进行逆向工程。

查看如何选择 AES 加密模式以获取有关选择正确操作模式的更多指导。

于 2016-06-03T13:19:22.647 回答
0

将请求字符串从 更改AESAES/CBC/PKCS5PADDING并添加一个 iv。虽然填充不是 CBC 特定的,但最好显式定义所有参数,并且几乎没有例外需要填充。

对于 iv 生成一个加密安全的随机数块大小(AES 为 16 字节)。为了使 iv 可用于解密,通常的做法是将其添加到加密数据之前,它不需要是秘密的。

于 2016-06-03T13:20:07.803 回答