这个函数可以正常加密但是当我调用decrypt函数时,我没有得到任何东西到控制台,在我收到错误说它不是JSON对象之前,所以我在它上面调用JSON.parse并且一些有效的原因。加密工作正如我所料。
<html>
<head>
<script type="text/javascript" src="http://bitwiseshiftleft.github.io/sjcl/doc/symbols/src/core_random.js.html"></script>
<script type="text/javascript" src="sjcl/sjcl.js"></script>
<script>
function StanfordCrypto(){
this.encrypt = function(){
sjcl.random = new sjcl.prng(8);
sjcl.random.startCollectors();
document.body.onmousemove = function() {
console.log(sjcl.random.getProgress(8));
if(sjcl.random.isReady(8) === 2) {
document.body.onmousemove = "";
sjcl.random.stopCollectors();
this.keyArray = sjcl.random.randomWords(5,8);
for(i=0;i<this.keyArray.length;i++){
this.key += this.keyArray[i];
}
this.encryptedData = sjcl.encrypt(this.key+"dlksdhaslkhdewrhewuiryewio","Test");
document.getElementById("crypto").innerHTML += this.encryptedData;
}
};
};
this.decrypt = function(){
decryptedData = sjcl.decrypt(this.key+"dlksdhaslkhdewrhewuiryewio",this.encryptedData);
alert(decryptedData);
document.getElementById("crypto").innerHTML += "<br/>" + decryptedData;
};
}
function initiate(){
encryption = new StanfordCrypto();
encryption.encrypt();
encryption.decrypt();
}
</script>
</head>
<body onload="initiate();"><h1>It works!</h1>
<p>This is the default web page for this server.</p>
<p>The web server software is running but no content has been added, yet.</p>
<div style="break-word:normal;" id="crypto"></div>
</body>
网址:beef.nerdsville.net
答案 0 :(得分:0)
你的方法对我来说根本就是有缺陷的。
在调用.encrypt()
时,您正在安装mousemove
事件处理程序,但该事件处理程序在.encrypt()
方法完成很久之后才会被调用。
然后,您实际上在mousemove事件处理程序中执行加密(稍后会发生这种情况)。
这意味着您在.decrypt()
完成工作之前(例如在调用.encrypt()
事件处理程序之前调用mousemove
之前就已经调用var
实际加密已经完成。
其他一些反馈意见:
所有局部变量都应在其前面用return
声明。否则,它们就会成为隐含的全局变量,而一个函数的变量很容易在其他变量上出现。
您的设计是半同步和半异步。你需要完全是一个或另一个。在任何加密或解密调用之前很久就会对页面进行初始化时收集器的内容,以便它们可以同步(通常是这样)或者将加密/解密逻辑更改为异步,这样它就可以处理mousemove事件的异步性质处理程序。
考虑在代码中添加一些注释,以记录您尝试做的事情。
使用{{1}}语句从函数返回数据,而不是全局变量。
将加密函数与将数据放入DOM的函数分开。加密操作应该是通用的,并且应该返回加密/解密数据,然后调用者可以根据需要将其放入DOM中。如果你想要一个函数来做那个,那么创建一个更高级别的函数来调用crypto函数,然后进行DOM操作。