首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解复杂的javascript密码算法

理解复杂的javascript密码算法
EN

Stack Overflow用户
提问于 2014-08-26 06:20:55
回答 1查看 543关注 0票数 0

这是一个javascript练习,我需要知道什么是正确的密码。你能理解吗?它把我逼疯了!

是否需要将该值与生成的字节码进行比较?

我想当正确的密码猜到“祝贺!”信息会弹出来的。

代码语言:javascript
复制
<script type="text/javascript">
</script>
Password: <input /><br />
<button>Check</button>

<script id="urchin">

(function() {
  var h = [
  function() {alert("booo")},
  function() {alert(":(")},
  function() {alert("Congratz!")},
  function() {alert("almost there")},
  function() {alert("alert(b[a]);")},
  function() {alert("nahh")},
  function() {alert("not even close")}
  ]
  var g = function(d) {
    var a, f, e, g, k, b = [];
    for(a = 0;256 > a;a++) {
      b[a] = a
    }
    f = "click"
    e = 0;
    d = "input";
    g = document[("getElementsByTagName")]("input")["0"][("value")];
    for(a = 0;256 > a;a++) {
      e = (e + b[a] + f.charCodeAt(a % f[("length")])) % 256, b[a] ^= b[e], b[e] ^= b[a], b[a] ^= b[e]
    }
    a = e = 0;
    f = "";
    for(k = a;k < g.length;k += 2) {
      a = (a + 1) % 256
      e = (e + b[a]) % 256
      b[a] ^= b[e]
      b[e] ^= b[a]
      b[a] ^= b[e]



      f += String[("fromCharCode")](parseInt(g[("substr")](k, 2), 16) ^ b[(b[a] + b[e]) % 256])
    }
    a = f["charCodeAt"](f[("charCodeAt")](0) % f.length) % 6;
    f != d + 256 && 2 == a && a++;
    h[a]()
  }
  var d = document[("getElementsByTagName")]("button")["0"];
  typeof d.addEventListener != typeof g ? d.attachEvent("onclick", g) : d[("addEventListener")]("click", g, !0);

  d = document[("getElementById")]("urchin");
  d[("parentNode")].removeChild(d);
  c = function() {}
})();
</script>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-27 16:25:41

正确的密码是956918b1820bc657

裂纹本质上是RC4。

下面使用键RC4初始化click键表,将结果存储在b

代码语言:javascript
复制
var a, f, e, g, k, b = [];
for(a = 0;256 > a;a++) {
  b[a] = a
}
f = "click"
e = 0;
d = "input";
g = document[("getElementsByTagName")]("input")["0"][("value")];
for(a = 0;256 > a;a++) {
  e = (e + b[a] + f.charCodeAt(a % f[("length")])) % 256, b[a] ^= b[e], b[e] ^= b[a], b[a] ^= b[e]
}

接下来使用b进行加密/解密,在从十六进制转换输入后,将结果存储在f中。

代码语言:javascript
复制
a = e = 0;
f = "";
for(k = a;k < g.length;k += 2) {
  a = (a + 1) % 256
  e = (e + b[a]) % 256
  b[a] ^= b[e]
  b[e] ^= b[a]
  b[a] ^= b[e]
  f += String[("fromCharCode")](parseInt(g.substr(k, 2), 16) ^ b[(b[a] + b[e]) % 256])
}

最后,将解密后的字符串与input256进行了比较。a只是一个校验和。

要逆转这一过程,只需使用input256加密rc4,然后将其转换为十六进制。

欢迎您将这篇文章发布到crackmes.decrackmes.us,并列举它的来源。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25499288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档