我正在尝试在 Android 应用程序中实现 AES256 加密。数据来自加密的服务器,我一直在使用Android库JNCryptor解密数据。它成功地做到了这一点,但速度非常慢。我想尝试 Facebook 的 Conceal库,因为它报告具有更快的加密和解密速度。我的第一个实现是使用 Conceal 库从服务器解密字符串。当我尝试将加密字符串的 byte[]
传递给 Conceal 中的 decrypt
函数时,我的问题就出现了。
ByteArrayInputStream bin = new ByteArrayInputStream(Base64.decode(encStr, Base64.DEFAULT));
InputStream cryptoStream = null;
try {
cryptoStream = crypto.getCipherInputStream(bin, new Entity("test"));
...
崩溃是因为给定的密码版本
(通过获取byte []
的第一个字节找到的)不等于预期的Conceal 密码版本
数字 1。
然后我查看了 Conceal 的加密部分,发现这只是加密过程中设置的一个数字。
为了仔细检查,我查看了 JNCryptor 源代码,看到它设置并查找密码版本号 2 和 3。
我想我的问题是:密码版本号的意义是什么?我能否让 Conceal 库解密这些数据,或者它们只是以完全不同的方式加密?
最佳答案
它们完全无关。例如,Conceal 似乎使用 GCM 加密模式(包括身份验证),而 RNCrypt 使用 CBC 模式下的 AES 和 HMAC 进行身份验证。除此之外,它使用密码和 PBKDF2 而不是直接使用 key (尽管 JNCryptor 等实现可能包括直接使用 key 的快捷方式 - 感谢 Duncan)。
两者都是相对简约的专有加密格式,并且都使用 AES。这就是他的比较结束的地方。
关于java - 对 AES 密码版本感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25345075/