2014-11-01 83 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數組)不是一個十六進制字符串(從前面的解決方案鏈接到上面的解決方案中,從十六進制轉換爲字節數組並返回)。輸出是一個字節大小的密鑰。

這一切都假定你最終會得到一條人類可讀的消息,如果你期望一些其他的消息結構/組合,那麼你需要根據你期望找到的代碼來修改代碼。

相關問題