#6633. SPN加密算法

SPN加密算法

题目背景

在密码学中,代换-置换网络(或译作置换排列网络,英语:Substitution-Permutation Network,缩写作 SP-network 或 SPN)是乘积密码和分组加密的一种,美国数学家克劳德·香农在1949年为了找到利用简单的代换-置换方式进行加密的安全加密方式,发明了代换-置换网络。本题希望你实现代换-置换网络加密,对输入的明文字符串进行代换-置换加密并打印输出。

代换-置换网络

代换-置换网络包括两个变换,分别记为 πsπpπ_s 和 π_p

πs:{0,1}l{0,1}l\pi_s : \{0,1\}^l \rightarrow \{0,1\}^l

πp:{1,lm}{1,lm}\pi_p : \{1,lm\} \rightarrow \{1,lm\}

都是置换,置换 πs\pi_s 叫做S盒,它用一个 lBit向量来替代另一个 lBit向量

πp\pi_p 用来置换lm个Bit

给定一个lmBit的二元串 x=(x1,,xlm)x = (x_1,\ldots,x_{lm}),可以将其看做mlBit字串 x1,,xmx_1,\ldots,x_m的并联

因此 x=x1xmx = x_1||\ldots||x_m,且对于 1im1\leq i \leq m ,我们有 x=(x(i1)l+1,,xil)x = (x_{(i-1)l+1},\ldots,x_{il})

下面给出的代换-置换网络由Nr轮组成,在每一轮我们先用异或操作混入该密钥,再用πs\pi_s进行m次代换,然后用πp\pi_p进行一次置换

密码体制:设l,mNr都是正整数, $\pi_s : \{0,1\}^l \rightarrow \{0,1\}^l 与 \pi_p : \{0,lm\} \rightarrow \{0,lm\}$均为置换

P=C=0,1K(0,1lm)Nr+1P=C={0,1},K \in ({0,1}^{lm})^{N_{r+1}} 是由初始密钥K用密钥编排算法生成的所有可能密钥编排方案之集

对一个密钥编排方案 K1,,KNr+1K^1,\ldots,K^{N_{r+1}},我们可以用下面的算法加密明文x

$$SPN(x,\pi_s,\pi_p,(K^l,\ldots,K^{N_{r+1}}) \\ w^0 \leftarrow x \\ for \enspace r \leftarrow 1 \enspace to \enspace N_{r-1} \\ do\begin{cases} u^r \leftarrow w^{r-1} \oplus K^r \\ for \enspace i \leftarrow 1 \enspace to \enspace m \\ do \enspace v^r_{(i)} \leftarrow \pi_s(u^r_{(i)}) \\ w^r \leftarrow (v^r_{\pi_{p(l)}},\ldots,v^r_{\pi_{p(lm)}}) \end{cases} \\ u^{N_r} \leftarrow w^{N_{r-1}} \oplus K^{N_r} \\ for \enspace i \leftarrow 1 \enspace to \enspace m \\ do \enspace v^{N_r}_{(i)} \leftarrow \pi_s(u^{N_r}_{(i)}) \\ y \leftarrow v^{N_r} \oplus K^{N_{r+1}} \\ output(y) $$

注意 的意思是异或,上面S盒的代换是分组代换,也就是10进制数字变成二进制,每组四个位置。

$$在上面的算法中,u^r 是第 r 轮对S盒的输入,v^r是第r轮对S盒的输出。w^r是由v^r应用置换π_p得到,\\然后u^{r+1}由轮密钥 K^{r+1}异或w^r得到,最后一轮没有用置换π_p。如果对密钥编排方案做适当修改\\并用S盒的逆来取代S盒,那么该加密算法也能用来解密。 $$

下面用一个特定的代换-置换网络来说明上面的一般性描述

l=m=Nr=4,πsl=m=N_r=4,\pi_s如下定义,这里输入 z 和输出 πs(z)\pi_s(z)都以十六进制表示$(0 \leftrightarrow (0,0,0,0),1\leftrightarrow(0,0,0,1),\ldots,9\leftrightarrow(1,0,0,1),A\leftrightarrow(1,0,1,0),\ldots,F\leftrightarrow(1,1,1,1))$

πs(z)\pi_{s(z)}如下定义

z 0 1 2 3 4 5 6 7 8 9 A B C D E F
πs(z)\pi_{s(z)} E 4 D 1 2 F B 8 3 A 6 C 5 9 0 7

πp(z)\pi_{p(z)}如下定义

z 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
πp(z)\pi_{p(z)} 1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16

为了叙述方便,我们命名了16个 S 盒,Sri(1i4,14)S^i_r(1 \geq i \geq 4,1 \geq \geq 4),它们都是基于同样的置换πsπ_s。下面给出代换-置换网络的密钥编排算法。我们以一个32比特的密钥 K=(k1,...,k32)0,132 K=(k_1,...,k_32)∈{0,1}^32 开始。对轮数1r51\leq r \leq 5,定义KrK^r是由KK中从k4r3k_{4r−3}开始的16个相邻比特组成的。

下面我使用该代换-置换网络来进行加密。所有的数据都用二元形式表示。

设密钥是:

K=00111010100101001101011000111111K=0011 1010 1001 0100 1101 0110 0011 1111

则轮密钥如下:

K1=0011101010010100K1=0011 1010 1001 0100

K2=1010100101001101K2=1010 1001 0100 1101

K3=1001010011010110K3=1001 0100 1101 0110

K4=0100110101100011K4=0100 1101 0110 0011

K5=1101011000111111K5=1101 0110 0011 1111

设明文为:

x=0010011010110111x=0010 0110 1011 0111

则加密xx的过程如下:

$$w_0=0010 0110 1011 0111 \\ K_1=0011 1010 1001 0100 \\ u_1=0001 1100 0010 0011 \\ v_1=0100 0101 1101 0001 \\ w_1=0010 1110 0000 0111 \\ K_2=1010 1001 0100 1101 \\ u_2=1000 0111 0100 1010 \\ v_2=0011 1000 0010 0110 \\ w_2=0100 0001 1011 1000 \\ K_3=1001 0100 1101 0110 \\ u_3=1011 0101 0110 1110 \\ v_3=1001 1111 1011 0000 \\ w_3=1110 0100 0110 1110 \\ K_4=0100 1101 0110 0011 \\ u_4=1010 1001 0000 1101 \\ v_4=0110 1010 1110 1001 \\ K_5=1101 0110 0011 1111 $$

密文为:

y=1011110011010110 y = 1011 1100 1101 0110

具体解释一下上面比较难以理解的由uuvv的过程,这里分为四组,每组四个数字,分为四次进行SS盒代换,一共代换16位,代换后的十进制数字再转成二进制数字填入vv数组。

数据范围

  • $ 0 \leq z,\pi_s(z) \leq 15,\pi_s(z)中A由10表示,B由11表示以此类推$

  • 1zπs(z)16 1 \leq z,\pi_s(z) \leq 16

  • 密钥K为32位二进制

  • 需要加密的明文为16位二进制

输入

第一行和第二行输入各输入16个数字表示πs\pi_s盒置换

第三行和第四行输入各输入16个数字表示πp\pi_p盒置换

第五行输入密钥

第六行输入明文

输出

输出明文通过SPN加密后的结果

样例

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
14 4 13 1 2 15 11 8 3 10 6 12 5 9 0 7
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16
0 0 1 1 1 0 1 0 1 0 0 1 0 1 0 0 1 1 0 1 0 1 1 0 0 0 1 1 1 1 1 1
0 0 1 0 0 1 1 0 1 0 1 1 0 1 1 1
1011110011010110
12 1 9 2 0 11 7 3 4 15 8 5 14 13 10 6
11 14 7 15 3 4 8 6 10 1 5 0 13 9 12 2
13 2 10 3 1 12 8 4 5 16 9 6 15 14 11 7
12 15 8 16 4 5 9 7 11 2 6 1 14 10 13 3
1 0 1 1 1 1 0 1 1 0 0 0 1 0 0 1 1 0 1 0 1 0 0 1 0 0 1 0 0 1 1 0
0 1 1 1 0 1 0 0 1 0 1 0 0 1 1 1
0010001100011101

样例解释

样例一就是上面举得例子