Jul*_*les 5 javascript java android cryptography
我需要使用Java(在Android上)和SJCL加密和解密数据(我可以合理地切换到另一个JS加密库,但我熟悉SJCL,所以如果可能的话,我更愿意坚持使用它).
我的SJCL端工作正常,但在Java端,我不确定我需要使用哪些参数来设置密钥生成器和密码.我到目前为止解密的代码是:
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
KeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 1024, 256);
SecretKey tmp = factory.generateSecret(spec);
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(iv));
String plaintext = new String(cipher.doFinal(ciphertext), "UTF-8");
return plaintext;
Run Code Online (Sandbox Code Playgroud)
salt,iv和ciphertext从SJCL生成的JSON对象中提取为字符串,然后使用Base64解码器解码为字节数组.
不幸的是,我有一些问题,上面的代码不起作用.
我遇到的第一个问题是PBKDF2WithHmacSHA256似乎不是一个公认的密钥生成算法.我不完全确定这是我想要的,但它似乎是基于阅读SJCL文档?Java确实识别了PBKDF2WithHmacSHA1,但这似乎与SJCL实现的算法不同.
其次,如果我尝试使用SHA1密钥算法,我会收到有关无效密钥大小的错误.我是否需要安装一些能够启用带有256位密钥的AES?告诉密钥工厂生成128位密钥可以正常工作(尽管显然与使用256位密钥的SJCL不兼容).
第三,我应该使用什么密码模式?我很确定CBC是不对的... SJCL的文档提到了CCM和OCB,但Java似乎并不支持这些开箱即用 - 再次,我是否需要安装一些东西来使这项工作?SJCL默认哪一个?
最后,即使我选择让Java不抱怨丢失算法的参数,它也会抱怨通过解码SJCL输出提供的IV是错误的长度,它当然看起来是:结果输出中有17个字节,而不是16显然需要AES.我只是忽略了最后一个字节吗?
我还没有尝试过(最后我不再使用 Javascript 加密,而是使用带有 bouncycastle 的嵌入式 java 小程序来处理通信),但 GnuCrypto(bouncycastle 分支)支持 PBKDFWithHmacSHA256。SJCL 中的固定字符编码处理大概修复了 IV (?) 的意外长度,因此这只会保留密码模式。从这一点来看,最简单的方法似乎是实现一个相对简单的密码模式(例如 CTR)作为 SJCL 的附加组件,即使对于不熟悉代码的人来说,这也应该只需要几个小时的工作,之后这只是对 SJCL 使用的 JSON 编码数据包进行编码和解码的问题(这应该是微不足道的)。
作为替代方案,当然可以为 Java 实现 OCB 模式,尽管该算法是专有的,因为根据 GPL 分发的软件有公共专利授权 (http://www.cs.ucdavis.edu) /~rogaway/ocb/grant.htm)。
有趣的是,我想知道 GnuCrypto 是否会接受 OCB 模式支持的补丁?GnuCrypto 是在 GPL-with-libraries-exemption 下分发的,这似乎有资格作为“自由软件基金会发布的 GNU 通用公共许可证的任何版本”,所以理论上至少这应该是可能的。
| 归档时间: |
|
| 查看次数: |
4399 次 |
| 最近记录: |