我试图在Android应用中实施AES256加密。数据来自加密的服务器,我一直在使用Android库JNCryptor来解密数据。它成功地做到了这一点,但它很慢。我想尝试Facebook的Conceal库,因为它报告加密和解密速度更快。我的第一个实现是使用Conceal库从服务器解密字符串。当我尝试将加密字符串的byte[]
传递给隐藏中的decrypt
函数时出现问题。
ByteArrayInputStream bin = new ByteArrayInputStream(Base64.decode(encStr, Base64.DEFAULT));
InputStream cryptoStream = null;
try {
cryptoStream = crypto.getCipherInputStream(bin, new Entity("test"));
...
崩溃的原因是,通过获取cipher version
的第一个字节而找到的给定byte []
不等于预期的隐含cipher version
数字1。
然后我查看了Conceal的加密方面,看到这只是加密过程中设置的数字。
仔细检查我然后查看了JNCryptor源代码并看到它设置并查找Cipher版本号2和3。
我想我的问题是:Cipher版本号的重要性是什么?我能够让Conceal库解密这些数据,还是只是以完全不同的方式加密?
答案 0 :(得分:2)
他们是完全无关的。例如,Conceal似乎使用GCM加密模式(包括身份验证),RNCrypt在CBC模式下使用AES,在HMAC中使用AES进行身份验证。除此之外,它直接使用密码和PBKDF2代替键(尽管像JNCryptor这样的实现可能包含直接使用键的快捷方式 - 感谢Duncan)。
两者都是相对简约的专有加密格式,都使用AES。那是他比较结束的地方。