欢迎光临散文网 会员登陆 & 注册

密码学之代换-置换网络(SPN)

2021-05-11 21:34 作者:刹那-Ksana-  | 我要投稿

前言

今天继续写一些有关密码学的东西。

一、术语及基础知识

和前文一样,括号内的中文都是用google translate翻译过来的,未必准确。

Symmetric key algorithms(对称密钥算法): 加密和解密都是用的同一个key的算法

Bijective(双射):同时满足injective(内射)和surjective(外射)。X中的每一个元素都与Y中的某个元素对应,Y中的每一个元素都与X中的某个元素对应。

二、Block Cipher(分组密码)

Block cipher 是通过一个长度为n的key k%5Cin%20%5Cleft%5C%7B%200%2C1%20%5Cright%5C%7D%5En%20,进行一个bijective mapping E_k%3A%5Cleft%5C%7B%200%2C1%20%5Cright%5C%7D%20%5El%5Crightarrow%20%5Cleft%5C%7B%200%2C1%20%5Cright%5C%7D%20%5El,D_k%3A%5Cleft%5C%7B%200%2C1%20%5Cright%5C%7D%20%5El%5Crightarrow%20%5Cleft%5C%7B%200%2C1%20%5Cright%5C%7D%20%5El

这里l叫做block length,一般l都有一个固定的值(我们可以看成是“预设值”),比如说l%3D128

在这里,我们假设我们的l%3D2,那么我们就有4种不同的值:00,01,10,11,然后这四种不同的值有2%5E2!种不同的permutation(排列组合)。比方说,00,01,11,10,是key=1时的排列组合,key=2时我们又有一种其他的排列组合。这时候我们就可以通过一个表格,将所有不同key情况下的排列组合记录下来。

表格示例

我们有了这个表格以后,当我们指定某个key,比方说k%3D2的时候,我们就可以有如下从plaintext到ciphertext的映射:E_%7Bk%3D2%7D%3D%5Cleft%5C%7B%2000%3A00%2C01%3A11%2C10%3A01%2C11%3A10%20%5Cright%5C%7D%20

但是,可以想象,如果当l%3D128时,我们需要一张巨大到不存在的表格来存储这些信息。这个时候,我们需要用其他办法来生成我们的permutation.

三、核心思想

我们现在希望用另一种算法来替代我们的表格,我们虽然还不知道我们的算法是什么,但是我们希望我们的算法具有一定的随机性,就算输入的两个值差异很小,对应输出的ciphertext也要有很大的差异性。

一个很经典的方法就是将我们的block拆分成长度相等的小型block,比方说,当我们block长度为128时候,我们就可以拆分为16个8 bits的更小的block x_1%2C%20x_2%2C%20...%2C%20x_%7B16%7Dx_i%5Cin%20%5Cleft%5C%7B%200%2C1%20%5Cright%5C%7D%20%5E8。我们对每一个x_i进行加密,最后将这些block用一种特定的方法组装起来。

*注意,最后的组装并不是直接将所有x_i按照顺序拼装起来(不然,这样就等价于block长度为8了)。拼装方法不唯一,但要保证输入值中的每一个bit都能对输出值的所有bit产生影响。

最后,我们重复刚才拆分拼装的步骤多次

四、Substitution-permutation networks(代换-置换网络)

SPN的核心思想就是上述的思想。在SPN里面,我们有一个Substitution box(简称S-Box),S-box是一个对小型block加密的算法——最简单的,我们可以设计一个的表格,然后对于一个输入值x,我们查询表格输出一个y。

对于输入值x%5Cin%20%5Cleft%5C%7B%200%2C1%20%5Cright%5C%7D%20%5El,做如下的事情:

  1. 从key里面抽取一个round key k%E2%80%99%3DF(k),F在这里只是一个形式,并不代表一定要用某个函数来获取round key

  2. 计算x'%3Dx%5Coplus%20k'

  3. x'拆分为多个小型的block x_1%2Cx_2%2C...%2Cx_t

  4. 计算x'_i%3DS(x_i)%2Ci%3D1...t

  5. 将每一个小型的block x_i'按照一定的方式重组

  6. 重复以上步骤多次。

以下是自己用Python写的一段用于演示的代码(没有核查,不保证100%正确):

逆过程因为懒,所以没有写。

但是我们不难发现,只要有key,我们就能反向从ciphertext获取plaintext。

后记

密码学真的是奥妙无穷。

参考资料:

Jonathan Katz; Yehuda Lindell - Introduction to Modern Cryptography; Third Edition

THE END.

密码学之代换-置换网络(SPN)的评论 (共 条)

分享到微博请遵守国家法律