Javascript SJCL在Java下的Rhino中无法正常工作,而同一脚本的行为与示例PHP脚本中的预期相同

Javascript SJCL在Java下的Rhino中无法正常工作,而同一脚本的行为与示例PHP脚本中的预期相同,javascript,encryption,Javascript,Encryption,更新: 这很有效 public static void main(String[] args){ try { ScriptEngineManager mgr = new ScriptEngineManager(); List<ScriptEngineFactory> factories = mgr.getEngineFactories(); System.out.println("Available script engines:");

更新: 这很有效

public static void main(String[] args){
try {
        ScriptEngineManager mgr = new ScriptEngineManager();
        List<ScriptEngineFactory> factories = mgr.getEngineFactories();
        System.out.println("Available script engines:");
        for (int i = 0; i < factories.size(); i++) {
            ScriptEngineFactory factory = factories.get(i);

            String engine = factory.getEngineName();
            String language = factory.getLanguageName();

            System.out.println("-------------------------------------------");
            System.out.println("Language: " + language);
            System.out.println("Engine: " + engine);
            System.out.println("-------------------------------------------");
        }
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("ECMAScript");
        File script_file = new File("web/js/sjcl.js");
        Reader reader = new FileReader(script_file);
        engine.eval(reader);
        String script = "function decode(encoded_value){"
                + "var decoded_value = sjcl.decrypt('asdf',encoded_value);"
                + "return decoded_value;}"
                + "function encode(plain_text){"
                + "var encoded_value = sjcl.encrypt('asdf', plain_text);"
                + "return encoded_value;}";
        engine.eval(script);
        Invocable invocableEngine = (Invocable) engine;

        String plain_text = "admin";
        String cypher_text = (String) invocableEngine.invokeFunction("encode", plain_text);
        String plain_text_return = (String)invocableEngine.invokeFunction("decode", cypher_text);
        System.out.print("plain_text="+plain_text+"\ncypher_text=" +cypher_text + "\nplain_text_return=" + plain_text_return+"\n");
    } catch (Exception e) {
        e.printStackTrace();
    }
}
请帮忙。我现在束手无策


我正在使用SJCL加密从浏览器发送的几个请求参数,并尝试在我的Java操作类(Struts框架)中使用Rhino在服务器上运行SJCL来解密这些参数。 我正在使用sjcl.js提供的
encrypt()
decrypt()
函数,并为测试目的对密码/密钥进行硬编码。 脚本抛出一个错误,如
javax.script.ScriptException:sun.org.mozilla.javascript.internal.EvaluatorException:URI序列格式错误。
在sjcl.js代码的这部分中:
sjcl.codec.utf8String={
fromBits:函数(a){
var b=“”,c=sjcl.bitArray.bitLength(a),d,e;
对于(d=0;d>>24);

E可能是离题了,但是:在大多数情况下,JavaScript加密库不是您想要的。因为大多数编码人员希望使用它来保护发送到服务器的数据。为此,您需要SSL。如果您希望用户加密服务器无法解密的内容,则像SJCL这样的JavaScript库是必要的!至少在没有用户的情况下是这样正在发送密码。我已运行纯Java代码进行解密(0.8及更高版本,未对adata进行评估)。它使用Jackson for JSON和Bouncy Castle for CCM模式解密运行。对替代答案感兴趣吗?@nfecher我们计划在下一版本的软件中使用SSL。目前,将用户名/密码与请求一起发送似乎不太好(即使它是一个内部托管的应用程序)所以,至少在请求到达java层之前,尝试对其进行一点模糊处理。@owlstead替代答案?我正在用java开发一个与SJCL兼容的库,因此如果您继续使用java,您可能不需要Rhino。请注意,我目前感觉不太好,因此可能需要等到我发布它时,我可能会删除一些未经测试的代码不知怎么的。
ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("ECMAScript");
        String filePath = getServlet().getServletContext().getRealPath("/") + "js/sjcl.js";
        File script_file = new File(filePath);
        Reader reader = new FileReader(script_file);
        engine.eval(reader);
        String script = "function decode(encoded_value){"
                + "var decoded_value = sjcl.decrypt('asdf',encoded_value);"
                + "return decoded_value;}";
        engine.eval(script);
        Invocable invocableEngine = (Invocable) engine;
        String encoded_un = (String) request.getParameter("pass");
        String un = (String) invocableEngine.invokeFunction("decode", encoded_un).toString();