非常好的密码学系列视频导论 自行扶梯

上一篇文章写了很久很久很久以前的加密算法,这一篇写近现代的,这一篇翻资料翻到头晕了,不知道有没有码错字,概念颠倒之类的,写完之后感觉一战和二战期间出现了很多高人,乱世出枭雄

移位加密法 transportation cipher

只是明文简单的重新排列,所以也叫permutation cipher,并没有把密码出现的频率变更

篱笆加密法 rail fance cipher


这里的Key就是需要排列多少层,上图Key=3

row transposition 列位移加密法

  1. 按照数字和字母按顺序对应的关系,把KEY转换为数字
  2. 把M按照顺序填入对应表
  3. 这里数值最小的字母是E=4,所以先取出E一纵列的明文,SENE
  4. 取数字第二小的字母H=7,对应这一列的明文就是PTSG
  5. 重复以上步骤,可以把全部列的明文取出,然后按顺序排列,即可得出结果。

    思考:
    这里的KEY里面有重复的字母怎么办?
    这里的KEY长度和明文长度有规定么?

permutation cipher 排列加密法

这个加密的流程上上面的很相似,也应用在现代DES算法中,该算法有自身的随机对照表。

  1. 首先KEY的长度需要是明文长度的整数倍,而且直接用数字表示,假设KEY=52341
  2. 把M按照顺序填入对应表
  3. 先以第一行为单位,按照从小到大取出M。
  4. M1=SHPIP
  5. M2=EHEBT
  6. 如此重复,取完所有行的Mi
  7. C=M1M2M3M4

以上的四种加密方式,字母出现的频率还是一样的,只是排列变化了,那为什么可以应用在现今的加密?因为会有多种加密方式组合一起使用,从而增加了密码破译的难度。

product cipher,积加密法

思考:
替换表可不可以变的非常庞大,变成一本书那么大?从而增加破译难度

这里就引入了codebook的概念,它可以做到可以一个不论长度的单词,固定对应五个数字,符合一对多的条件,对应关系多样性导致破译密码变的困难,codebook可靠的前提就是本身不能被公开。

一次世界大战的中期,德国的zimmerman note电报,就和codebook的使用有关,引起了美帝、英帝、老德、墨西哥的疯狂撕逼大战,感兴趣的自行查阅资料

但是codebook有一个缺点,codebook和明文的对应关系是不变的,查表就可以得到固定的结果,而且存在单词的频率问题。因而出现了additive book,这是一本充满随机数的书。结合additive book提供的数字,可以对codebook得出的结果做第二次计算,additive book增加了密码的随机率,所以additive book也是属于KEY的一部分,也不能被公开。
additive book的运算方法如下:

  1. 通过查codebook可以把明文M变成一连串的五位数数字
  2. 选择additive book的起始位置
  3. 将从起始位的随机数与之前用codebook查阅得出的数字相加,成为密文C
  4. 把密文C和起始位置的信息发送出去
  5. 接收者把密文C减去additive book的起始位置的值,就可以得到M
  6. 接受者把M用codebook对照,就可以得到最原始的明文

德国密码机 Enigma

在第二次世界大战期间,德国人发明了Enigma,使得了加密可以在机器上处理。它有三个转盘,转盘由从错综复杂的电路组成,每一个转盘都有26个电路选项。转盘的存在保证了一对多的特性,那么接受和发送的人怎么保证一致性?让两台机器的设定成为一样的参数就行了。这个写有调整参数的本子叫做密码本,每个月都需要根据密码本调整转盘和电路板。于是乎KEY就是Enigma和密码本了,保护好这这两个东西,密码就是安全的。

密码本是水溶性的红色墨水写在粉红色的纸上面。这样机器就不能用暴力破解,把纸条丢进水里就没办法恢复。电影《U-571》,《模仿游戏》有提及密码机。

现代密码学和古典密码学

香农在各各领域都有不错的建树,来到密码学领域友情客串的claude shannon,在1945年发表了两篇论文,顺便拿下信息论之父的头衔。他的论文证明了OTP是安全的,还引入了confusion和diffusion的概念。随着现代文件系统和数据库的发展,加密变得越来越集中和有规划的管理,这个数据时代,需要的更多是用0和1,而不再是字母。所以现代加密方式划分了两大类加密模式:stream cipher和block cipher

confusion.混淆,模糊化明文和密文的关联性
diffusion.扩散,把明文的统计特性扩撒到密文里面。
论文关键字Communication theory of secrecy system

stream cipher串流加密

是一种对称加密算法,加密和解密双方使用相同伪随机加密数据流(pseudo-random stream)作为密钥,OTP是一个例子,OTP实现的问题在博客上一篇文章提及到了,首先OTP的KEY长度最少需要等于明文,当需要信息不断交互的时候,如何在保证KEY不重复的情况下,还能生产出OTP的KEY?而且OTP的管理也比较难。串流加密流程简单,还可以用硬件实现,因为当时的软件运算能力并不是很强,当代的物联网技术为了减少软件的负载,也会把运算用硬件实现。串流加密的计算也不再是之前古典密码提及的相加减然后用mod取余,而是采用了Exclusive OR,这个异或算法是可逆的。串流加密代表算法有利用位移寄存器实现的GSM通讯系统的A5/1加密和利用差别变化实现的RC4加密,一个失败的例子即WEP网络传输协议,破解过wifi密码的人就知道,这个算法只要在有足够多的握手包的情况下,就可以破译出密码,因为密钥必然会出现重复的情况

寄存器的工作方式請自行搜索
异或算法Exclusive OR其实很简单,當兩兩數值相同為否,而數值不同時為真,符號為XOR或EOR或⊕
科普一下伪基站攻击的知识,伪基站攻击一般需要手机信号在2G的情况下进行,2G网络鉴权用的三元组Kc RAND SRES,只有网络侧对手机的鉴权。
3G网络鉴权用五元组RAND CK IK XRES AUTN,可以手机网络双向鉴权,但是现在有能力把LTE的网络通过技术手段让被攻击者回到2G网络,不扯太多题外话,懒人思考。结论是A5/1算法不再安全。

block cipher

区块加密,把明文切割为一个个区块,以区块为单位加密,codebook是一个例子,把每一个单词当作一个区块。区块(block)密码的工作模式(mode of operation)允许使用同一个分组密码密钥对多于一块的数据进行加密,并保证其安全性。 分组密码自身只能加密长度等于密码分组长度的单块数据,若要加密变长数据,则数据必须先被划分为一些单独的密码块。通常而言,最后一块数据也需要使用合适填充方式将数据扩展到匹配密码块大小的长度。一种工作模式描述了加密每一数据块的过程,并常常使用基于一个通常称为初始化向量的附加输入值以进行随机化,以保证安全。讲到这个感觉肯定就逃不了码一篇DES算法的文章………

feistel cipher

费斯特加密是一个最通用的区块加密例子,而且它加解密互逆。F就是round function,K就是sub-keys, ⊕ 就是上面提及的异或运算 ,这里每一轮运算都会产生对应的sub-keys
以下是Feistel的加密大致流程:

  1. 输入一个长度为2w的明文和Key(k1,k2,kn)
  2. 把明文等大的分成左右,L和R
  3. 进行n轮的迭代
  4. 迭代完成之后把最后的L和R合并在一起

第i轮的迭代函数如下
Li=Ri-1
Ri=Li⊕F(Ri-1,Ki)

Feistel的解密流程:
本质上与加密过程一样,将密文作为输入,以相反次序使用子密钥,保证加密和解密可以采用同一算法。以16轮加密为例

在加密过程中,LE16=RE15

那么在解密过程中,LD1=RD0=LE16=RE15

这个算法的安全性和下面条件有关系:
密钥大小、分组大小、、迭代次数、子密钥的产生算法,当子密钥产生的方式越复杂的时候,分析和破译的难度就越大(并非加密算法,Feistel网络结构本身就是加密算法或其重要组成部分,是无需保密的),其中还有一个round function是最为关键保护安全性的因数。