SPN加密算法
You cannot submit for this problem because the contest is ended. You can click "Open in Problem Set" to view this problem in normal mode.
题目背景
在密码学中,代换-置换网络(或译作置换排列网络,英语:Substitution-Permutation Network,缩写作 SP-network 或 SPN)是乘积密码和分组加密的一种,美国数学家克劳德·香农在1949年为了找到利用简单的代换-置换方式进行加密的安全加密方式,发明了代换-置换网络。本题希望你实现代换-置换网络加密,对输入的明文字符串进行代换-置换加密并打印输出。
代换-置换网络
代换-置换网络包括两个变换,分别记为 。
都是置换,置换 叫做S盒
,它用一个 l
Bit向量来替代另一个 l
Bit向量
换 用来置换lm
个Bit
给定一个lm
Bit的二元串 ,可以将其看做m
个l
Bit字串 的并联
因此 ,且对于 ,我们有
下面给出的代换-置换网络由Nr
轮组成,在每一轮我们先用异或操作混入该密钥,再用进行m
次代换,然后用进行一次置换
密码体制:设l
,m
和Nr
都是正整数, $\pi_s : \{0,1\}^l \rightarrow \{0,1\}^l 与 \pi_p : \{0,lm\} \rightarrow \{0,lm\}$均为置换
设 是由初始密钥K
用密钥编排算法生成的所有可能密钥编排方案之集
对一个密钥编排方案 ,我们可以用下面的算法加密明文x
注意:⊕
的意思是异或,上面S
盒的代换是分组代换,也就是10进制数字变成二进制,每组四个位置。
下面用一个特定的代换-置换网络来说明上面的一般性描述
设如下定义,这里输入 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))$
如下定义
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 | 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 |
为了叙述方便,我们命名了16个 S 盒,,它们都是基于同样的置换。下面给出代换-置换网络的密钥编排算法。我们以一个32比特的密钥 开始。对轮数,定义是由中从开始的16个相邻比特组成的。
下面我使用该代换-置换网络来进行加密。所有的数据都用二元形式表示。
设密钥是:
则轮密钥如下:
设明文为:
则加密的过程如下:
$$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 $$密文为:
具体解释一下上面比较难以理解的由到的过程,这里分为四组,每组四个数字,分为四次进行盒代换,一共代换16位,代换后的十进制数字再转成二进制数字填入数组。
数据范围
-
$ 0 \leq z,\pi_s(z) \leq 15,\pi_s(z)中A由10表示,B由11表示以此类推$
-
-
密钥K为32位二进制
-
需要加密的明文为16位二进制
输入
第一行和第二行输入各输入16个数字表示盒置换
第三行和第四行输入各输入16个数字表示盒置换
第五行输入密钥
第六行输入明文
输出
输出明文通过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
样例解释
样例一就是上面举得例子
第六届西南石油大学程序设计新生赛
- Status
- Done
- Rule
- ACM/ICPC
- Problem
- 12
- Start at
- 2022-11-27 14:10
- End at
- 2022-11-27 18:10
- Duration
- 4 hour(s)
- Host
- Partic.
- 100