日常DES加密算法python实现_以密码编码学与网络安全——原理与实践(第六版)课后习题3.11为例
Posted 囚生CY
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了日常DES加密算法python实现_以密码编码学与网络安全——原理与实践(第六版)课后习题3.11为例相关的知识,希望对你有一定的参考价值。
序言
为了加深对DES加密算法的理解,lvchen很贴心地布置了一道手算DES加密结果的题,从昨晚回寝算到今天中午才写完,主要是花时间把代码逻辑实现了一遍,加深记忆也便于后续重复使用。
笔者参考了经典的DES算法详解这篇博客的解析,博主翻译得通俗易懂,内容详实,应该算是能找到的DES讲解中说得最明白的一个版本了。
本文主要是以密码编码学与网络安全——原理与实践_第6版的课后习题3.11为例,实现DES加密算法中的
- 56位密钥选取算法:PC1置换
- 48位子密钥生成算法:PC2置换
- 28位半密钥的循环左移算法
- 64位明文初始置换算法:IP置换
- 32位半明文扩展置换算法:E扩展函数
- S盒置换算法:8个S-Box
- P置换算法:P置换
习题3.11
笔者在百度文库里找到了这本教材的习题答案https://wenku.baidu.com/view/2079f354ff00bed5b9f31df5.html#,不过并不是很全,可能是教材版本不同,但是有这道习题的答案,所以正好可以拿来验证代码逻辑写得是否正确。
习题3.11答案
解题代码
DES加密算法的流程总结起来简单概括如下,详细过程可见经典的DES算法详解(下面图中置换阵里的数字代表的都是需要置换的串的每个位置的索引):
-
(1)将64位明文输入后先进行初始置换IP,再平均分割成左右各32位的两块 L 0 L_0 L0和 R 0 R_0 R0,将右边这块32位的明文通过扩展置换E增长到48位;
-
(2)将64位密钥输入后先经过PC1置换得到的56位密钥,再平均分割成左右各28位的两块,每块分别进行循环左移(步长由当前轮数决定),再将循环左移后的两块拼接起来得到新的56位密钥,最后经过PC2置换变成48位子密钥;
-
(3)将(1)(2)张得到的48位扩展明文与48位子密钥进行异或运算得到48位的一串字节 A A A;
-
(4)将(3)中得到的结果分成6位一组,共计8组的8串字节,输入到8个S盒子中进行置换,置换算法如图所示
-
(5)8个S盒子的输出拼接起来就是32位的字节,对这个32位的字节用置换阵P再做一次置换
-
(6)最终计算(5)中输出的32位字节和32位字节的 L 0 L_0 L0进行异或运算的值,将它作为 R 1 R_1 R1输出到下一轮, R 0 R_0 R0则作为 L 1 L_1 L1进入直接进入下一轮(习题中到 L 1 L_1 L1 R 1 R_1 R1就结束了,直接输出 L 1 L_1 L1和 R 1 R_1 R1拼接起来的结果就是密文)
-
(7)这样经过16轮后将 L 16 与 R 16 L_16与R_16 L16与R16拼接,做最后一个初始逆置换(与初始置换相反的置换),得到最终的输出结果即为密文。
关于习题3.11的解题代码如下所示,写得很低效,仅供做题参考。事实上即便正确实现标准加密协议的算法逻辑也不要去用于实际加密,一定要用标准加密库如openssl或者keyczar,因为个人写的代码总是有除了逻辑外的漏洞可循(比如可以被计时攻击或者padding oracle或者更高端的攻击方法攻破)。
# -*- coding: UTF-8 -*-
# @Author: caoyang
# @Email: lzwcy110@163.com
# DES加密算法相关函数及密码编码学与网络安全(第6版)课后习题3.11答案
import numpy as np
IP = [ # 初始置换阵
[58,50,42,34,26,18,10,2],
[60,52,44,36,28,20,12,4],
[62,54,46,38,30,22,14,6],
[64,56,48,40,32,24,16,8],
[57,49,41,33,25,17,9,1],
[59,51,43,35,27,19,11,3],
[61,53,45,37,29,21,13,5],
[63,55,47,39,31,23,15,7],
]
PC_1 = [ # PC1置换阵: 64位-->56位, 去除8,16,24,32,40,48,56,64
[57,49,41,33,25,17,9],
[1,58,50,42,34,26,18],
[10,2,59,51,43,35,27],
[19,11,3,60,52,44,36],
[63,55,47,39,31,23,15],
[7,62,54,46,38,30,22],
[14,6,61,53,45,37,29],
[21,13,5,28,20,12,4],
]
PC_2 = [ # PC2子密钥生成置换阵: 56位-->48位, 去除9,18,22,25,35,38,43,54
[14,17,11,24,1,5],
[3,28,15,6,21,10],
[23,19,12,4,25,8],
[16,7,27,20,13,2],
[41,52,31,37,47,55],
[30,40,51,45,33,48],
[44,49,39,56,34,53],
[46,42,50,36,29,32],
]
E = [ # E扩展置换阵: 这里写成这种格式是便于观看, 相当于在每行左右各加了一项
[32,[1,2,3,4],5],
[4,[5,6,7,8],9],
[8,[9,10,11,12],13],
[12,[13,14,15,16],17],
[16,[17,18,19,20],21],
[20,[21,22,23,24],25],
[24,[25,26,27,28],29],
[28,[29,30,31,32],1],
]
S_BOX = [ # 八个S盒子: 构成加密的非线性
[
[14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7],
[0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8],
[4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0],
[15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13],
], # S1
[
[15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10],
[3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5],
[0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15],
[13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9],
], # S2
[
[10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8],
[13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1],
[13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7],
[1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12],
], # S3
[
[7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15],
[13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9],
[10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4],
[3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14],
], # S4
[
[2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9],
[14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6],
[4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14],
[11,8,12,7,1,14Python实现DES加密算法的文本加密器