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:对不起,我还以为这是逆向工程这类工作,我已经改变了。我还以为钥匙是对称的,但我尝试重新应用