可能的一个字节Xor键

时间:2014-11-01 22:10:05

标签: cryptography xor encryption

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

2 个答案:

答案 0 :(得分:1)

好吧,如果密钥只是一个字节,那么只需尝试从0(0000 0000)到255(1111 1111)的所有数字

答案 1 :(得分:0)

我之前为一些8通道xor加密方案提供了answer,从而产生了编码的msg和没有密钥的结果。找到密钥以及设置和支持代码的功能如下:

//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的数组)而不是十六进制字符串(从十六进制转换为字节数组并返回上一个解决方案中存在的上一个解决方案)。输出是一个字节大小的键。

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