1

我正在使用 Java AES 加密来加密将发送给收件人的数据。每个收件人都有自己的密钥,他们和我都知道。

这个想法是他们可以使用免费提供的 AES 解密工具来解密数据。

这是我的代码:

public class AESencrypt {

    private static final String ALGO = "AES/CBC/PKCS5Padding";
    private static final byte[] keyValue = new byte[]{'T', 'h', 'e', 'B', 'e', 's', 't', 'S', 'e', 'c', 'r', 'e', 't', 'K', 'e', 'y'};
    private static byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

    public void String encryptToFile(String filename, String data) throws Exception {
        Key key = new SecretKeySpec(keyValue, "AES");
        Cipher c = Cipher.getInstance(ALGO);
        IvParameterSpec ivspec = new IvParameterSpec(iv);
        c.init(Cipher.ENCRYPT_MODE, key, ivspec);
        byte[] encVal = c.doFinal(data.getBytes());
        FileOutputStream fileOutputStream = new FileOutputStream(filename);
        fileOutputStream.write(encVal);
        fileOutputStream.close();
    }

    public static void main(String[] args) throws Exception {
        encryptToFile("foo.aes", "hellothere");
    }
}

}

为了验证这一点,我使用了在线 AES 加密/解密工具来解密一些示例数据(效果很好!)。

现在,我想使用一个免费的 AES 解密工具,这样收件人就可以在不使用在线工具的情况下解密他们 PC 上的数据——这就是挫折开始的地方。

我开始安装和测试各种不同的 AES 解密器工具:我仔细输入密钥,选择 CBC 算法,选择我的文件并点击“解密”,但没有一个工具可以解码我的示例文件foo.aes- 它们都因错误而失败并且在一种情况下,给出了一个零字节的空文件。

我使用至少 4 种不同的 AES 加密器/解密器工具进行了尝试,但它们都无法解密我的文件,这让我相信我的代码可能存在问题。

  • 脚本AES
  • AES 地穴
  • 高级 AES 加密器
  • Cr!ptAES

如果有人可以查看我的代码,将不胜感激。

或者,可能有一个 AES 解密器工具可以与上面的代码一起使用。

4

4 回答 4

2

您面临的问题是,虽然 AES 是一种标准,但它只是一种加密原语,您需要一个完整的协议

您提出的协议基本上如下:

  • 以某种方式预先共享密钥。密钥定义为 ASCII 字符集中的 16 个字符;不应将密钥派生函数应用于它(预定义的详细信息)。
  • 使用 AES 在 CBC 模式下使用 PKCS #5 填充(预定义的详细信息)加密明文。使用预定义的 IV。

如您所见,为了成功的通信,双方必须注意几个预定义的细节,而 AES 只是其中之一。您尝试过的工具显然不同意所有这些细节。

解决方案当然是使用标准协议。

要选择合适的协议,您必须首先确定为什么需要加密,因为加密本身并不是理想的目标。你想保护什么?

本质上,加密是用少量数据(密钥)的机密性替代大量数据的机密性。如果用户错误地泄露了密钥会发生什么?如果您可以安全地将密钥发送给用户,为什么您不能通过该通道发送其余数据呢?(有关该主题的文章:http: //blogs.msdn.com/b/ericlippert/archive/2011/09/27/keep-it-secret-keep-it-safe.aspx

同样重要的是要认识到机密性只是众多安全属性之一。您的协议无法提供真实性(保证创建了消息并且它没有被修改),因为 CBC 具有相当的可塑性,并且它可能会泄漏有关明文的信息,因为您使用了静态 IV。

如您所见,设计一个安全协议绝非易事。即使是最微小的决策细节,您也必须了解。即使是专家也不总是正确的。

为避免所有麻烦,您最好的选择是使用完善的标准。使用TLS通过网络连接传输数据,使用PGP加密磁盘上的数据。这两种协议几乎可以针对任何用例进行配置。

于 2013-10-22T20:07:17.310 回答
0

你有 100 个程序员 => 100 个不同的想法。我想在这里告诉你的是,也许你的代码并假设 [CriptAES] 给出了相同的输出,但是他们 [例如 CriptAES 的程序员] 添加了一些额外的检查/加密/一些东西,所以你不能用任何其他工具解密它。也许他们正在强迫用户 [使用他们工具的人] 仅使用该应用程序 [CriptAES] 进行加密和解密。它只是想法,仅此而已。祝你好运。

于 2013-10-22T13:33:31.337 回答
0

对称加密(即使使用相同的加密算法)可以以多种方式使用,然后将产品包装在另一种无数的方法中。两个不遵循某些特定规范的开发人员产生相同输出的机会接近于零。

我敢打赌,您提到的那些应用程序不会处理彼此的输出,即它们也不相互兼容。如果是,那么这意味着它们遵循某些标准或其他文件,然后您需要实施相同的标准。

于 2013-10-22T13:42:30.230 回答
0

最后,我想我找到了一个不错的解决方案。

AES Crypt有一些 Java 源代码和相应的轻量级实用程序,您可以与需要解码您生成的 AES 文件的用户共享。

这对我来说似乎是一个很好的方法,除非有人可以说不然?

于 2013-11-04T13:21:09.370 回答