2014-11-01 33 views
2

我需要找到一个密钥来解密用Xor加密的东西。我知道密钥只有一个字节。我希望能够蛮力猜出正确的关键。有没有人可以指导我的可能钥匙列表。另外,密钥是十六进制还是十进制。感谢可能的一个字节异或键

+2

也许你的问题属于密码堆栈交换站点? – 2014-11-01 22:14:22

+2

如果密钥是一个字节,则可能的密钥是一个字节的可能值:0,1,2,...,254,255。什么是问题? – delnan 2014-11-01 22:22:30

+0

这个问题似乎是无关紧要的,因为它是关于密码学的,而不涉及编程本身。 – 2014-11-02 15:32:03

回答

1

好了,如果该键是只是一个字节,那么就尝试从0(0000 0000)的所有数字至255(1111 1111)

0

我提供了一种answer先前针对一些8通道XOR加密方案产生来自编码味精和无键的结果。与设置和支持代码一起找出关键的功能如下:

//setup a table of readable characters (characters we will expect to see in the decrypted result). 
var readableCharacters=Object.create(null); 
var alphanumerics=[[0x30,0x39],[0x41,0x5a],[0x61,0x7a]]; 
var alphabetical=[[0x41,0x5a],[0x61,0x7a]]; 
alphanumerics.forEach(function(range){ 
    var indexStart=range[0]; 
    var indexEnd=range[1]; 
    for (var i=indexStart; i<=indexEnd; i++){ 
    var ch=String.fromCharCode(i); 
    readableCharacters[ch]=1; 
    } 
}); 
//add some extra characters to the table (optional) 
(" ,.;:!\"'").split("").forEach(function(ch){readableCharacters[ch]=1;}); 

//xor decryption 
function dec(nkey,ncrypt){ 
    var ndec=nkey^ncrypt; 
    return ndec; 
} 

//find a key candidate by determining which keys correspond to the highest occurance of characters found in the readable character lookup table. 
function findKeyCandidate(byteArray){ 
    var keyResults=[]; 
    for (var key=0; key<256; key++){ 
    keyResults[key]=0; 
    byteArray.forEach(function(ncrypt){ 
     var ndec=dec(key,ncrypt); 
     var dchar=String.fromCharCode(ndec); 
     if(readableCharacters[dchar]){ 
     keyResults[key]++; 
     } 
    }); 
    } 
    keyResults=keyResults.map(function(count,index){ 
    return {key:index,count:count}; 
    }); 
    keyResults.sort(function(a,b){ 
    return a.count-b.count; 
    }); 
    return keyResults.pop().key; 
} 

注:输入你需要一个实际的字节数组(即编号0-255数组)不是一个十六进制字符串(从前面的解决方案链接到上面的解决方案中,从十六进制转换为字节数组并返回)。输出是一个字节大小的密钥。

这一切都假定你最终会得到一条人类可读的消息,如果你期望一些其他的消息结构/组合,那么你需要根据你期望找到的代码来修改代码。

相关问题