首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript中的“密码破解”

JavaScript中的“密码破解”
EN

Code Review用户
提问于 2018-03-22 00:38:12
回答 1查看 357关注 0票数 3
代码语言:javascript
复制
/**
 * Math Assignment Decoding w/o Equation
 * 
 * A simple decoder.
 * 
 * @author      RepeaterCreeper
 * @since       03/21/2018 18:08:00
 * @site        https://repeatercreeper.me
 */

var codes = [142, 92, 152, 102, 122, 62, 42, 107, 92, 152, 117, 22, 32, 92, 152, 27, 42, 77, 77, 157],
    tempA = [],
    tempB = [];

// Assigning of Letters to key
var letters = {
    1: 'A',
    2: 'B',
    3: 'C',
    4: 'D',
    5: 'E',
    6: 'F',
    7: 'G',
    8: 'H',
    9: 'I',
    10: 'J',
    11: 'K',
    12: 'L',
    13: 'M',
    14: 'N',
    15: 'O',
    16: 'P',
    17: 'Q',
    18: 'R',
    19: 'S',
    20: 'T',
    21: 'U',
    22: 'V',
    23: 'W',
    24: 'X',
    25: 'Y',
    26: 'Z',
    27: ' ',
    28: '!',
    29: '?',
    30: '@',
};

/**
 * All the equations are provided by the checkPossibleEquations function.
 * 
 * @param   {arrays}    equations       This parameter is a multidimensional array, contains pair of values.
 */
function bruteForce(equations) {
    var decodedMessage = "",
        currentEquation = 0;

    equations.forEach(function(data){
        decodedMessage += "(" + data[0] + ", " + data[1] +")[";
        for (var letterCode = 0; letterCode < codes.length; letterCode++) {
            for (var letter = 1; letter <= 30; letter++) {
                var solved = (data[0] * letter) + data[1];
                if (codes[letterCode] == solved) {
                    decodedMessage += letters[letter];
                }
            }
        }
        decodedMessage += "]";
        currentEquation += 1;
    });

    console.log(decodedMessage);
}


/**
 * Will check all possible equations, that works for AT LEAST two
 * values.
 * 
 * @return  array   Returns all equations that seem to work for TWO values.
 */
function checkPossibleEquations() {
    var possibleEquations = [];
    for (var i = 0; i < tempA.length; i++) {
        for (var j = 0; j < tempB.length; j++) {
            if (JSON.stringify(tempA[i]) == JSON.stringify(tempB[j])) {
                possibleEquations.push(tempA[i]);
            }
        }
    }

    return possibleEquations;
}

/**
 * Tries all possible combinations in the range of 1-50 and stores
 * in temporary array variable.
 * 
 * Equation: (i * letter) + k
 */
for (var i = 1; i <= 50; i++) {
    for (var k = 1; k <= 50; k++) {
        for (var letter = 0; letter < 30; letter++) {
            var encValPos = (i * letter) + k;
            // var encValNeg = i * letter - k;

            if (encValPos == codes[0]) {
                var temp = [];
                temp.push(i);
                temp.push(k);
                tempA.push(temp);
            }

            if (encValPos == codes[1]) {
                var temp2 = [];
                temp2.push(i);
                temp2.push(k);
                tempB.push(temp2);
            }
        }
    }
}

bruteForce(checkPossibleEquations());

介绍所以,这基本上是一项数学作业,但我决定为它编写一个程序,因为它将使我的生活变得容易得多。我们基本上得到了一组代码,它告诉我们要得到它的方程,它说:接近我当前的方法,因为它是线性的,它是(i *字符)+ j。基本上是循环遍历,并检查值是否匹配。如果它真的把它作为一个“可能”的等式传递进去。以后会用到的。给定

使用说明

活动1这是我的秘密信息。这一次,看看你是否可以“破解代码”,而不是我给你的编码功能。帮助提示:编码函数是一个线性函数。尝试查看编码数字之间的差异,以找到编码函数。

编码消息

51、103、75、47、91、119、135、127、47、91、23、27、127、23、127、95、75、55、31、63、39、91、95、131

字符分配

1: a,2: B,3: C,4: d,5: e,6: F,7: G,8: h,9: I,10: J,11: K,12:'L',13: M,14: n,15:'O',16:'P',17:'Q',18:'R',19:'S',20:'T',21:'U',22:'V',23:'W',24:'X',25:'Y',26:'Z',27:‘',28:'!',29:“?”30:“@”

问题

所以,在看到所有这些之后。我很确定这个脚本可以做很多改进。我已经尽我所能把它清理干净了,但这是我所能得到的。对此的回答是:“饿了吗?拿个斯尼克!”

EN

回答 1

Code Review用户

回答已采纳

发布于 2018-03-23 05:56:39

非常巧妙的项目!干得好。你是正确的,有几个改进可以作出。

  1. tempA是什么?tempB?从名称上看,我绝对没有关于数组中包含的内容的信息。把它们重命名为有用的东西。
  2. currentEquationbruteForce方法中是不使用的,去掉它。
  3. 认识到,由于你的老师给出的键可以是基于零的,并由一个数组来表示,这是很有帮助的(你得到的公式中的j将与官方的答案不同,而且你可以很容易地用一个额外的字符来填充字母数组,以避免这一点)。
  4. 避免硬编码长度。如果问题描述发生了变化,并且可能的字母数量增加了一倍,那么很容易忘记更改bruteForce中的硬编码值。
  5. 在尝试所有可能的组合的初始循环中,不需要temptemp。您可以编写tempA.push([i, k])
  6. 如果在您的环境中可用,则选择letconst而不是var
  7. 目前,代码输出的信息远远多于实际有用的信息。举个例子:ECACDCA肯定不是谜语的答案。我建议过滤方程,删除任何解码长度不等于编码长度的东西。
  8. 目前用于检查一个等式是否有效的过程很难遵循。如果您在第一次循环过程中进行检查,将更容易跟踪。

这里有一个替代的解决方案,我认为它更容易遵循。

代码语言:javascript
复制
const messages = [
  [142, 92, 152, 102, 122, 62, 42, 107, 92, 152, 117, 22, 32, 92, 152, 27, 42, 77, 77, 157],
  [51, 103, 75, 47, 91, 119, 135, 127, 47, 91, 23, 27, 127, 23, 127, 95, 75, 55, 31, 63, 39, 91, 95, 131]
];

// To avoid typing out a bunch of quotes
const letters = '❌ABCDEFGHIJKLMNOPQRSTUVWXYZ !?@'.split('');

/**
 * Helper function to fill an array from 0 to n (exclusive)
 * range(5) => [0, 1, 2, 3, 4]
 * @param n the length of the resulting array
 */
const range = n => Array.from({ length: n }).map((_, i) => i);

const limit = 50;

/*
 * If we assume codedLetter = (letter * i) + j, we can solve this equation for letter.
 * letter = (codedLetter - j) / i
 * If letter is not an integer, or is out of bounds of the letters array, the equation
 * is not valid.
 */
function solve(message) {
  console.log(`Trying to solve [${message.slice(0, 5).join(', ')}, ...]`);

  for (const i of range(limit)) {
    for (const j of range(limit)) {
      const isValidLetter = code => {
        const letter = (code - j) / i;
        return Number.isInteger(letter) && letter < letters.length && letter >= 0;
      }
  
      if (!message.every(isValidLetter)) {
        continue;
      }
  
      const decoded = message.map(code => letters[(code - j) / i]).join('');
      console.log(`(i = ${i}, j = ${j}) -> [${decoded}]`);
    }
  }
}

messages.forEach(solve)
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/190154

复制
相关文章

相似问题

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