学习记录 2020/8/17

研一


DES学习

DES是Data Encryption Standard的缩写,是美国Federal Information Processing Standards Publication于1977年1月15号发表的46-3号标准。DES是IBM公司开发的对Lucifier体制密码的一个改进,是一种特殊类型的迭代密码,叫做Feistel密码。
Feistel密码依然是迭代密码,对明文数据采用轮函数进行置换变化,同时对密钥进行密钥编排使每一轮的密钥都不相同。Feistel结构的密码首先将明文分为左右Li,Ri 两部分,然后在每一轮执行Li+1 = Ri, Ri+1 = F(Li + Ki)的操作,其中F函数由不同的密码标准自行设计。
DES密码的执行过程如下:每轮的密码运算先将右边32bits的数据进行扩展处理,扩展表称为E表(Extending),将32bits的数据扩展为48bits。该扩展只是对其中部分数据进行了复制,该操作的作用是让输入数据的长度和密钥长度相同,方便后面进行运算,同时为之后S盒的代换提供符合要求的数据。扩展之后的输入数据此时和该轮密钥编排处理得到的密钥进行异或运算,生成的数据输入到S盒,开始进行轮函数的运算。DES标准密码使用了代换置换网络(SPN),该网络设计了S盒和P盒,使得对明文及其后每轮的输入数据进行处理的时候都可以查表进行运算。轮函数S盒(Substitute-Box)将6bits的数据代换为4bit的数据,P盒将32bits的数据置换为32bits的数据。其中值得注意的是,虽然S盒代换的时候是6bits变成了4bits,看起来信息在此过程中有所损失,但实际上该轮操作得到的结果实际是数据的坐标,并没有损失数据;此外,S盒的运算也将扩展后增加的长度变回了原输入数据的长度,即32bits,使得该轮最终的输出数据可以进入下一轮计算。接下来,P盒的运算是对32bits的数据进行了同等长度的置换,原理同S盒相同,只不过长度增加了而已。P盒的输出数据再继续进入下一轮进行同样的计算。
在《密码学原理与实践》一书中,提到的对DES的攻击类型有两种,分别为线性攻击和差分攻击。线性攻击是对S盒设计初始便产生的偏差值——部分位相异或的结果的统计概率——进行有效利用的一种攻击手段,该攻击的类型属于选择明文攻击,攻击的关键是找到满足要求的输入、一系列的S盒及最后一轮的输入值,其次对需要的明密文对的数量进行相应的预估也可以大大提高攻击效率以及提升攻击有效率。个人认为线性攻击的本质还是穷举攻击,不过相对于穷举攻击更加有针对性,就像遗传算法还是模拟退火算法等一样。线性攻击的数学原理是建立在“堆积引理”上的,该引理指出了多个相对独立的随机变量异或值的偏差和每一个单独的变量的偏差的关系。当多个随机变量偏差均不为零时,总异或值的偏差是2k-1 Πεi 。对于DES的线性攻击来说,尽管各个变量之间并不完全独立,但由于S盒和P盒以及扩展算法对数据的打乱,使得其独立性大大增强,大体上可以满足该引理的使用要求。
差分攻击的提出则较为尴尬。IBM在提出DES后并没有完全公开S盒的设计思路,然而其在设计时就已经知道了差分攻击的概念,因此在设计S盒之时就已经考虑到了差分攻击对S盒攻击的可能,但IBM直到20年后在Shamir和Biham独立研究并公开提出该攻击方法之后才公开其早就针对该攻击方法做了相应处理。导致在今天差分攻击并不是作为主流攻击DES的方案。
在1999年,一个使用100000台电脑的分布式计算网络成功在22小时内得到了DES的密钥,其查找密钥速度为每秒2200多亿个。因此在1999年AES以及3DES已经取代了DES。

白盒密码[1]

传统的密码学原语是基于黑盒密码提出的,即密码的运算过程不能被攻击者侦察到,而只可以拿到输入和输出的结果。但随着科技的进步和应用场景的改变,原先的假设逐渐被推翻,如在虚拟机,IDA逆向破解等的条件下,无论是密钥的处理还是明文的计算都光明磊落的处在观察者的注视之下。因此白盒密码的概念越来越收到重视。白盒攻击的概念由Chow等人在2002年提出,在概念描述中,攻击者对设备终端(即应用程序的运行的环境)拥有完全的控制能力、与软件的执行者拥有同等的权力。他可以对程序运行的二进制追踪、读取内存中的密钥、观察程序执行的中间结果、任意的静态分析以及改变子计算的结果等。攻击者可以在终端做任何的操作,相比传统的黑盒模型,对攻击者的能力只有很少的限制。
白盒密码的起源于恶意主机攻击,与旁信道攻击(灰盒攻击)相似,其重要手段是混淆。
白盒密码的设计思路目前由三种,分别为查找表的方式,插入扰乱项的方式以及多变量的方式。
白盒密码的应用场景包含数字版权管理,云计算,手机安全使用,将私钥加密(签名)转换为公钥加密几种。

java

class Myclass {
	public static void main(String[] args) {
		private int var1;
		private byte[] var2 = new byte[2];
		for (int i = 0; i < 2; i++) {
			var2[i] = new byte = "a"; 
			getvar2(var2[i]);
		}
		return;
	}
	
	public void getvar2(byte value) {
		System.out.println(value);
		return;
	}
}

参考文献:
[1] 白盒密码研究. 林婷婷,来学嘉. 上海交通大学. 2015 密码学报

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值