-5

我想知道是否可以就如何分析算法获得一些帮助,我的老师给了我们一些字符串的验证码。和out project是我们必须为这个验证器创建一个keygen,当然,它在验证时必须是真的。我一直在尝试蛮力,但我没有运气,它已经工作了 2 小时。现在,所以任何关于如何解决这个问题的帮助、想法或提示都是完美的。

提前致谢。

这是验证器的代码:

function char2number(chr) {
        var code = chr.charCodeAt(0); 
        if(code<65) code = code-48; 
        else {
             code=code-65+10; 
             if(code>=11) code++;
             if(code>=22) code++; 
             if(code>=33) code++; 
        } 
        return code; 
}

function checkdata(code) { 
        var dig = 0; 
        var test = 1; 
        for(var i=0; i<code.length-1;i++) { 
                dig=dig+(char2number(code.charAt(i))*test);   
                test*=2; 
         } 
        dig = mod(dig,9); 
        if(dig==code.charAt(code.length-1)) return true; 
        else return false; }

 function mod(X,Y) { var t; t = X % Y; return t < 0 ? t + Y : t; }

function valida() {
        var codigo = document.getElementById("code").value;
        // Validate the code
        if( code == "" || code.length < 15 ) {
           alert("Invalid!");
           return false;
        }
        if( ! checkdata(code.toUpperCase()) ) {
           alert("Invalid!");
           return false;
        }

这段代码是用 Javascript 编写的,因为我们必须用 Python 详细说明我们的解决方案,并从 Python 调用服务进行验证。我不认为编写代码很难,但我一直在思考解决这个问题的方法,但我找不到让它工作的模式。

谢谢大家!

4

1 回答 1

2

好的,里面发生了checkdata什么?好吧,无论它在结束前做什么,在dig = mod(dig, 9)它得到一个从 0 到 8 的数字之后,它都会将它与最后一个字符 ( code.charAt(code.length-1))) 进行比较。请注意,for上面的循环执行i<code.length-1而不是i<code.length,因此最后一个字符不包括在计算中。而且(除了检查长度 15+)这里没有其他事情发生。

因此,您甚至不必了解整个for循环在做什么。如果您可以生成 14 个或更多随机字符,在它们上运行完全相同的代码,并将结果附加到末尾,它就会通过。

一种快速而肮脏的方法是在结束之前添加一个alert(或者,也许更好,console.log在节点而不是浏览器中使用和运行......),然后checkdata向您展示什么dig是:

function checkdata(code) { 
  var dig = 0; 
  var test = 1; 
  for(var i=0; i<code.length-1;i++) { 
    dig=dig+(char2number(code.charAt(i))*test);
    test*=2;
  }
  dig = mod(dig,9);
  alert(dig);
  if(dig==code.charAt(code.length-1)) return true; 
  else return false;}

所以现在,取一些 15 个或更多字符的随机字符串,比如“ABC123DEF456GHI789”。会弹出一个警报说“2”,它会失败,因为 2 和 9 不一样。所以只需使用“ABC123DEF456GHI782”,它就会通过。

现在您所要做的就是将该checkdata函数移植到 Python,将 更改alert(dig)return code[:-1] + dig,编写代码以生成 15 个字符的随机字符串,当然还要编写调用该服务的代码。但就是这样。

顺便说一句,移植到 Python 并不总是看起来那么简单。例如:

  • JS,2是一个64位的浮点数;Python2是一个无限位整数。
  • JS 字符串是 Unicode;Python 2.x 字符串不是(但 3.x 是)。
  • 某些浏览器中的 JS 字符串实际上是 UTF-16,而不是 Unicode。
  • JS%是保符号的;Python%总是积极的。

幸运的是,为了编写一个注册机,你可以生成一些不会超出这些东西的限制的东西,但是你应该仔细考虑以确保你这样做。

我应该补充一点,您的老师可能希望您了解循环内部发生的事情for,而不是将其视为黑匣子。此外,在现实生活中,无论谁编写了这个愚蠢的算法,都会弄清楚你是如何破解它的,然后做一个微不足道的更改,至少部分地理解循环是必要的(例如,如果他们将 更改<code.length-1<code.length)。

于 2012-12-28T23:08:40.250 回答