我正在使用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");
}
}
}
为了验证这一点,我使用Online AES Encryption / Decryption Tool来解密一些样本数据(效果很好!)。
现在,我想使用免费的AES解密工具,以便收件人可以在不使用在线工具的情况下解密PC上的数据 - 这就是挫折开始的地方。
我开始安装和测试各种不同的AES解密器工具:我仔细输入密钥,选择CBC算法,选择我的文件并点击“解密”,但是没有一个工具可以解码我的示例文件{{1} - 它们全都失败并且在一个案例中给出了一个零字节的空文件。
我尝试使用至少4种不同的AES加密器/解密器工具,但没有一种能够解密我的文件,这让我相信我的代码可能存在问题。
如果有人可以查看我的代码,那将非常感激。
或者,可能有一个AES解密器工具可以使用上面的代码。
答案 0 :(得分:2)
您面临的问题是虽然AES是标准,但它只是一个加密原语,您需要一个完整的协议。
您提出的协议基本上如下:
如您所见,有几个预先定义的细节,双方必须知道成功通信,而AES只是其中之一。您尝试过的工具显然不同意所有这些细节。
解决方案当然是使用标准协议。
要选择合适的协议,您必须首先确定为什么需要加密,因为加密本身不是理想的目标。你想保护什么?
实质上,加密将大量数据的机密性替换为少量数据(密钥)的机密性。如果用户误将密钥泄露,会发生什么?如果您可以安全地将密钥发送给用户,为什么还不能通过该频道发送其余数据? (关于这个主题的文章:http://blogs.msdn.com/b/ericlippert/archive/2011/09/27/keep-it-secret-keep-it-safe.aspx)
认识到机密性只是众多安全属性中的一个,这一点也很重要。您的协议无法提供真实性(保证您创建了消息并且未对其进行修改),因为CBC具有相当的可塑性,并且可能会泄漏有关明文的信息,因为您使用的是静态IV
如您所见,设计安全协议绝非易事。您必须了解您的决定的最细微的细节。即便是专家也不总能做对。
为了避免所有麻烦,您最好的选择是使用完善的标准。使用TLS通过网络连接传输数据,使用PGP加密磁盘上的数据。两种协议都可以配置几乎任何用例。
答案 1 :(得分:0)
你有100个程序员=> 100个不同的想法。 我试图告诉你的是,也许你的代码和让我们说[CriptAES]给出相同的输出,但他们[例如CriptAES的程序员]添加了一些额外的检查/加密/东西,所以你不能用任何其他工具解密它。也许他们强迫用户[使用他们工具的人]仅使用该应用程序[CriptAES]进行加密和解密。 它的想法,仅此而已。祝你好运。
答案 2 :(得分:0)
可以通过多种方式使用对称加密(即使使用相同的加密算法),然后将产品包装在另外无数的方法中。两个不遵循某些特定规范的开发人员产生相同输出的可能性接近于零。
我敢打赌,你提到的那些应用程序不会处理彼此的输出,即它们也不相互兼容。如果是,那么这意味着他们遵循一些标准或其他文档,然后您需要实现相同的标准。
答案 3 :(得分:0)
最后我觉得我找到了一个很好的解决方案。
AES Crypt有一些Java源代码和相应的轻量级实用程序,您可以与需要解码您生成的AES文件的用户共享。
对我来说,这似乎是一个好方法,除非有人能说出来吗?