Java解密加密兼容SJCL?

标签 java javascript android cryptography

我需要使用 Java(在 Android 上)和 SJCL 来加密和解密数据(我似乎可以切换到另一个 JS 加密库,但我熟悉 SJCL,所以如果可能的话我宁愿坚持使用它)。

我的 SJCL 端工作正常,但在 Java 端我不确定我需要使用哪些参数来设置 key 生成器和密码。到目前为止,我用于解密的代码是:

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;

其中 salt、iv 和 ciphertext 从 SJCL 生成的 JSON 对象中提取为字符串,然后使用 Base64 解码器解码为字节数组。

不幸的是,我遇到了一些问题,上面的代码不起作用。

我遇到的第一个问题是 PBKDF2WithHmacSHA256 似乎不是公认的 key 生成算法。我不完全确定这是我想要的,但根据阅读 SJCL 文档,它似乎是正确的? Java 确实识别 PBKDF2WithHmacSHA1,但这似乎与 SJCL 实现的算法不同。

其次,如果我尝试使用 SHA1 key 算法,我会收到有关无效 key 大小的错误。我是否需要安装一些东西来使用 256 位 key 启用 AES?告诉 key 工厂生成 128 位 key 可以正常工作(尽管显然与使用 256 位 key 的 SJCL 不兼容)。

第三,我应该使用什么密码模式?我很确定 CBC 是不对的……SJCL 的文档同时提到了 CCM 和 OCB,但是 Java 似乎不支持开箱即用的任何一种——同样,我是否需要安装一些东西才能使它工作? SJCL 默认使用哪一个?

最后,即使我选择的参数使 Java 不会提示缺少算法,它也会提示通过解码 SJCL 输出提供的 IV 长度错误,这看起来肯定是:结果中有 17 个字节输出,而不是 AES 显然要求的 16。我是否只忽略最后一个字节?

最佳答案

我还没有尝试过(最后我放弃了使用 Javascript 加密,转而使用带有 bouncycaSTLe 的嵌入式 java applet 来处理通信),但是 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 通用公共(public)许可证”的资格,因此至少理论上这应该是可能的。

关于Java解密加密兼容SJCL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9442342/

相关文章:

Java 的 try/catch 方法

javascript - 带 Angular Bootstrap "Error: $(...).collapse() is not a function"

javascript - jquery可调整大小,拖动完成后获取重叠元素

android - 在 Wireshark 上捕获手机流量

android - ionic 未被识别为 cmdlet、函数、脚本文件或可运行程序的名称

java - 参数 @x 没有为存储过程定义...使用 MS_SQL JDBC

java - 如何测试 JAX-WS Web 服务的启动和运行(从 servlet)

java - 如何在大型项目中修复 "object references an unsaved transient instance - save the transient instance before flushing"?

javascript - 每个数组值旁边的删除按钮

android - GridView 行高行为不正确