Skip to content
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

对等加密 #60

Closed
yuxino opened this issue May 1, 2018 · 0 comments
Closed

对等加密 #60

yuxino opened this issue May 1, 2018 · 0 comments
Labels

Comments

@yuxino
Copy link
Owner

yuxino commented May 1, 2018

对等加密(Reciprocal cipher)是对称密钥加密(Symmetric-key algorithm)的一个特例。该类密码的加密算法是它自己本身的逆反函数,所以其解密算法等同于加密算法。如果要还原对等加密的密文,套用加密同样的算法即可得到明文。换句话说,使用相同的密钥,两次连续的对等加密运算后会回复原始文字。在数学上,这有时称之为对合。
举例来说,ROT13 算法是将26个英文字母依续排列即1=A、2=B、3=C、...、26=Z、27=A...,加密后将数字加13,即A(1)→N(14)、B(2)→O(15)、...、M(13)→Z(26),欲得到原始讯息再将数字加13即可。ILOVEYOU加密过后即变成VYBIRLBH。
常见的对等加密算法有 ROT13、阿特巴希密码、博福特密码、恩尼格玛密码机、异或密码、RC4、瓦茨亚亚那加密。

ROT13

ROT13(回转13位,rotate by 13 places,有时中间加了个连字符称作ROT-13)是一种简易的替换式密码。它是一种在英文网络论坛用作隐藏八卦(spoiler)、妙句、谜题解答以及某些脏话的工具,目的是逃过版主或管理员的匆匆一瞥。ROT13被描述成“杂志字谜上下颠倒解答的Usenet点对点体”。(Usenet equivalent of a magazine printing the answer to a quiz upside down.)ROT13 也是过去在古罗马开发的凯撒加密的一种变体。

ROT13是它自己本身的逆反;也就是说,要还原ROT13,套用加密同样的算法即可得,所以他满足以下公式

ROT13( ROT13(x) ) = ROT26( x ) = x

因为这个算法曾经见到过,也非常简单,所以我拿JS实现了一遍,如下

function rot(str,places = 13){
  if(str.length === 0) return "";
  let result = "";
  let code = 0;
  let total = 0;
  for(let s of str){
    code = s.charCodeAt();
    total = code+places;
    if(65 <= code && code <= 90) 
       result += String.fromCharCode(total>90?total-26:total);
    else if(97 <= code  && code <= 122) 
       result += String.fromCharCode(total>122?total-26:total);
    else 
       result += s;
  }
  return result;
}

上StackOverflow然后看了一眼别人的代码,发现自己写的像shit一样? 好吧,原来replace可以加回调函数的,学到了

function rot(str,places = 13){
  str.replace(/[a-zA-Z]/g,function(c){
   return String.fromCharCode((c<="Z"?90:122)>=(c=c.charCodeAt(0)+places)?c:c-26);
  });
}

于是随便测试一下

> console.log(rot("Ubj pna lbh gryy na rkgebireg sebz na vagebireg ng AFN? In the elevators, the extrovert looks at the OTHER guy's shoes."))
How can you tell an extrovert from an introvert at NSA? Va gur ryringbef, gur rkgebireg ybbxf ng gur BGURE thl'f fubrf.

OK,没问题,下一个算法

阿特巴希密码 (Atbash)

第一次看还以为是阿希吧加密。阿特巴希密码是一种开始由希伯来字母使用的简易替换密码。

等一下希伯来字母又是啥?

希伯来字母

现代希伯来语字母表是从亚拉姆语字母表的基础上发展起来的,类似阿拉伯字母。希伯来语使用者称他们的字母表为“aleph-bet”。现时除了希伯来语以外,尚有另一种过去犹太人常用的语言意第绪语亦采用希伯来语字母。

真的阿西吧,啥玩意这个,于是看看wiki给的几个例子:

阿特巴希密码将字母表整个扭转:第一个字母(aleph)与最后一个(taw)相替换,第二个(beth)与倒数第二个(shin)相替换,如此类推。密码学上的示沙克之谜出现在《耶利米书》中,ששך-示沙克(25:26;51:41)其实是加密后的בבל-巴别(即巴比伦)。

现代希伯来文配合阿特巴希密码:

明文: אבגדהוזחטיכלמנסעפצקרשת
密文: תשרקצפעסנמלכיטחזוהדגבא

而罗马字母使用阿特巴希密码则是:

明文: abcdefghijklmnopqrstuvwxyz
密文: ZYXWVUTSRQPONMLKJIHGFEDCBA

而有一种更简单、更快的方法是:

首13個字母: A|B|C|D|E|F|G|H|I|J|K|L|M
後13個字母: Z|Y|X|W|V|U|T|S|R|Q|P|O|N

或者是:

首13個字母: A |B |G|D|H |V|Z|CH|T|Y|K
後13個字母: TH|SH|R|O|TZ|P|O|S |N|M|L

阿特巴希密码不只是用在此两种字母,理论上但凡拼音式字母都可以使用此方法来加密。
这个非常简单的替代密码与ROT13最大的不同是ROT13将字母偏移13位,** 而阿特巴希密码则是将整个字母表对折 **。
例如在阿特巴希密码中“nlmvb”代表“MONEY”。
英文中某些字经过阿特巴希加密后会变成另一个正常的英文字

原文 加密
hob sly
hold bar
baz slow
holy slob
horn slim
zoo all
irk rip
low old
glow told
grog util

这是一个非常薄弱的** 单字母替换密码 **,因为它只有一个固定的密钥。然而,在当时这可能不是一个问题。

于是抓住关键字字母表,字母表,那我就实现一个罗马字母的吧

function atbash(str){
 return str.replace(/[a-zA-Z]/g,function(c){
   const public = "abcdefghijklmnopqrstuvwxyz";
   const private = "ZYXWVUTSRQPONMLKJIHGFEDCBA";
   let flag = true; 
   let index = public.indexOf(c)!=-1?public.indexOf(c):(private.indexOf(c),flag=false);
   return flag?private[index]:public[index];
 });
}

So give me 'MONEY' !

> console.log(atbash("nlmvb"))
MONEY

恩尼格玛密码机(Enigma)

在密码学史中,恩尼格玛密码机(德语:Enigma,又译哑谜机,或“谜”式密码机)是一种用于加密与解密文件的密码机。确切地说,恩尼格玛是对二战时期纳粹德国使用的一系列相似的转子机械加解密机器的统称,它包括了许多不同的型号,为密码学对称加密算法的流加密。

恩尼格玛密码机在1920年代早期开始被用于商业,一些国家的军队与政府也曾使用过它,其中的主要使用者是第二次世界大战时的纳粹德国。

在恩尼格玛密码机的所有版本中,最著名的是德国使用的军用版本。尽管此机器的安全性较高,但盟军的密码学家们还是成功地破译了大量由这种机器加密的信息。1932年,波兰密码学家马里安·雷耶夫斯基、杰尔兹·罗佐基和亨里克·佐加尔斯基根据恩尼格玛机的原理破译了它。1939年中期,波兰政府将此破译方法告知了英国和法国,但直到1941年英国海军捕获德国U-110潜艇,得到密码机和密码本才成功破译。密码的破译使得纳粹海军对英美商船补给船的大量攻击失效。盟军的情报部门将破译出来的密码称为ULTRA,这极大地帮助了西欧的盟军部队。ULTRA到底有多大贡献还在争论中,但是人们都普遍认为盟军在西欧的胜利能够提前两年,完全是因为恩尼格玛密码机被成功破译

尽管恩尼格玛密码机在加密方面具有不足之处,但是经它加密的文件还是很难破译,盟军能够破译它的密码是因为德国还犯了其它一些大错误(如加密员的失误、使用步骤错误(黑人问号)、机器或密码本被缴获等等)。

不是很感兴趣也没看见wiki上面的算法上的描述于是跳过,但是百度谷歌都能搜索到,感兴趣的话看看这个链接

异或密码

简单异或密码(英语:simple XOR cipher)是密码学中一种简单的加密算法,它按照如下原则进行运算:

异或稍微懂程序的frineds应该都懂,两个位一样为假,两个位不同为真,用表格来描述的话就是酱紫

XOR 0 1
0 0 1
1 1 0

用数学AB来表示就是 A⊕0=A , A⊕A=0

按这种逻辑,文本串行的每个字符可以通过与给定的密钥进行按位异或运算来加密。如果要解密,只需要将加密后的结果与密钥再次进行按位异或运算即可。
例如,字符串“Wiki”(8位ASCII:01010111 01101001 01101011 01101001) 可以按如下的方式用密钥11110011进行加密:

     01010111 01101001 01101011 01101001
⊕ 11110011 11110011 11110011 11110011
   10100100 10011010 10011000 10011010

此种加密方法类似对称加密,故解密的方式如下:

     10100100 10011010 10011000 10011010
⊕ 11110011 11110011 11110011 11110011
=   01010111 01101001 01101011 01101001

这是利用了取两次XOR等于原来的值的特性。假设B为密钥,我们可以通过公式推导出来

   A ⊕ B ⊕ B
= A ⊕ ( B ⊕ B )
= A ⊕ 0
= A

那么,实现一个!不转八位了,但还是用XOR运算

function xor(str,key = 1111){
  let result = "";
  for(let c of str) 
     result += String.fromCharCode(c.charCodeAt() ^ key);
  return result;
}

жФФѷРвѷджй

这些算法完全用不上,就到此为止吧,不再深入了

@yuxino yuxino added the Algs label May 1, 2018
@yuxino yuxino closed this as completed Oct 9, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant