java - 对 AES 密码版本感到困惑

标签 java android encryption cryptography aes

我正在尝试在 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/

相关文章:

java - 禁用全局存储库并仅使用 Maven 中的本地存储库

android - 如何在android上使用ffmpeg的命令

android - 如何在 android 的 ListView 中处理大位图?

java - 使用 BouncyCaSTLe 的 block 密码加密/解密字节数组的最简单方法是什么?

java - Spring属性解密

java - codenameone 中的 "Unresolved compilation problems"无效

java - 寻找一个奇完全数

encryption - 具有任意长度明文的 AES 测试向量

java - 登录系统.txt文件读取问题

android - ConstraintLayout 子级的样式