这是我写的第一篇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)几个超级简单的公式:

 
  
  1. a == (a & 1);//true  
  2. a == (a | 0);//true  
  3. 0 == (a & 0);//true  
  4. 1