这是我写的第一篇online的技术文章,之前自己学习过程中的笔记都是写在本地的,但是最近在找资料的时候,感觉到很多时候,自己都能在网上找到自己的所需,为何不把自己学的也记录到网上?闭门造车是愚蠢的,分享才能提高。
于是,在做了《信息安全》的课程实验后,想把他作为牛刀小使的第一步。好吧,进入正题:
首先,我们来看一下什么是SPN,其中文是代换-置换网络,其实就是将一个比特串主要经过两种变换,分别是代换和置换,得到另一个比特串,从而实现加密的效果。但是前提是,可以经过类似的手段将这个比特串还原,这也就是解密了。
SPN的比较正式的定义:给定一个lm比特的串x=(x<1>,x<2>,...,x<m>),可以看成是m个长度为l比特的子串的并联,即x<1> || x<2> || ... || x<m>.对此串进行Nr轮变换,每一轮先用异或操作混入该轮的轮密钥,然后对每个子串x<i>使用进行m次代换,然后使用进行一次置换。也叫S盒,为P盒。
代换,实质是数值的代换,4个bit的二进制数对应的16进制范围是0~f,下图就是的一个示例:
Z | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | a | b | c | d | e | f |
e | 4 | d | 1 | 2 | f | b | 8 | 3 | a | 6 | c | 5 | 9 | 0 | 7 |
置换,实际上是位置的置换,具体含义是Z=2时对应的5,是指原串的第5个bit放到新串的第2个bit的位置上,而不是指第原串的第2个bit放到新串的第5个bit的位置上,可以通过求该置换对应的逆置换来实现该操作,下图是的一个示例:
Z | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
9 | 6 | 10 | 1 | 13 | 14 | 8 | 12 | 7 | 15 | 2 | 5 | 16 | 4 | 11 | 3 |
SPN的算法模型如下:
正常的SPN算法过程就如以上所示,代换的实现相对与置换来说要容易,置换对于“位”的操作要求比较熟悉,在我的实现中将做S盒的代换改成是一个置换,如下:
Z | 1 | 2 | 3 | 4 |
2 | 3 | 1 | 4 |
而置换 不变。
在实现中,我们取m=4,l=4,也就是一个加密单元为16位。轮数Nr取16,当然,相同条件下,轮数越多越安全。对应的密钥也要有16个,我们通过一个初始密钥循环左移1,2...,16位获得,并设该初始密钥为6A8E。实现对“华南吃饭大学”一字符串的加密以及解密。
在实现之前,有必要总结一下常见的位运算技巧以及在实现S、P盒的时候要用到这些技巧的简单运用:
(1)几个超级简单的公式:
- a == (a & 1);//true
- a == (a | 0);//true
- 0 == (a & 0);//true
- 1