首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自.charCodeAt()的ROT13密码?

来自.charCodeAt()的ROT13密码?
EN

Stack Overflow用户
提问于 2016-04-29 23:55:00
回答 3查看 1.5K关注 0票数 0

我是javascript的新手,这是Basic Algorithm Scripting.I的最后一门课程。我正在尝试理解这行代码,因为我从免费代码阵营获得了前端开发证书的下一部分,我想了解一切。我一直在寻找解决方案,并找到了这个。我理解评论上的一些行,但我有一个很难理解的公式,这个代码100%工作,但我只需要一些进一步的理解。代码如下:

代码语言:javascript
复制
function rot13(str) {

  //retCharArray is an Array of character codes for the solution
  var rotCharArray = [];

  //regular expression for all upper case letter from A to Z
  var regEx = /[A-Z]/;

  //split str into a character array
  str = str.split("");

  for (var x in str) { //iterate over each character in the array
    //regEx.test(str[x]) will return (true or false) if it maches the regEx or not
    if (regEx.test(str[x])) {
      // A more general approach
      // possible because of modular arithmetic 
      // and cyclic nature of rot13 transform

      // I DON'T CLEARLY UNDERSTAND THIS CODE BELOW
      rotCharArray.push((str[x].charCodeAt() - 65 + 13) % 26 + 65);
    } else {
      rotCharArray.push(str[x].charCodeAt());
    }
  }
  //make a string with character codes from an array of character codes
  str = String.fromCharCode.apply(String, rotCharArray);
  return str;
}

// Change the inputs below to test
rot13("SDASasd");

EN

回答 3

Stack Overflow用户

发布于 2016-05-01 17:22:09

上面的两个答案在这里回答了你的问题的一半,但他们并没有真正看到你的问题,那就是为了回答自由代码营挑战,你必须离开并理解caesar密码和ROT13算法背后的数学原理。我对此也有问题。

让我们一起来看一下,然后一步一步地复习一下。(我不理解不是每个人在高中都学过这个--我没有!):

代码语言:javascript
复制
  // I DON'T CLEARLY UNDERSTAND THIS CODE BELOW
  rotCharArray.push((str[x].charCodeAt() - 65 + 13) % 26 + 65);
} else {
  rotCharArray.push(str[x].charCodeAt());
}

@basos.sergio和@caulitomaz的答案都有帮助,但它们只解释了部分原因,并没有为您提供进一步的研究:

@basos.sergio的

“获取26的模数(这可确保编码不会加密到'Z‘字母以上的任何内容,例如'Z’字母将转换为(90-65+13) % 26 + 65) = 77 'M‘字母。本质上,它将使加密算法循环到开头。”

@caulitomaz's

在英文字母表中有26个字符。这就是为什么应用13的循环旋转,然后应用模运算的原因。

他们在这里都指的是“模算术”:

模算术表明,一些数字是“同余”的,即当对它们应用模运算时,它们共享相同的余数。

例如,2%12,14%12,26%12=余数2。这样,当你的数字必须出现在一个范围内,或者一个设备只显示一个范围内的数字时,你就可以计算出那个数字“循环回来”的位置。

请注意,在我的示例中,使用了% 12 -这是12小时时钟可以显示的总小时数。所以如果是凌晨2点,我想知道12小时后的时间,我会加上12,但是我的时钟不能显示14:00 (不是12小时模式)。模12给了我实时的时间。

例如:现在是凌晨4点我的飞机延误了29个小时(这是一家糟糕的航空公司)。如何计算新的起飞时间?4+ 29 % 12 =上午9点(如果延迟小于24,我需要交换am/pm,但您应该了解情况。)

ROT13

这里我们有一个使用ROT 13的旋转密码的特殊情况,其中应用两次密码将得到要编码的原始字符,因为字母表只有26个字符,而13恰好是26的一半。

x= ROT13(ROT13(x))

因此,实际上,我们不需要担心在应用或反转加密时添加13或减去13,我们只需再次应用它来获得原始加密。

那么,算法是如何工作的呢

  1. 已经指出,大写字母A-Z的字符代码在65 (A)到90 (Z)的范围内。但我们希望使用模运算来找出新字母0-26的范围。所以从目标字母的字符代码中减去65 : strx.charCodeAt() -65
  2. 应用密码:加上13

(strx.charCodeAt() - 65 +13)

  • 应用模数来查找已“循环”的字母。对我们来说是% 26 (字母表中的字符数):

(strx.charCodeAt() - 65 + 13) %26

  • 将65加回去,这样我们就有了一个范围为65...90的字符代码

(strx.charCodeAt() - 65 + 13) % 26 + 65)

工作示例:

ROT13(X)

代码语言:javascript
复制
'X'.charCodeAt(0) = 88

- 65 = 23 

+ 13 = 36

%26 = 10 

+65 = 75 

charCodeFrom(75) = K

ROT13(K)

代码语言:javascript
复制
'K'.charCodateAt(0) = 75

- 65 = 10

+ 13 = 23

%26 = 23

+65 = 88

charCodeFrom(88) = X

来源:

http://betterexplained.com/articles/fun-with-modular-arithmetic/ https://www.khanacademy.org/computing/computer-science/cryptography/modarithmetic/a/what-is-modular-arithmetic

票数 3
EN

Stack Overflow用户

发布于 2016-04-30 00:28:25

由于您仅使用大写字符,因此您需要了解您正在使用的字符代码范围。大写字母'A‘对应于65。

'A'.charCodeAt(0)返回65

您的最大值是'Z',它对应于90

在英文字母表中有26个字符。这就是为什么应用13的循环旋转,然后应用模运算的原因。

要检索正确的charCode,需要在结果中再次添加65。

rotCharArray.push((str[x].charCodeAt() - 65 + 13) % 26 + 65);

票数 1
EN

Stack Overflow用户

发布于 2016-04-30 00:45:07

第一。代码只转换的大写字母(请看下面的ascii表)

代码语言:javascript
复制
(str[x].charCodeAt() - 65 + 13) % 26 + 65

这就意味着,

  1. 获取字符码数字(将介于65和90之间)减去65
  2. 加上13
  3. 获得26的模数(这确保编码不会加密到'Z‘字母以上的任何内容,例如'Z’字母将转换为(90-65+13) % 26 + 65) = 77 'M‘字母。本质上,它将使加密算法循环到beginning.
  4. Add back 65

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36942744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档