密码学实验题_01_使用Sage_比较【书本代码SDES】与【Sage中SDES】的差异性
问题:实验代码 —— SimplifiedDES.sage
1. 置换P盒如何实现,并记录简单实验(使用jupyter)?
##########################################################################
# S-DES 中的 P盒
P10_data = [3, 5, 2, 7, 4, 10, 1, 9, 8, 6];
# 用于将 输入的10bit密钥 进行P10盒变换
# 参考《在线部分》P134页的【G.2 S-DES的密钥产生】
# 定义通用的 “移位变换”函数
def ApplyPermutation(X, permutation):
r"""
移位变换
输入: permutation 移位变换向量,长度可以自适应
输出: 根据 permutation 移位变换向量,输出X进行变换后的向量
"""
# permute the list X
l = len(permutation);
return [X[permutation[j]-1] for j in range(l)];
# 使用通用的[ApplyPermutation]函数构造P10盒
def P10(X):
return ApplyPermutation(X, P10_data);
# 使用向量[1,2,3,4,5,6,7,8,9,10]验证P10盒的移位替换作用
test_P10_input = [1,2,3,4,5,6,7,8,9,10]
test_P10_output = P10(test_P10_input)
test_P10_output
输出: [3, 5, 2, 7, 4, 10, 1, 9, 8, 6]
2. 替换S盒如何实现,并记录简单实验(使用jupyter)?
##########################################################################
# S-DES 中的 S盒
# 【参考】:《在线部分》P136页:
# S盒的操作如下:
# S盒 对应的矩阵
S0_data = [[1, 0, 3, 2],
[3, 2, 1, 0],
[0, 2, 1, 3],
[3, 1, 3, 2]];
S1_data = [[0, 1, 2, 3],
[2, 0, 1, 3],
[3, 0, 1, 0],
[2, 1, 0, 3]];
# 【S盒通用算法】
def ApplySBox(X, SBox):
r"""
【S盒通用算法】
输入:
①X: X下标从1到4,
X的第1位和第4位组成一个2位二进制数决定S盒的行;
X的第2位和第3位决定S盒的列
②SBox: 4x4的 S盒矩阵,
该矩阵的每个元素是 由‘_ _’2个bit位决定的数值,
所以每个元素的取值为 00为0, 01为1, 10为2, 11为3
"""
# X的第1位(下标为X[0])和第4位(下标为X[3])组成一个2位二进制数决定S盒的行
r = 2*X[0] + X[3];
# X的第2位(下标为X[1])和第3位(下标为X[2])组成一个2位二进制数决定S盒的行
c = 2*X[1] + X[2];
# 选择出 S盒矩阵中 r行、 c列对应的元素,该元素是1个 0-3的、可以化成2个bit位的数值
o = SBox[r][c];
# #### 这里是与书上不一致的根源!
# 将 选中的该元素转换成 二进制bit位的序列
# 二进制操作 o & 10 : 应该表示取 【o】二进制的高位
# 二进制操作 o & 01 : 应该表示取 【o】二进制的低位
# 【☆出错原因☆】:
# o & 10 表示取 【o】二进制的高位,但低位还是0
# 比如 o 如果是 11 ,那么二进制结果是 10,对应十进制值是2
return [o & 2, o & 1];
# 使用【S盒通用算法】实现 S0盒、S1盒 置换
def S0(X):
return ApplySBox(X, S0_data);
def S1(X):
return ApplySBox(X, S1_data);
# 【参考】:《在线部分》P136页:
# 例如,若(p0,0 p0,3) = (00),(p0,1 p0,2) = (10)
# p0,0、p0,1、p0,2、p0,3 = 0、1、0、0
test_S0_input = [0, 1, 0, 0]
test_S0_output = S0(test_S0_input)
# 输出的结果不正确: 应该输出是[1, 1], 但实际输出了[2, 1]
# 出错的原因见上面注释中的 【☆出错原因☆】
print("test_S0_output = {0}".format(test_S0_output))
输出: test_S0_output = [2, 1]
# 加载当前目录下的 [SimplifiedDES.sage.py] 源码文件
load("SimplifiedDES_origin.sage")
plaintext_8bit = [1,1,1,1,1,1,1,1]
key_10bit = [1,0,1,0,1,0,1,0,1,0]
ciphertext = SDESEncrypt(plaintext_8bit, key_10bit)
print( ciphertext )
输出:[1, 0, 1, 0, 1, 0, 1, 0]
plaintext_test = SDESDecrypt(ciphertext, key_10bit)
print( plaintext_test )
print( plaintext_8bit )
输出:
[1, 1, 1, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 1, 1]
3. S盒实现是否存在问题?如存在问题,是否影响加解密正常运行?
个人思考意见:
3.①题目《SimplifiedDES.sage》S盒的代码实现,与《第七版课本在线部分-附录G-简化DES》描述有一些不同,但用这个*.sage文件自己进行加密并解密正常。
解密正常的原因:
3.①.①、类似“菲斯特”结构的“对合变换”特性,
密文 = IP逆( f_k2(SW(f_k1(IP(明文)))) )
明文 = IP逆( f_k1(SW(f_k2(IP(密文)))) )

最低0.47元/天 解锁文章
2968

被折叠的 条评论
为什么被折叠?



