Home  >  Article  >  Web Front-end  >  JavaScript implementation of Vigenere cryptographic algorithm example_javascript skills

JavaScript implementation of Vigenere cryptographic algorithm example_javascript skills

WBOY
WBOYOriginal
2016-05-16 17:13:112305browse

Traditional encryption technologies cannot play a big role in today's network security, but they will be introduced at the beginning of every book about cryptography, because they are the basis of cryptography and the history of cryptography. Almost every cryptography book in the chapter about the Vigenere cipher will have a "Vigenere Substitution Table" user explaining the Vigenere cipher mechanism:

JavaScript implementation of Vigenere cryptographic algorithm example_javascript skills

The encryption process is very simple, that is, given the key letter x and the plaintext letter y, the ciphertext letter is the letter located in the x row and y column. This determines that encrypting a message requires a key string as long as the message. Typically, the key string is a repetition of the key word.
Using the example in "Cryptography and Network Security - Principles and Practice" as an example in this article. For example, if the key word is deceptive and the message is "we are discovered save yourself", then the encryption process is as follows:

Copy code The code is as follows:

deceptivedeceptivedeceptive(key string)
wearediscoveredsaveyourself( Message)
ZICVTWQNGRZGVTWAVZHCQYGLMGJ (ciphertext)

How did you get the first letter "Z" in the ciphertext? From the Vigenere substitution table, the letter with "d" in the key string as the row and "w" in the message as the column is "Z".

Using the lookup table method to encrypt a few times, you can easily summarize the rules: number A~Z from 0~25, then the encryption process is to find the message letters in the first row of the substitution table, such as "w", and then move backward d (that is, 3) times, the resulting letter is the ciphertext. If the count reaches the end, the next shift will continue from the beginning (i.e. A). In other words, A~Z can be regarded as a ring. The encryption process is to shift the pointer in a specific direction of the ring after determining the message letter. The number of times is the number represented by the key letter. This is actually a modulo 26 process.
To expand, the above encryption can only encrypt 26 letters and is not case-sensitive. But in fact, in addition to letters, English also has punctuation marks and spaces. If most English characters are taken into account, the Vigenere substitution table will be relatively large and a bit of a waste of space. If it is assumed that there are N characters that can be encrypted, and if these N characters are built into a ring, then the encryption process is a process modulo N, that is, C(i)=(K(i) P(i))modN, where K, C, and P represent the key space, ciphertext space, and message (plaintext) space respectively.
Some people on the Internet have implemented this encryption algorithm in C, and almost all of them use the lookup and substitution table method. Although the substitution table can be generated programmatically, the generated substitution table is too regular. I implemented the following using Javascript, using the module method. It feels more flexible and definitely takes up less space (the time efficiency has not yet been estimated)

Copy code The code is as follows:

var Vigenere = {
_strCpr: 'abcdefghijklmnopqrstuvwxyz_12345 67890.ABCDEFGHIJKLMNOPQRSTUVWXYZ',//You can disrupt the order of this string or add more characters
_strKey: function(strK,str ){//Generate key string, strK is the key, str is the plaintext or ciphertext
var lenStrK = strK.length;
var lenStr = str.length;
if(lenStrK != lenStr ) {// If the key length is different from STR, you need to generate a key string. Key string
while(lenStrK < lenStr){
strK = strK strK;
lenStrK = 2 * lenStrK;
}
}//At this time, the length of the key string Greater than or equal to the length of str
                                                                                                                                                                  using         using         using       using   using   using     using     using   using   using   using   using using using using   through using using using out through out out through out out out out out out out through out out outallow out's ’ s ’ through ’ through ‐ to ‐ ‐ ‐ n r r‐ and 🎜>}

Vigenere.lenCpr = Vigenere._strCpr.length;

Vigenere.Encrypt = function(K,P){//Encryption algorithm, K is the key, P is the plaintext
K = Vigenere._strKey(K,P);

var lenK = K.length ;

var rlt = '';

var loop = 0;

for(loop=0; loop var iP = Vigenere._strCpr.indexOf(P.charAt( loop));
if(iP==-1) return 'This algorithm cannot currently encrypt the character: 'P.charAt(loop)';
var iK = Vigenere._strCpr.indexOf(K. charAt(loop));
if(iK==-1) return 'The key contains illegal characters:' K.charAt(loop);
var i = (iP iK) % Vigenere.lenCpr;
rlt = rlt Vigenere._strCpr.charAt(i);
}
return rlt;
};

Vigenere.DisEncrypt = function(K,C){
K = Vigenere._strKey(K,C);
var lenK = K.length;
var rlt = '';

var loop = 0;

for(loop=0; loop var iK = Vigenere._strCpr.indexOf(K.charAt(loop));
if(iK==- 1) return 'The key contains illegal characters:' K.charAt(loop); var iC = Vigenere._strCpr.indexOf(C.charAt(loop));
if(iK > iC){
rlt = Vigenere._strCpr.charAt(iC Vigenere.lenCpr - iK);
}
else{
rlt = Vigenere._strCpr.charAt(iC - iK);
}
}
return rlt;
};


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn