簡體   English   中英

解釋維吉尼亞密碼的功能

[英]Explaining functions of Vigenère cipher

我在http://rosettacode.org 上找到了 Vigenère 密碼的以下代碼,我想更好地理解它。

有人能解釋一下function ordA(a)function(a)的單行代碼是做什么的嗎?

function ordA(a) {
  return a.charCodeAt(0) - 65;
}

// vigenere
function vigenere2(text, key, decode) {
  var i = 0, b;
  key = key.toUpperCase().replace(/[^A-Z]/g, '');
  return text.toUpperCase().replace(/[^A-Z]/g, '').replace(/[A-Z]/g, function(a) {
    b = key[i++ % key.length];
    return String.fromCharCode(((ordA(a) + (decode ? 26 - ordA(b) : ordA(b))) % 26 + 65));
  });
}

我不確定這是否應該是示例代碼,但它主要展示了如何不編程。 聰明的決定,正在作出,但很明顯的問題分解,變量的命名和文檔很不理想了很多。 重復的代碼、錯綜復雜的行、無法解釋的代碼片段,不勝枚舉。 Decode 是一個布爾值,但加密的反面是解密而不是解碼。 這段代碼是為了明白發生了什么; 在這方面,它在 Rosetta 網站上所做的事情令人難以置信。


返回英文字母表或 ABC 中的索引,假設為大寫字符,0 到 25 而不是 1 到 26(因為您可以使用零索引進行模塊化計算,而不是使用基於一個的索引)

return a.charCodeAt(0) - 65;

函數定義采用明文或密文、一個可能小於明文的密鑰和一個布爾值來指示我們是在編碼還是解碼

function vigenere2(text, key, decode) 

明文中的索引和變量 b,它將保存索引的鍵的字符

var i = 0, b;

將鍵轉換為大寫並刪除所有不在大寫字母中的字符

key = key.toUpperCase().replace(/[^A-Z]/g, '');

這條線顯然太長了; 它將文本轉換為大寫並再次刪除非字母字符

然后它替換使用的第二個參數中定義的功能的字符串中的字符replace

return text.toUpperCase().replace(/[^A-Z]/g, '').replace(/[A-Z]/g, function(a) {

以循環方式獲取鍵的下一個字符,使用模數運算符,然后更新索引

b = key[i++ % key.length];

這里發生的事情太多,程序分解非常糟糕; 按執行順序:

  • (decode ? 26 - ordA(b) : ordA(b)) :計算范圍內的一個數字來更新明文字符的索引; 使用相反的值進行解密(此處錯誤地稱為“解碼”)
  • (ordA(a) + (decode ? 26 - ordA(b) : ordA(b))) % 26用計算出的數字執行加法,減少到 0 到 25(即當達到 Z 時繼續 A,反之亦然)
  • ((ordA(a) + (decode ? 26 - ordA(b) : ordA(b))) % 26 + 65)加上 65,所以索引被轉換回大寫字符的 ASCII 索引,使用兩個完全虛假的括號
  • 最后,從一個字符代碼結果返回一個字符串,否則 + 將是加法而不是串聯
return String.fromCharCode(((ordA(a) + (decode ? 26 - ordA(b) : ordA(b))) % 26 + 65));

好吧,它需要結束

  });
}

讓我們展示另一種編程方式,使用命名良好的變量、用於重用代碼的函數和非常需要名稱來解釋其功能的正則表達式。

 var ALPHABET_SIZE = 'Z'.charCodeAt(0) - 'A'.charCodeAt(0) + 1; var encrypted = vigenere(false, "B", "Zaphod Breeblebox"); document.body.append('<div>' + encrypted + '</div>'); var decrypted = vigenere(true, "B", encrypted); document.body.append('<div>' + decrypted + '</div>'); function vigenere(decrypt, key, text) { key = toJustUppercase(key); text = toJustUppercase(text); var textOffset = 0; // iterate over all characters, performing the function on each of them return text.replace(/[AZ]/g, function(textChar) { var keyChar = key[textOffset++ % key.length]; var cryptedChar = substituteCharacter(decrypt, keyChar, textChar); return cryptedChar; }); } function substituteCharacter(decrypt, keyChar, textChar) { var keyIndex = charToABCIndex(keyChar); if (decrypt) { // create the opposite of the encryption key index keyIndex = ALPHABET_SIZE - keyIndex; } var textIndex = charToABCIndex(textChar); // the actual Vigenere substitution, the rest is just indexing and conversion var substitutedIndex = (textIndex + keyIndex) % ALPHABET_SIZE; var substitutedChar = abcIndexToChar(substitutedIndex); return substitutedChar; } function toJustUppercase(text) { return text.toUpperCase().replace(/[^AZ]/g, '') } function charToABCIndex(charValue) { return charValue.charCodeAt(0) - 'A'.charCodeAt(0); } function abcIndexToChar(index) { return String.fromCharCode(index + 'A'.charCodeAt(0)); }

你說的功能太多? 不是真的,我還沒有實現ordchr ,或者vigenereEncryptviginereDecrypt以使其更易於閱讀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM