Java 关于AES密码版本的困惑

Java 关于AES密码版本的困惑,java,android,encryption,cryptography,aes,Java,Android,Encryption,Cryptography,Aes,我正在尝试在android应用程序中实现AES256加密。数据来自加密的服务器,我一直在使用Android库对数据进行解密。它成功地做到了这一点,但速度非常慢。我想尝试一下Facebook的库,因为它报告了更快的加密和解密速度。我的第一个实现是使用隐藏库从服务器解密字符串。当我试图将加密字符串的字节[]传递给隐藏中的解密函数时,出现了问题 ByteArrayInputStream bin = new ByteArrayInputStream(Base64.decode(encStr, Base6

我正在尝试在android应用程序中实现AES256加密。数据来自加密的服务器,我一直在使用Android库对数据进行解密。它成功地做到了这一点,但速度非常慢。我想尝试一下Facebook的库,因为它报告了更快的加密和解密速度。我的第一个实现是使用隐藏库从服务器解密字符串。当我试图将加密字符串的
字节[]
传递给隐藏中的
解密
函数时,出现了问题

ByteArrayInputStream bin = new ByteArrayInputStream(Base64.decode(encStr, Base64.DEFAULT));
    InputStream cryptoStream = null;
    try {
        cryptoStream = crypto.getCipherInputStream(bin, new Entity("test"));
...
崩溃是因为通过获取
字节[]
的第一个字节找到的给定
密码版本
不等于预期的
密码版本
编号1

然后我查看了隐藏的加密端,发现这只是加密过程中设置的一个数字

为了再次检查,我查看了JNCryptor源代码,看到它设置并查找密码版本号2和3


我想我的问题是:密码版本号的意义是什么?我能让隐藏库解密这些数据吗?还是它们只是以完全不同的方式加密?

它们完全不相关。例如,隐藏似乎使用GCM加密模式(包括身份验证),RNCrypt在CBC模式下使用AES,在HMAC模式下使用HMAC进行身份验证。此外,它使用密码和PBKDF2而不是直接使用密钥(尽管像JNCryptor这样的实现可能包括直接使用密钥的快捷方式——感谢Duncan)


两者都是相对最低限度的专有加密格式,并且都使用AES。这就是他比较的终点

更不用说JNCryptor在Android上的解密速度很慢。我欢迎你在这个问题上的意见,因为我想了解根本原因。请随意在GitHub上发布一些关于您的环境的信息。谢谢Duncan。我将尝试直接使用密钥,看看这是否加快了速度。如果需要,请使用jncyptor。这有时可以最小化Android用户报告的“慢”问题,因为它似乎是在某些设备上运行非常慢的关键派生(原因我还不清楚)。