Skip to content

Update keyFinder.js #80

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Mar 21, 2019
Merged
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
166 changes: 148 additions & 18 deletions Ciphers/keyFinder.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,155 @@ Find and retrieve the encryption key automatically
Note: This is a draft version, please help to modify, Thanks!
******************************************************/
function keyFinder(str){ // str is used to get the input of encrypted string
var key = 0; // return zero means the key can not be found
var wordbank =["is","Is","am","Am","are","Are","have","Have","has","Has","may","May","be","Be"];
//var shiftNum = 0; //count the number of key shifted
var inStr = str.toString(); //convert the input to String
var outStr = ""; // store the output value
var wordInOutStr = ""; // temporary store the word inside the outStr, it is used for comparison
//document.getElementById("debug").innerHTML = shiftNum; // debug: display the shifted number(s)
for (var i=0; i<(52); i++){ //try the number of key shifted, the sum of character from a-z and A-Z is 26*2=52
outStr = caesarCipherEncodeAndDecodeEngine(inStr,i); // use the encrytpion engine to decrypt the input string, shiftNum=i
for ( var i=0; i<wordbank.length; i++){
// use a loop to find the next digit of wordbank element and compare with outStr's digit
for ( var j=0; j < wordbank[i].length; j++){
wordInOutStr += outStr[i+j];
}
// this part need to be optimize with the calculation of the number of occurance of word's probabilities
if (wordbank[i] == wordInOutStr){
key=i;
const wordbank =[" the ","The "," of "," is ","Is "," am ","Am "," are ","Are "," have ","Have "," has ","Has "," may ","May "," be ","Be "];
//let wordbankelementCounter = 0;
//let key = 0; // return zero means the key can not be found
let inStr = str.toString(); //convert the input to String
let outStr = ""; // store the output value
let outStrElement = ""; // temporary store the word inside the outStr, it is used for comparison
for (let k=0; k<26; k++){ //try the number of key shifted, the sum of character from a-z or A-Z is 26
outStr = caesarCipherEncodeAndDecodeEngine(inStr,k); // use the encrytpion engine to decrypt the input string

//loop through the whole input string
for ( let s=0; s < outStr.length; s++){

for ( let i=0; i < wordbank.length; i++){

// initialize the outStrElement which is a temp output string for comparison,
// use a loop to find the next digit of wordbank element and compare with outStr's digit
for ( let w=0; w < wordbank[i].length; w++){
outStrElement += outStr[ s + w ];
}

//console.log( k + outStrElement + wordbank[i] );//debug

// this part need to be optimize with the calculation of the number of occurance of word's probabilities
// linked list will be used in the next stage of development to calculate the number of occurace of the key
if (wordbank[i] == outStrElement){
return k; // return the key number if founded
}

outStrElement = ""; //reset the temp word

} // end for ( let i=0; i < wordbank.length; i++)

}

}
return 0; // return 0 if found nothing
}

/* this sub-function is used to assist the keyfinder to find the key */
function caesarCipherEncodeAndDecodeEngine(inStr, numShifted)
{
let shiftNum = numShifted;
let charCode = 0;
let outStr = "";
let shftedcharCode = 0;
let result = 0;

for (let i=0; i<inStr.length; i++){

charCode = inStr[i].charCodeAt();
shftedcharCode = charCode + shiftNum;
result = charCode;

if ( (charCode>=48 && charCode<=57))
{
if ( shftedcharCode < 48 ){

let diff = Math.abs(48-1-shftedcharCode)%10;

while( diff >= 10){
diff = diff%10;
}
document.getElementById("diffID").innerHTML = diff;

shftedcharCode = 57-diff;

result = shftedcharCode;
}

else if ( shftedcharCode>=48 && shftedcharCode<=57 ){
result = shftedcharCode;
}

else if ( shftedcharCode > 57 ){

let diff = Math.abs(57+1-shftedcharCode)%10;

while( diff >= 10){
diff = diff%10;
}
document.getElementById("diffID").innerHTML = diff;

shftedcharCode = 48+diff;

result = shftedcharCode;
}


}

else if ( (charCode>=65 && charCode<=90) )
{

if (shftedcharCode <=64 ){

let diff = Math.abs(65-1-shftedcharCode)%26;

while( (diff%26) >= 26){
diff = diff%26;
}
shftedcharCode = 90-diff;
result = shftedcharCode;
}

else if ( shftedcharCode>=65 && shftedcharCode<=90 ){
result = shftedcharCode;
}

else if (shftedcharCode>90 ){
let diff = Math.abs(shftedcharCode-1-90)%26;

while( (diff%26) >= 26){
diff = diff%26;
}
shftedcharCode = 65+diff;
result = shftedcharCode;
}

}

else if ( (charCode>=97 && charCode<=122))
{
if ( shftedcharCode<=96 ){

let diff = Math.abs(97-1-shftedcharCode)%26;

while( (diff%26) >= 26){
diff = diff%26;
}
shftedcharCode = 122-diff;
result = shftedcharCode;
}

else if ( shftedcharCode>=97 && shftedcharCode<=122 ){
result = shftedcharCode;
}

else if (shftedcharCode>122 ){
let diff = Math.abs(shftedcharCode-1-122)%26;

while( (diff%26) >= 26){
diff = diff%26;
}
shftedcharCode = 97+diff;
result = shftedcharCode;
}

}
outStr = outStr + String.fromCharCode(parseInt(result));
}
return key;
return outStr;
}