DES雪崩效应和密码强度和随机性测试

《密码学导论》实验报告

1、实验内容及要求

题目一:分组密码的轮数对雪崩效应的影响

  1. 编写 DES 或 AES 加密/解密算法, 算法中迭代轮数可自由设定。
  2. 针对不同的迭代轮数, 测试并统计当明文改变 1 个比特, 或密钥改变 1
    个比特时, 密文的变化。
    a) 至少测试 3 种不同的迭代轮数
    b) 统计时, 应当考虑到在不同密钥、 不同明文基础上, 改变 1 比特时, 密
    文所发生的变化
    c) 统计结果应以图的形式直观表示出来
(a)DES加/解密算法的背景和原理

首先,为了编写DES加/解密程序,我们必须了解DES加密算法:

DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。需要注意的是,在某些文献中,作为算法的DES称为数据加密算法(Data Encryption Algorithm,DEA),已与作为标准的DES区分开来。

以下为DES加/解密算法的详细步骤图示:

des

算法的主要步骤为:

  • 利用64位的初始密钥产生N轮迭代所需要的密钥,具体步骤如下:
    • 对64位密钥进行压缩换位产生56位密钥(第八位用作奇偶校验位)
    • 将56位密钥分为两组前28位和后二十八密钥C和D,分别对C,D进行移位操作,再把56位密钥进行一次压缩变换形成每一轮所需要的最终的48位密钥
  • 对明文进行分组进行N轮的迭代变换,具体步骤如下:
    • 对明文进行分组,每64位一组
    • 对每一个分组首先进行一次初始置换IP
    • 在该轮中,把64位分组分为左32位 L i L_i Li和右32位 R i R_i Ri,然后 L i + 1 = R i L_{i+1}= R_i Li+1=Ri,而 R i + 1 = L i ⊕ f ( R i , K i ) R_{i+1}=L_i\oplus f(R_i, K_i) Ri+1=Lif(Ri,Ki) f f f为给定的轮函数。经过N轮这样的迭代之后,形成64位数据。
    • 最后对64位数据进行逆置换 I P − 1 IP^{-1} IP1,得到最终的64位密文。

在开始对于DES雪崩效应的研究之前,先讲讲完备性和雪崩效应:

完备”的概念是由KamDavida提出来的。如果一个密码变换是完备的,那么它的每一个密文比特都依赖于所有的明文比特。所以,完备的密码变换意味着:若能根据明文比特找到每一个密文比特的最简布尔表达式,那么这些表达式一定包含所有的明文比特。

如 果 明 文 矢 量 和 X 和 X i 仅 在 第 i 位 不 同 , 对 于 所 有 的 i , j , f ( X ) 和 f ( X i ) 至 少 在 第 j 位 不 同 , 那 么 f 是 完 备 如果明文矢量和X和X_i仅在第i位不同,对于所有的i,j,f(X)和f(X_i)至少在第j位不同,那么f是完备 XXiii,jf(X)f(Xi)jf

”雪崩效应“是由Feistel提出来的,我们可以这样描述雪崩效应,对于一个给定的密码变换,若在任何时候,对单个输入比特求补,致使有一半的输入比特发生取补,则认为发生了雪崩。

(b)Python下的DES加密算法细讲

在这里对DES算法的python实现并不多做描述,主要讲解一些比较特殊的地方:

  • 在我们的算法中,为了增加DES算法的普遍适用程度,我们使用了unicode编码,将输入的明文字符由UTF-8码转换为unicode码(每个字符编码占两个字节)以兼容中文。然后再将unicode编码转化成二进制比特串进行加解密。因此,在我们这里每4个字符( 4 ∗ 16 = 64 4*16=64 416=64)即组成一个明文分组。

    捕获

  • 迭代轮数由标准的16轮迭代变成可控的N轮,由一个全局变量控制。此时,我们的密钥处理也要发生改变,由于之前的移位处理只考虑了16位,在这里我们将原来的移位表进行简单的平移得到了新的N轮密钥移位表。

    dadsa

  • 对于输入的加/解密密钥,我们这里没有进行编码转换,因此采用的为ASCII码,64位的密钥需要8个字符来生成,因此输入的密钥限制必须要满足8个字符的限制。

©DES中的雪崩效应与算法迭代轮数的关系
1、明文变化1个比特产生的雪崩效应的研究

为了研究明文变化一个比特产生的雪崩效应和迭代轮数的关系,我们的思路如下:

  1. 首先产生不同的明文-密钥对,保证明文和密钥的内容对实验结果的影响能够得到一定程度的消除。

  2. 对于每一组明文-密钥对( M − K 对 M-K对 MK),首先对明文( 迭 代 轮 数 分 别 为 1 − N 迭代轮数分别为1-N 1N)进行加密,得到密文组( C 0 C_0 C0),里面包含 N N N组密文。然后再随机改变明文的比特串中的一位,再次加密得到新的密文组( C 1 C_1 C1)。这样重复在原来明文比特串上修改一位,得到密文组 C 2 C_2 C2 , C 3 ,C_3 C3

  3. 下面则研究密文的改变程度。研究的内容主要是 C 0 C_0 C0分别与 C 1 C_1 C1 C 2 C_2 C2 C 3 C_3 C3相比,迭代相同轮数的密文的变化的位数,即:

    R e s u l t 1 [ i ] = S u m [ C 0 [ i ] ⊕ C 1 [ i ] ] Result_1[i] = Sum[C_0[i] \oplus C_1[i] ] Result1[i]=Sum[C0[i]C1[i]] 其 中 i 代 表 密 文 的 迭 代 轮 数 其中i代表密文的迭代轮数 i

  4. 再依次对另外两组明文-密钥对重复2-3步处理即可得到下面的实验结果。

    实验说明:

    为了便于实验处理和研究,在这里我们的明文仅仅使用了4个字符,这是为了使其恰好形成一个分组且无需进行比特填充,便于我们比较。

    且对于迭代轮数,由于雪崩效应的发生非常迅速,对于较大的轮数来说,其效果不明显,只是在一个固定的范围之内进行波动,因此这里我们着力于研究1-16轮中密文的变化情况。

  • text = “love”

    key = “hellustc”

    citxt_change_2

  • text = “lol+”

    key = “profwhli”

    citxt_change_3

  • text = “1234”

    key = “c++andc#”

    citxt_change_4

通过三组实验结果的比较,我们可以看到,随着迭代轮数的变化,密文的变化情况主要分为两个阶段:

  • 雪崩阶段:该阶段主要特征为增长速度非常快,密文初始变化位数只有1位,但是随着迭代轮数的增加,密文的变化位数达到一个相当高的水平,雪崩效应相当明显,普遍在第四轮迭代的时候就可以达到稳定值。
  • 波动阶段:该阶段主要是在围绕着一定的水平进行上下波动,不再有所增长,雪崩效应已经结束。

且我们可以看到,对于明文改变一个比特来说,不管该比特的变化的位置在何处,均会对密文产生重大影响,其雪崩效应相当接近。

在本试验中,由于采用的是unicode编码,ASCII码转unicode码会产生比较多有规律的0,所以导致变化的比特位数具有较大的波动性。

2、密钥变化1个比特产生的雪崩效应研究

对于密钥变化一个比特的研究思路和明文变化的思路相近,仅仅是由对明文比特串的改变变为对密钥比特串的改变,于是在这里不再进行赘述。

实验说明:

同样,明文采用一个分组4个字符。

  • text = “love”

    key = “sisongjr”

    key_change

  • text = “2333”

    key = “cindy+++”

key_change_2

通过三组实验结果的比较,我们也可以看到,随着迭代轮数的变化,密文的变化情况主要分为两个阶段:

  • 雪崩阶段:和前者相似,不再赘述。
  • 波动阶段:和前者相似,不再赘述。
(d) 新问题的探讨

由于DES加密算法中唯一的非线性部分是八个S盒,故DES的安全性研究主要是花在S盒的设计和分析上,以上给了设计应遵循的严格雪崩准则.80年代以来,各国学者们提出了一系列的准则来衡量密码变换抵抗某种密码分析的能力强弱,其中包括代数次数、非线性度、线性结构及扩散准则、相关免疫准则、对称性等等,DES的S一盒是否满足这些准则还有待进一步研究。

来自S盒的替换的交替和来自P盒和E扩展的比特的置换分别提供了所谓的“混淆和扩散”,Claude Shannon在1940年代时认为这是安全的必要条件。

我仔细考虑DES的加密过程,通过查阅相关文献,发现雪崩效应主要和S盒的关系更大,因此做了以下的一些补充实验。

把S盒替换成有序列表

  • 改变四个S盒

    s4

  • 改变六个S盒

    和上图类似

  • 改变八个S盒

    dasd

可以看到,不管是密钥变化一个比特,还是明文变化一个比特均会产生相似的雪崩效应,但是在密钥的改变中会有一些特殊的改变位数,它们的改变对于密文的结果不产生任何影响:

如下图,我们可以看到,改变第十六个比特和第三十二个比特对于密文的结果不产生任何的影响,这是由于上面所提到的输入的64位密钥中的每8位比特中的最后一个比特用作奇偶校验位所导致的,即实际上参与加密的密钥只有56位。

密钥名义上存储或传输为8字节,每个具有奇偶校验。 根据ANSI X3.92-1981(现在,称为ANSI INCITS 92-1981)[1]
,第3.5节:KEY的每个8位字节中的一个位可以用于密钥生成,分配和存储中的错误检测。 位8,16,…,64用于确保每个字节具有奇数奇偶性。

我们看到既然雪崩效应在第四轮之前就已经发生,且基本达到一个稳定的状态,那为什么在DES标准中我们要使用N=16轮呢?若轮数设置地更少的话,我们的加密速度和加密效率会得到较大的提升。

  • 出于计算量的考虑,为了保证计算安全。

    对于DES算法的破解来说,一般会采用穷举攻击,如果迭代轮数过少,会降低攻击难度。

  • 硬件水平完全可以承载该部分的负担,所以经过权衡利弊使用16轮。

题目二:设计一个检查用户口令的随机性的工具

  1. 设计一个口令随机性的评价标准
  2. 设计算法实现该测试, 输入一个用户设定的口令, 输出评价结果。 评价
    结果可以是一个分数, 可以是个图, 也可以是……, 只要能直观地表达出该口令
    的好坏
(a)主流的用户口令强度规则设置和背景

在这里,对于一个用户口令来说,其组成的方式可以说是有各种各样的,因此对其进行随机性检测可以等同于对其进行强度测试,一个越是随机的口令其强度越强,因此在这里我们设计了如下的标准,来对用户口令进行随机性检测。

首先,在这里我参考了一下,当今主要的web网站的密码强度规则设置:

MicorSoft:

一、不包含全部或部分的用户账户名

二、长度不少于6个字符

三、至少包含以下四类中的三类字符

1、大写英文字母

2、小写英文字母

3、数字

4、非字母字符(如!、$、#、=、%等)

其它的标准大同小异,因此在这里不做过多的赘述。

可以看到,大家的思路都是类似的:

  • 考虑口令长度
  • 考虑与账户名不重复(或部分重复)
  • 包含的字符种类要尽可能多

由此我们设计如下的一套评价用户口令随机性的标准。

(b)用户口令随机性评价测试标准

首先需要说明我们的评价把一个口令的随机性分为五个维度进行描述,分别为:

  • 口令长度:一般来说口令的长度越长越能体现随机性,主要是保证样本充足,在一定程度上长度越长,得分越高,一旦超越一个阈值,即可保证统计充分。
  • 均匀分布:该项内容主要测试在输入的口令中的各个字符占整个的比例,观察是否平均分布。该维度主要是用于观察口令中的重复字符数。若重复的字符越少,即字符均只在口令中出现一次,我们可以认为该口令的随机性越好,因此该项得分越高则说明越均匀分布。
  • 字符类型:该项内容主要是测试输入的口令是否包括几类的密钥允许字符。若包含的字符种类越多,则可以认为其随机性越好。该项得分和字符种类有关。
  • 不规则性:该项主要是测试口令的分布是否为按照某种特定模式。特定模式的口令往往易于被Hack猜到进而缩小密钥空间,导致口令安全性下降。该维度得分越高,则说明口令的不规则性
  • 字典测试:该项内容尝试对密钥进行字典攻击,字典中包含了一些常用的有规则的密钥,若能被字典攻破则说明随机性不够强。该项得分越高,则说明随机性越强。

下面我们再来仔细讲解每一维度的具体衡量标准:

  • 口令长度

    该特性主要由口令的长度来体现。对于随机性测试而言,首先就要保证口令的长度大于一个定值,这样子进行随机性测试才有意义。并且对于一般的密码破解而言,其采取的方式之一即为暴力破解,强行穷举所有可能的口令来达到破解的目的,因此在这里我们考虑测试用户口令的长度,一般认为用户的口令越长,那么该口令的安全性越高,但是需要注意的问题是,在于我们的安全系统中,由于存储的需要,一般要求用户的口令不能过长,否则会超出限定的存储空间,而且对于用户自身而言,记忆起来也会更加困难。

    实际上长度对于随机性的影响并不大,只要超过了一定的长度,均认为有效,所以做了一个开根号乘十平滑处理。

    g r a d e _ i n i t = ( k e y _ l e n / l e n _ m a x ) ∗ 100 grade\_init = (key\_len/len\_max)*100 grade_init=(key_len/len_max)100

    g r a d e _ f i n a l = g r a d e _ i n i t 2 grade\_final = \sqrt[2]{grade\_init} grade_final=2grade_init

  • 频率分布性

    该特性主要是测试用户口令的字符分布。对于随机性测试而言对于用户口令来说,一般随机性越强的口令其字符越均匀。且若其重复的字符越多,则往往会造成口令的安全性较低,虽然更加容易记住,但也是会易于被他人窃取。因此在这里我们统计用户口令的频率分布,倘若频率分布越均匀,则可以认为用户口令的安全性越高,这里的得分主要由重复的字符数决定。

    这里我们采用了熵值来衡量随机性,热力学第二定律。

    熵值的计算:

    H ( X ) = Σ i P i ∗ L o g 2 1 / P i H(X) = \Sigma_i P_i*Log_2 1/P_i H(X)=ΣiPiLog21/Pi

    $Max{H(X) }= Log_2||X|| $

    g r a d e = 100 ∗ ( H ( X ) / M a x H ( X ) ) grade = 100*(H(X) / MaxH(X)) grade=100(H(X)/MaxH(X))

    def check_key_frequency_distribution(key):
        key_init = list(key)
        key_list = list(set(key))
        diff_key_len = len(key_list)
        key_dict = dict.fromkeys(key_list, 0)
        for x in key_list:
            num = 0
            for i in key_init:
                if (str(x) == str(i)):
                    num = num + 1
            key_dict[x] = num/len(key)
        entropy = 0
        print(key_dict)
        for akey, avalue in key_dict.items():
            entropy = entropy + scipy.log2((1/avalue))*avalue
        return 100*(entropy/scipy.log2(len(key)))
    

    一个统计实例

  • 字符复杂性

    该特性主要体现用户口令所使用的字符种类的数目。我们很容易想到,对于一个用户口令来说,所使用的字符种类越多,其随机性越高,且其安全性越强。一般的弱口令都包括一些由纯数字,纯字母组成的口令,这样往往会使口令空间较小,密码破解工作变得更加简单。且在这里,我们将用户口令所使用的字符分为以下种类:

    • 数字:1~9

    • 小写字母:a-z

    • 大写字母:A-Z

    • 部分特殊字符:如波浪号,感叹号等等。

      在这里需要特殊说明,部分特殊字符应该不予作为密码输入。因为在SQL注入攻击中,往往就会使用这些特殊字符来对网站进行爆库。之所以可以这样做,是由于在SQL语法中,特定的字符是作为SQL的保留符使用的,如+,=,“等等。若使用了这些字符,但网站管理员没有对输入字符进行特定地限制和保护,就会使得网站的安全性无从可求。

      在这里我们把得分分成了四个等级:

      包含字符种类/种得分
      125
      250
      375
      499

  • 口令不规则性

    这里主要是考虑到用户的输入习惯问题。对于用户来说,一般为了便于记忆,往往会采用一些具有特殊形式的字符串作为口令,主要的形式为:

    • “0-9”或者“a-z”:纯数字或者纯字母的随机性比较差。
    • “a-z”+“1-9"或者"0-9”+“a-z”: 这种组合一般是姓名缩写或者有规律字符串加上电话号码,因此规律性较强,破解起来也较为容易,随机性也比较差。
    • “a-z”+“1-9”+“a-z”或者“0-9”+”a-z“+”0-9“:同理

    在这里我们分为了如下几个等级:

    字符模式正则表达式得分
    “a-z”或“0-9”[0-9]*$|[a-zA-Z]*$25
    “a-z”+“1-9"或"0-9”+“a-z”[a-zA-Z]+[0-9]*$|[0-9]+[a-zA-Z]*$50
    “a-z”+“1-9”+“a-z”或“0-9”+”a-z“+”0-9“[a-zA-Z]+[0-9]+[a-zA-Z]*$|[0-9]+[a-zA-Z]+[0-9]*$75
    其它100

    包含特定的格式如(日期,电话等等):

    字符模式正则表达式得分
    电话\d{3}-\d{8}|\d{4}-\d{7}扣15分
    日期19+\d{1}|20+\d{1}扣5分
    邮编[1-9]\d{5}(?!\d)扣10分

  • 字典测试

    这里我们收集了222万条的常用口令,用于对口令进行测试。这222万条的口令,一般都是那种规则性比较强的口令。

    这里我们的得分主要由两种可能:

    • 如若口令可以被字典破解,那么得分的组成为:

      g r a d e = 10 + 50 ∗ ( t i m e _ s u c c e e d / t i m e _ b a s e ) grade = 10 + 50*(time\_succeed/time\_base) grade=10+50(time_succeed/time_base)

      其 中 t i m e _ s u c c e e d 为 在 找 到 字 典 中 的 口 令 所 需 要 的 时 间 , 而 t i m e _ b a s e 为 遍 历 整 个 字 典 中 的 所 有 口 令 所 需 要 的 时 间 其中time\_succeed为在找到字典中的口令所需要的时间,而time\_base为遍历整个字典中的所有口令所需要的时间 time_succeedtime_base

    • 若口令没有被破解,可以认为该口令的随机性在该方面较好,因此得分为:

      g r a d e = 100 grade = 100 grade=100

©评价体系的实例

下面我们利用几个口令来测试我们体系的有效性:

  • password = “abcedfghijk”

    可以看到,该口令的均匀分布性很好,但是随机性还是很差,易于被字典攻击,且包含的字符种类很少,且纯字母口令的随机性很差。

    key_abcdefg

  • password = “rusisong6257976”

rusisong6257976

  • password = “rss123abc”

    Figure_12

  • password = “sdefAG12#@OP89&lmn0”

    100

2、实验创新点分析及实验总结

下面我们来分析本次实验的一些创新之处以及不足需要改进的地方:

题目一分析:

在我的实验设计中的一些优点有:

  • DES加/解算法采用了unicode编码,使得加密内容也可以是中文,对于各种的特殊字符和文字的兼容性也变得更高,DES的实用性更强。
  • 在对于DES的雪崩效应的研究中,我采用了多个明密文对进行研究,排除了明密文对于实验结果的影响。并且在研究过程中,选择了多个位置的单比特变换,保证了比特的变化位置没有对实验结果产生影响。
  • 额外补充研究了S盒对于雪崩效应的影响,对于迭代轮数的设定以及特定密文的变化没有产生雪崩效应的原因进行了探讨。

当然在我们的实验之中也存在一些不足之处,需要我们进行改进:

  • 加密模式单一,仅仅采用了ECB的加密模式,没有考虑加密模式对于雪崩效应的影响。应该多做几组实验,考虑采用不同加密模式时的变化。
  • 没能够做出一个GUI界面。在终端内进行操作,体验不够好。
题目二分析:

本次实验设计的一些优点:

  • 在我的随机性测试的标准采用了五个维度的特征,对于一个口令的好坏判断利用了一个五维的雷达图进行展示,较为直观,展示效果更加好。
  • 多个维度综合考虑了一系列的可能,随机性检测的效果较好。
  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是使用Python实现AES和DES的示例代码: AES加密解密示例代码: ```python from Crypto.Cipher import AES import base64 # 加密函数 def aes_encrypt(key, data): cipher = AES.new(key.encode('utf-8'), AES.MODE_ECB) data = data.encode('utf-8') # 补全16位 length = 16 - (len(data) % 16) data += bytes([length]) * length ciphertext = cipher.encrypt(data) # 转换为base64编码 return base64.b64encode(ciphertext).decode('utf-8') # 解密函数 def aes_decrypt(key, ciphertext): cipher = AES.new(key.encode('utf-8'), AES.MODE_ECB) # 解码base64 ciphertext = base64.b64decode(ciphertext) data = cipher.decrypt(ciphertext) # 去除补位 length = data[-1] data = data[:-length] return data.decode('utf-8') # 测试 key = '0123456789abcdef' data = 'hello world' ciphertext = aes_encrypt(key, data) print(ciphertext) plaintext = aes_decrypt(key, ciphertext) print(plaintext) ``` DES加密解密示例代码: ```python from Crypto.Cipher import DES import base64 # 加密函数 def des_encrypt(key, data): cipher = DES.new(key.encode('utf-8'), DES.MODE_ECB) data = data.encode('utf-8') # 补全8位 length = 8 - (len(data) % 8) data += bytes([length]) * length ciphertext = cipher.encrypt(data) # 转换为base64编码 return base64.b64encode(ciphertext).decode('utf-8') # 解密函数 def des_decrypt(key, ciphertext): cipher = DES.new(key.encode('utf-8'), DES.MODE_ECB) # 解码base64 ciphertext = base64.b64decode(ciphertext) data = cipher.decrypt(ciphertext) # 去除补位 length = data[-1] data = data[:-length] return data.decode('utf-8') # 测试 key = '01234567' data = 'hello world' ciphertext = des_encrypt(key, data) print(ciphertext) plaintext = des_decrypt(key, ciphertext) print(plaintext) ``` 注意:这里仅提供示例代码,实际使用需要根据具体情况进行调整和优化。同时,使用对称密码算法时,需要注意密钥的安全性和保密性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值