Javascript 反向解密算法

Javascript 反向解密算法,javascript,cryptography,reverse,Javascript,Cryptography,Reverse,我很难逆转这个算法: decrypt_algorithm = function (text) { var parser = new TextParser(text); var decrypt_key = [16, 19, 17, 7, 20, 23, 13, 1, 24, 15, 6, 12, 0, 18, 21, 2, 9, 14, 3, 10, 5, 25, 8, 4, 22, 11]; var text_size = parser.getSize(); var text_s

我很难逆转这个算法:

decrypt_algorithm = function (text) {
  var parser = new TextParser(text);
  var decrypt_key = [16, 19, 17, 7, 20, 23, 13, 1, 24, 15, 6, 12, 0, 18, 21, 2, 9, 14, 3, 10, 5, 25, 8, 4, 22, 11];
  var text_size = parser.getSize();
  var text_size_without_last_part = text_size - 26;
  var output = [];
  if (text_size_without_last_part > 0) {
      for (var m = 0; m < text_size_without_last_part; m += 26) {
          var word_to_decrypt = [];
          for (var k = 0; k < 26; k++) {
              word_to_decrypt[k] = parser.readNextChar()
          }
          for (var k = 0; k < 26; k++) {
              output[m + k] = word_to_decrypt[decrypt_key[k]]
          }
      }
      var parser_position = parser.getPosition();
      var last_part_size = text_size - text_size_without_last_part - 1;
      if (last_part_text > 0) {
          for (var k = 0; k < last_part_size; k++) {
              output[text_size_without_last_part + k] = parser.readNextChar()
          }
      }
  }
  return output;
};
decrypt_算法=函数(文本){
var parser=newtextparser(text);
var decrypt_key=[16,19,17,7,20,23,13,1,24,15,6,12,0,18,21,2,9,14,3,10,5,25,8,4,22,11];
var text_size=parser.getSize();
var text\u size\u不带最后一部分=text\u size-26;
var输出=[];
如果(文本大小不带最后部分>0){
对于(变量m=0;m0){
对于(变量k=0;k
我没有任何逆向工程的知识,所以如果你能给我指一些资源来解释如何“逆向”一个函数,这将是非常有帮助的

我不需要确切的代码作为答案,但是我非常感谢一些关于如何自己进行反向工程的指南

编辑1:

在停顿了一下并思考了一下算法之后,我理解了这个问题,而且比我想象的要简单:

output[decrypt_key[k]=word_to_decrypt[m+k]


更改此选项将还原算法,从而解决问题。

您不需要对其进行反向工程:您已经拥有JavaScript源代码。该算法看起来足够简单(只有两个嵌套循环)——只要使用调试器单步执行它,就会发现“键”与任何给定输入的关系


该算法看起来是对称的,因此一旦您了解了密钥的作用(看起来它只是根据密钥将字符串中的字符混洗),就可以派生加密函数。

您不需要对其进行反向工程:您已经有了JavaScript源代码。该算法看起来足够简单(只有两个嵌套循环)——只要使用调试器单步执行它,就会发现“键”与任何给定输入的关系


该算法看起来是对称的,因此一旦您了解了密钥的作用(看起来它只是根据密钥将字符串中的字符混洗),就可以导出加密函数。

这是一种简单的置换密码。本质上,
解密密钥
用于重新排列输出

output[m + k] = word_to_decrypt[decrypt_key[k]]


decrypt_key = [16, 19, 17, 7, 20, 23, 13, 1, 24, 15, 6, 12, 0, 18, 21, 2, 9, 14, 3, 10, 5, 25, 8, 4, 22, 11];
或者,重新排列:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 16 16 17 18 19 20 21 22 23 24 25
代码

word_to_decrypt[decrypt_key[k]]
本质上是将索引放入被“加密”的代码中,并将其单词分成26块

您可以将其视为根据“键”对单词进行置乱,这会告诉您如何对其进行置乱

e、 g,

这意味着第一个单词(位置0)放在位置16,位置16的单词放在位置9

另一个术语是称之为洗牌密码。它以一种非常可预测的方式把所有的单词都搅乱了

只要您知道
decypher\u密钥
和密码类型,您就可以非常轻松地恢复数据,就像您可以使用一副牌一样,如果您确切知道它们是如何洗牌的(因为它不是真正随机的)

要生成逆密码,必须创建相反的密钥。如果位置0转到16,则意味着位置16必须转到0。对数组中的每个数字执行此操作,并形成一个名为“encrypt_key”的新数组,然后您就有了一种加密单词的方法,这些单词可以用您给出的代码正确解密


Lua代码:

function printarray(arr) local s = '[' for k,v in pairs(arr) do s = s..tostring(v)..', '  end s = s:sub(1,-3)..']' return s end
function permute(arr, key) local newarr = {}; for i = 1, #key do newarr[i] = arr[key[i]] end return newarr end

letters = {'a','b','c','d','e'};
key = {5, 1, 3, 4, 2};
invkey = {}
newletters = permute(letters, key)
print('input:  '..printarray(letters))
print('key:    '..printarray(key))
print('output: '..printarray(newletters))


for i = 1, #key do
    for j = 1, #key do
        if i == key[j] then
            invkey[i] = j;
            break;
        end
    end
end;

newletters2 = permute(newletters, invkey)
print('\nInverse Permutation')
print('input:  '..printarray(newletters))
print('key:    '..printarray(invkey))
print('output: '..printarray(newletters2))
输出:

input:  [a, b, c, d, e]
key:    [5, 1, 3, 4, 2]
output: [e, a, c, d, b]

Inverse Permutation
input:  [e, a, c, d, b]
key:    [2, 5, 3, 4, 1]
output: [a, b, c, d, e]

这是一个简单的置换密码。本质上,
解密密钥
用于重新排列输出

output[m + k] = word_to_decrypt[decrypt_key[k]]


decrypt_key = [16, 19, 17, 7, 20, 23, 13, 1, 24, 15, 6, 12, 0, 18, 21, 2, 9, 14, 3, 10, 5, 25, 8, 4, 22, 11];
或者,重新排列:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 16 16 17 18 19 20 21 22 23 24 25
代码

word_to_decrypt[decrypt_key[k]]
本质上是将索引放入被“加密”的代码中,并将其单词分成26块

您可以将其视为根据“键”对单词进行置乱,这会告诉您如何对其进行置乱

e、 g,

这意味着第一个单词(位置0)放在位置16,位置16的单词放在位置9

另一个术语是称之为洗牌密码。它以一种非常可预测的方式把所有的单词都搅乱了

只要您知道
decypher\u密钥
和密码类型,您就可以非常轻松地恢复数据,就像您可以使用一副牌一样,如果您确切知道它们是如何洗牌的(因为它不是真正随机的)

要生成逆密码,必须创建相反的密钥。如果位置0转到16,则意味着位置16必须转到0。对数组中的每个数字执行此操作,并形成一个名为“encrypt_key”的新数组,然后您就有了一种加密单词的方法,这些单词可以用您给出的代码正确解密


Lua代码:

function printarray(arr) local s = '[' for k,v in pairs(arr) do s = s..tostring(v)..', '  end s = s:sub(1,-3)..']' return s end
function permute(arr, key) local newarr = {}; for i = 1, #key do newarr[i] = arr[key[i]] end return newarr end

letters = {'a','b','c','d','e'};
key = {5, 1, 3, 4, 2};
invkey = {}
newletters = permute(letters, key)
print('input:  '..printarray(letters))
print('key:    '..printarray(key))
print('output: '..printarray(newletters))


for i = 1, #key do
    for j = 1, #key do
        if i == key[j] then
            invkey[i] = j;
            break;
        end
    end
end;

newletters2 = permute(newletters, invkey)
print('\nInverse Permutation')
print('input:  '..printarray(newletters))
print('key:    '..printarray(invkey))
print('output: '..printarray(newletters2))
输出:

input:  [a, b, c, d, e]
key:    [5, 1, 3, 4, 2]
output: [e, a, c, d, b]

Inverse Permutation
input:  [e, a, c, d, b]
key:    [2, 5, 3, 4, 1]
output: [a, b, c, d, e]

你说的逆向工程是什么意思?您是否只想反转算法并编写加密函数?因为我不会用“反向工程”这个术语来阅读和理解一段代码。我想反向算法,我想它也被称为反向工程。我会这样改变标签@JimLewis:对不起,我还以为这也是逆向工程这种工作,我已经改变了。你说的逆向工程是什么意思?您是否只想反转算法并编写加密函数?因为我不会用“反向工程”这个术语来阅读和理解一段代码。我想反向算法,我想它也被称为反向工程。我会这样改变标签@JimLewis:对不起,我还以为这是逆向工程这类工作,我已经改变了。我还以为钥匙是对称的,但我尝试重新应用