密码学之代换-置换网络(SPN)
前言
今天继续写一些有关密码学的东西。

一、术语及基础知识
和前文一样,括号内的中文都是用google translate翻译过来的,未必准确。
Symmetric key algorithms(对称密钥算法): 加密和解密都是用的同一个key的算法
Bijective(双射):同时满足injective(内射)和surjective(外射)。X中的每一个元素都与Y中的某个元素对应,Y中的每一个元素都与X中的某个元素对应。

二、Block Cipher(分组密码)
Block cipher 是通过一个长度为的key
,进行一个bijective mapping
,
.
这里叫做block length,一般
都有一个固定的值(我们可以看成是“预设值”),比如说
.
在这里,我们假设我们的,那么我们就有4种不同的值:00,01,10,11,然后这四种不同的值有
种不同的permutation(排列组合)。比方说,00,01,11,10,是key=1时的排列组合,key=2时我们又有一种其他的排列组合。这时候我们就可以通过一个表格,将所有不同key情况下的排列组合记录下来。

我们有了这个表格以后,当我们指定某个key,比方说的时候,我们就可以有如下从plaintext到ciphertext的映射:
但是,可以想象,如果当时,我们需要一张巨大到不存在的表格来存储这些信息。这个时候,我们需要用其他办法来生成我们的permutation.

三、核心思想
我们现在希望用另一种算法来替代我们的表格,我们虽然还不知道我们的算法是什么,但是我们希望我们的算法具有一定的随机性,就算输入的两个值差异很小,对应输出的ciphertext也要有很大的差异性。
一个很经典的方法就是将我们的block拆分成长度相等的小型block,比方说,当我们block长度为128时候,我们就可以拆分为16个8 bits的更小的block ,
。我们对每一个
进行加密,最后将这些block用一种特定的方法组装起来。
*注意,最后的组装并不是直接将所有按照顺序拼装起来(不然,这样就等价于block长度为8了)。拼装方法不唯一,但要保证输入值中的每一个bit都能对输出值的所有bit产生影响。
最后,我们重复刚才拆分拼装的步骤多次。

四、Substitution-permutation networks(代换-置换网络)
SPN的核心思想就是上述的思想。在SPN里面,我们有一个Substitution box(简称S-Box),S-box是一个对小型block加密的算法——最简单的,我们可以设计一个的表格,然后对于一个输入值x,我们查询表格输出一个y。
对于输入值,做如下的事情:
从key里面抽取一个round key
,F在这里只是一个形式,并不代表一定要用某个函数来获取round key
计算
将
拆分为多个小型的block
计算
将每一个小型的block
按照一定的方式重组
重复以上步骤多次。
以下是自己用Python写的一段用于演示的代码(没有核查,不保证100%正确):
逆过程因为懒,所以没有写。
但是我们不难发现,只要有key,我们就能反向从ciphertext获取plaintext。

后记
密码学真的是奥妙无穷。
参考资料:
Jonathan Katz; Yehuda Lindell - Introduction to Modern Cryptography; Third Edition

THE END.