/****************************************************** 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 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=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 outStr; }