斯坦福Javascript加密库解密

斯坦福Javascript加密库解密,javascript,Javascript,这个函数可以很好地进行加密,但是当我调用decrypt函数时,我没有得到任何消息到控制台,在我收到一个错误,说它不是JSON对象之前,所以我对它调用了JSON.parse,出于某种原因,它起了作用。加密工作如我所料 <html> <head> <script type="text/javascript" src="http://bitwiseshiftleft.github.io/sjcl/doc/symbols/src/core_random.js.html"

这个函数可以很好地进行加密,但是当我调用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>

函数stanford crypto(){
this.encrypt=函数(){
sjcl.random=新sjcl.prng(8);
sjcl.random.startCollectors();
document.body.onmousemove=函数(){
log(sjcl.random.getProgress(8));
如果(sjcl.random.isReady(8)==2){
document.body.onmousemove=“”;
sjcl.random.stopCollector();
this.keyArray=sjcl.random.randomWords(5,8);

因为(i=0;i我觉得你的方法根本上有缺陷

调用
.encrypt()
时,您正在安装一个
mousemove
事件处理程序,但该事件处理程序在
.encrypt()
方法完成后很久才会被调用

然后,您实际上在mousemove事件处理程序中进行加密(稍后会发生)

这意味着您在
之前调用了
。decrypt()
。encrypt()
甚至完成了它的工作(例如,在调用
mousemove
事件处理程序之前,因此在实际加密完成之前)


其他一些反馈意见:

  • 所有局部变量都应该在前面声明
    var
    。否则,它们将成为隐式全局变量,并且一个函数的变量很容易影响到其他函数

  • 您有一个半同步半异步的设计。您需要完全是其中一个。或者在调用加密或解密之前很久,在初始化页面时执行收集器操作,这样它们就可以是同步的(通常是同步的)或者将加密/解密逻辑更改为异步,以便它可以处理mousemove事件处理程序的异步性质

  • 考虑在代码中添加一些注释,以记录您尝试执行的操作

  • 使用
    Return
    语句从函数返回数据,而不是在全局变量中

  • 将加密函数与将数据放入DOM的函数分开。加密操作应该是泛型的,并且应该返回加密/解密的数据,调用方可以在需要时将这些数据放入DOM。如果希望函数这样做,则创建一个调用加密函数的更高级别函数,然后执行DOM操作激动


  • 我建议您学习如何在局部变量前面使用
    var
    ,否则很快就会出现意外错误。我在脚本中的两个局部变量中添加了var,谢谢。尽管问题仍然存在,但很高兴知道。