如何在Kotlin中实现encryptBase64获密文或在Rhino中运行加密代码?
JS加密逻辑适配Kotlin/Java环境的可行方案
修复Rhino执行时的"window未定义"问题
Rhino是无浏览器环境的JS引擎,默认没有window这类浏览器全局对象,得手动模拟加密代码依赖的属性:
- 如果加密代码用到
window.btoa/atob,先执行这段模拟代码:var window = {}; // 用Java的Base64工具实现btoa window.btoa = function(str) { return java.util.Base64.getEncoder().encodeToString(str.getBytes('UTF-8')); }; // 实现atob window.atob = function(str) { return new String(java.util.Base64.getDecoder().decode(str), 'UTF-8'); }; - 把这段代码放在你的加密逻辑前面执行,再调用加密函数就能解决报错。
正确实现Kotlin版encryptBase64函数
自定义的encryptBase64一般不是单纯Base64编码,肯定有额外处理步骤,得精准复刻JS逻辑:
- 拆解JS步骤:先把JS加密代码拆成原子操作——比如是否先拼接固定字符串、字符编码转换、字节异或、哈希处理,再做Base64。
- 对齐细节差异:
- JS字符串默认是UTF-16编码,Kotlin默认UTF-8,要明确指定编码一致;
- JS的
Uint8Array和Kotlin的ByteArray要对应转换,注意字节顺序;
- 逐步骤复刻:比如JS里有
input.split('').reverse().join(''),Kotlin里就写input.reversed(),确保每一步输出和JS一致。
- 举个简单示例(假设JS逻辑是"输入+盐→UTF-8编码→Base64"):
import java.util.Base64 fun encryptBase64(input: String): String { val salt = "从JS代码里提取的盐值" val combinedStr = input + salt val byteArray = combinedStr.toByteArray(Charsets.UTF_8) return Base64.getEncoder().encodeToString(byteArray) } - 如果JS用了CryptoJS这类库,直接在Kotlin里用BouncyCastle等Java加密库实现相同算法就行。
调试小技巧
- 把JS代码在浏览器控制台跑一遍,逐步骤输出中间结果(比如处理后的字符串、字节数组);
- 在Kotlin代码里对应步骤也打日志,对比每一步的输出,就能快速找到哪里不一致。
内容的提问来源于stack exchange,提问作者luckcc00
相关产品推荐
相关产品推荐

