草庐IT

密码分析(一):差分密码分析

网安小蔡不辅 2023-04-20 原文

文章目录

差分分析是一种选择明文攻击,其基本思想是:通过分析特定明文差分对相对应密文差分影响来获得尽可能大的密钥。它可以用来攻击任何由迭代一个固定的轮函数的结构的密码以及很多分组密码(包括DES),它是由Biham和Shamir于1991年提出的选择明文攻击。


一、选择明文攻击(chosen-plaintext attack, CPA)

通过选择对攻击有利的特定明文及对应的密文,求解密钥或从截获的密文求解相应明文的密码分析方法。

在选择明文攻击时,密码分析者对明文有选择或控制的能力,可选择他认为有利于攻击的任何明文及其对应的密文,是一种比已知明文攻击更强的攻击方式。如果一个密码系统能够抵抗选择明文攻击,那么必然能够抵抗唯密文攻击和已知明文攻击。

选择明文攻击较难实现。一种情形是假设密码分析者临时获得加密机器的访问权,但加密密钥被安全嵌入在设备中,分析者得不到密钥,此时可通过加密大量选择的明文,然后利用产生的密文来推测密钥。

已知: P 1 , C 1 = E k ( P 1 ) , P 2 , C 2 = E k ( P 2 ) , . . . , P i , C i = E k ( P i ) P_1,C_1=E_k(P_1),P_2,C_2=E_k(P_2),...,P_i,C_i=E_k(P_i) P1,C1=Ek(P1),P2,C2=Ek(P2),...,Pi,Ci=Ek(Pi),其中, P 1 , P 2 , . . . , P i P_1,P_2,...,P_i P1,P2,...,Pi可由密码分析者选择。
推导出:密钥K,或从 C i + 1 = E k ( P i + 1 ) C_{i+1}=E_k(P_{i+1}) Ci+1=Ek(Pi+1) 推导出 P i + 1 P_{i+1} Pi+1的算法。

典型的选择明文攻击方法有碰撞攻击和差分攻击等。本篇主要讲解差分攻击的原理,过程以及实例。

二、差分密码分析(differential cryptanalysis)

1.原理

差分分析的目标是获得加密的子密钥。
差分分析最早由Murphy于1990年提出,随后 Biham 和 Shamir 又在一系列研究里对该技术进行了发展,适用于过度使用异或操作的分组密码算法。

所谓差分分析,是指追踪明文对的“差异”的传播。这里的“差异”由我们根据目标进行定义,可以是异或值,也可以是其它。针对DES,使用的就是异或值定义“差异”,或者称之为“距离”,有些地方也称为“特征”(characteristic)。

比如说,选定明文 P 1 P_1 P1,明文之间的“差值”(differential)为 δ \delta δ,于是另一个明文就是 P 1 + δ P_1+\delta P1+δ,明文 P 1 P_1 P1对应的密文为 C 1 C_1 C1,明文 P 1 + δ P_1+\delta P1+δ对应的密文与 C 1 C_1 C1的“距离”是 ε \varepsilon ε
P 1 → C 1 P 1 + δ → C 1 + ε P_1 \rarr C_1 \newline P_1+\delta \rarr C_1+\varepsilon P1C1P1+δC1+ε
如果 δ \delta δ 以一定的概率对应着 ε \varepsilon ε,就称 δ \delta δ 是一个差分特征。其实这个过程主要关注的是非线性函数,AES中主要是S盒非线性,DES是Feistel结构中的F函数。

2.过程

一般的S盒是以2进制进行表示的,即 π s : { 0 , 1 } m → π s : { 0 , 1 } n \pi_s:{\{0,1\}}^m \rarr \pi_s:{\{0,1\}}^n πs:{0,1}mπs:{0,1}n是一个S盒,对二进制的S盒的攻击很多文献都有给出,也可参考《密码学原理与实践(第三版)》3.4 差分密码分析。本文以下面10进制内的S盒为例,讲解差分攻击的主要过程。

x x x0123456789
S [ x ] S[x] S[x]2687149530

2.1 S盒差分分布表

来学嘉等人在文献1 中给出了一般意义下的差分概念,即对群 ( G , ⋅ ) (G,\cdot) (G,)中的两个元素 X , X ∗ X,X^* X,X, X X X X ∗ X^* X的差分定义为 Δ X = X ⋅ ( X ∗ ) − 1 \Delta X = X \cdot (X^*)^{-1} ΔX=X(X)1
Granboulan等人2 研究提出了当分组不是比特串时的通用框架,就像我们使用的是十进制数。使用一个 q × q q \times q q×q的矩阵 Δ \Delta Δ模拟S盒的差异, Δ \Delta Δ定义如下:
Δ ( S ) a , a ′ = # { x ∣ S ( x + α ) − S ( x ) = β } \Delta(S)_{a,a'} =\# \{x|S(x+\alpha)-S(x) = \beta\} Δ(S)a,a=#{xS(x+α)S(x)=β}
矩阵的最大项 D ( S ) D(S) D(S)定义为: D ( S ) = m a x ( α , β ) ≠ { 0 , 0 } Δ ( S ) α , β D(S) = max_{(\alpha,\beta)\neq\{0,0\}} \Delta(S)_{\alpha,\beta} D(S)=max(α,β)={0,0}Δ(S)α,β,则相应的最大差分概率定义为 D P ( S ) = D ( s ) / q DP(S)=D(s)/q DP(S)=D(s)/q
通过以上定义,我们可以知道 q = 10 q=10 q=10我们计算出S盒的 q × q q \times q q×q矩阵 Δ \Delta Δ

% MATLAB  
S = [2 6 8 7 1 4 9 5 3 0];        %S盒

for i = 1:10         					 %行
    for j = 1:10						 %列
        n = 0;							 %前面公式中的#表示符合条件的x的个数
        for x = 1:10					 %遍历x
        	% S(x+a)-S(x) = a'
            if mod(S(mod(x+j-2,10)+1)-S(x),10) == i-1
                n = n + 1;
            end
        end
        N(i,j) = n; 
    end
end

最后我们得出S盒的差分分布表:

从表中可以看出,S盒的每一列之和为10,由上述公式所以我们可以得出 Δ \Delta Δ矩阵的最大项 D ( S ) = 2 D(S) = 2 D(S)=2,最大差分概率 D P ( S ) = D ( S ) / q = 2 − 2.3219 DP(S) = D(S)/q = 2^{-2.3219} DP(S)=D(S)/q=22.3219,最大值差分值越小表明 S 盒的差分均匀性越好,抗差分攻击能力越强。可以看出此S盒的差分分布表相对来说是比较均匀的。
定义 P S ( α → β ) = Δ ( S ) α , β / q P_S(\alpha \rarr \beta)=\Delta(S)_{\alpha, \beta}/q PS(αβ)=Δ(S)α,β/q,即为输入差分 α \alpha α经过S盒后将以 P S ( α → β ) P_S(\alpha \rarr \beta) PS(αβ)的概率得到输出差分 β \beta β。如果 P S ( α → β ) > 0 P_S(\alpha \rarr \beta)>0 PS(αβ)>0,则差分 α \alpha α经S盒可传播至差分 β \beta β,如果 P S ( α → β ) = 0 P_S(\alpha \rarr \beta)=0 PS(αβ)=0,则差分 α \alpha α经S盒不能传播至差分 β \beta β

知道了S盒的一组输入差分和输出差分 ( α , β ) (\alpha ,\beta) (α,β),我们就可以知道哪些具体的输入值 x x x会导致输入差分 α \alpha α传播至输出差分 β \beta β

S盒的差分分布表实际上是研究满足特定差分的随机输入对经过S盒作用后输出对的差分分布特性。

2.2 S盒的差分分析

明文为 x x x,密钥为 k k k,密文为 y = S ( x + k ) y = S(x+k) y=S(x+k)。假设攻击者可以选择若干明文 x 1 , x 2 , . . . , x t x_1,x_2,... ,x_t x1,x2,...,xt,但不能获得相应的密文 y 1 , y 2 , . . . , y t y_1,y_2,... ,y_t y1,y2,...,yt,只能观察到某两个密文的差分,即攻击者可以获得若干三元数组 ( x i , x j , x i + x j ) (x_i,x_j,x_i+x_j) (xi,xj,xi+xj),并期望猜测密钥 k k k的若干信息。

对S盒的差分攻击主要利用了如下关键的性质: ( x + k ) − ( x ∗ + k ) = x + x ∗ (x+k) - (x^*+k) = x+x^* (x+k)(x+k)=x+x,在这种攻击模型下面,要恢复密钥就要用到上面提到的

知道了S盒的一组输入差分和输出差分 ( α , β ) (\alpha ,\beta) (α,β),我们就可以知道哪些具体的输入值 x x x会导致输入差分 α \alpha α传播至输出差分 β \beta β

下面详细的讲解这个攻击。
观察差分分布表,注意到当输入差分 α = 1 \alpha=1 α=1时输出差分有8种可能,即
1 → 2 , 1 → 3 , 1 → 4 , 1 → 5 , 1 → 6 , 1 → 7 , 1 → 8 , 1 → 9 1 \rarr 2,1 \rarr 3,1 \rarr 4, 1 \rarr 5, \newline 1 \rarr 6, 1 \rarr 7, 1 \rarr 8, 1 \rarr 9 12,13,14,15,16,17,18,19
所以我们可以给出输入差分 α = 1 \alpha=1 α=1时,输出差分 β \beta β的分布

输出差分 β \beta β关于 ( α , β ) 的 明 文 对 (\alpha,\beta)的明文对 (α,β) Δ ( S ) α , β \Delta(S)_{\alpha, \beta} Δ(S)α,β
21, 92
341
40,32
551
661
781
871
921
其他 ∅ \varnothing 0

现在假设机密所采用的密钥是 k = 4 k=4 k=4,加密过程如下:
若已知一对明文输入为 x 1 = 1 x_1 = 1 x1=1 x 1 ∗ = 2 x_1^* = 2 x1=2,则加密流程为
x 1 = 1 , z 1 = x 1 + k ( m o d 10 ) = 5 , y 1 = S ( z 1 ) = 4 x_1 = 1, z_1 = x_1 +k \pmod {10}=5,y_1=S(z_1)=4 x1=1,z1=x1+k(mod10)=5,y1=S(z1)=4
x 1 ∗ = 2 , z 1 ∗ = x 1 ∗ + k ( m o d 10 ) = 6 , y 1 ∗ = S ( z 1 ∗ ) = 9 x_1^* = 2, z_1^* = x_1^* +k \pmod {10}=6,y_1^*=S(z_1^*)=9 x1=2,z1=x1+k(mod10)=6,y1=S(z1)=9
此时输出差分 Δ y 1 = 5 \Delta y_1=5 Δy1=5

现假设攻击者获取一对明文输入 x 1 = 1 x_1 = 1 x1=1 x 1 ∗ = 2 x_1^* = 2 x1=2,但只能观察到对应的密文对的输出差分 Δ y 1 = 5 \Delta y_1=5 Δy1=5,根据输出差分想得到密钥 k k k的消息:首先明文差分 Δ x 1 = x 1 − x 1 ∗ = 1 \Delta x_1=x_1-x_1^*=1 Δx1=x1x1=1,则S盒的输入差分 Δ z 1 = z 1 + z 1 ∗ = 1 \Delta z_1=z_1+z_1^* = 1 Δz1=z1+z1=1,根据表中的信息:
1 → 5 1 \rarr 5 15当且仅当 z 1 = x 1 + k ∈ { 5 } z_1 = x_1 +k \in \{5\} z1=x1+k{5},这样就会得到 k k k的一组候选值,即 k = z 1 − x 1 ∈ { 4 } k=z_1-x_1\in \{4\} k=z1x1{4},这样直接把密钥破解出来了。
对于大型的S盒,多选择几对明文对,使用相同的密钥,得出密钥 k k k的另外几组候选值,我们可以知道,正确的密钥一定落在上述几组候选密钥的交集中,这样可以缩小密钥的范围。但如果只采用差分分布表中的某一列的信息,可能不能唯一的确定正确密钥,为了获得唯一的正确密钥,可以选择差分分布表中不同列的消息。

根据以上我们可以看出,S盒越大越好,小的S盒很容易被破解。


总结

差分密码分析是方法是攻击迭代型分组密码的最有效的方式之一,也是最基础的一种密码分析手段,同时也是衡量一个分组密码安全性的重要指标之一。差分密码分析的原理比较简单,发展至今,该方法出现了很多的变种,但万变不离其宗,本质上就是研究差分在加解密过程中的概率传播特性。

本文仅仅列出了破解简单S盒的一个实例,而且S盒只有一轮,如果有时间,会更新!!!!!
希望对阅读本文的小伙伴们有帮助,如果有什么错误或者问题,欢迎大家评论转发!!!!!!

参考文献


  1. Lai X . Markov Ciphers and Differential Cryptanalysis[J]. Advances in Cryptography-EUROCRYPTO '91, 1992. ↩︎

  2. Granboulan L, Levieil E´, Piret G (2006) Pseudorandom per-mutation families over Abelian groups. In: Robshaw MJB (ed)Fast software encryption, 13th international workshop, FSE 2006,Graz, Austria, March 15–17, 2006, Revised Selected Papers, Lecture Notes in Computer Science, vol 4047. Springer, pp 57–77 ↩︎

有关密码分析(一):差分密码分析的更多相关文章

  1. ruby-on-rails - 在 Rails 中自定义 "Password confirmation doesn' t 匹配密码 - 2

    有没有办法在Rails中为确认字段自定义消息?例如在设计中我必须输入密码和password_confirmation并且错误消息是:Passwordconfirmationdoesn'tmatchPassword我可以更改事件记录语言环境消息(“不匹配”),但它会在该语言环境消息的开头和结尾输出密码确认和密码,所以我得到如下内容:"PasswordconfirmationmustmatchPassword"有没有办法将其更改为不同的字符串?PasswordconfirmationandPasswordmustmatch.编辑另一件事是拥有完全自定义的消息,例如:'Setpassword

  2. ruby-on-rails - 我如何比较 'Bcrypt' Gem解密的密码和加密的密码 - 2

    我正在尝试对某些帖子的评论使用简单的身份验证。用户使用即时ID和密码输入评论我使用“bcrypt”gem将密码存储在数据库中。在comments_controller.rb中像这样@comment=Comment.new(comment_params)bcrypted_pwd=BCrypt::Password.create(@comment.user_pwd)@comment.user_pwd=bcrypted_pwd当用户想要删除他们的评论时,我使用data-confirm-modalgem来确认数据在这部分,我必须解密用户输入的密码以与数据库中的加密密码进行比较我怎样才能解密密码,

  3. ruby-on-rails - 如何在记录更新期间从验证中排除密码字段? ( rails 3.0.4, ruby 1.9.2) - 2

    我有一个允许更新用户记录的表单。它包含:password和:password_confirmation字段,但我不希望在数据库中已存储加密密码时对它们运行验证。View文件中的字段:'ConfirmPassword'%>在互联网上搜索时,我发现了这段代码,我认为它是针对以前版本的Ruby/Rails的。(我会把它放在我的用户模型中。)validates_presence_of:password,:on=>create由于我的用户模型中密码验证的语法不同(如下),我对我需要的语法感到困惑。validates:password,:presence=>true,:confirmation=>

  4. ruby-on-rails - Devise 在更改密码后注销用户 - 2

    我正在使用devise,当用户更改密码时,网站会将他们注销。我在网上读到,添加sign_in可以解决问题但不起作用,并且当密码更改时用户会注销。这是我的代码if@user.errors[:base].empty?and@user.update_attributes(params[:user])sign_in(current_user,:bypass=>true)flash[:success]="Useraccounthasbeensuccessfullyupdated"redirect_toedit_user_path(params[:site_id],@user)elserender

  5. ruby - 存储外部 API 的密码 - 最佳实践 - 2

    如果我构建了一个应用程序来访问来自Gmail、Twitter和Facebook的一些数据,并且我希望用户只需输入一次他们的身份验证信息,并且在几天或几周后重置,那会怎样是在Ruby中动态执行此操作的最佳方法吗?我看到很多人只是拥有他们客户/用户凭证的配置文件,如下所示:gmail_account:username:myClientpassword:myClientsPassword这看起来a)非常不安全,b)如果我想为成千上万的用户存储此类信息,它就无法工作。推荐的方法是什么?我希望能够在这些服务之上构建一个界面,因此每次用户进行交易时都必须输入凭据是不可行的。

  6. 建模分析 | 平面2R机器人(二连杆)运动学与动力学建模(附Matlab仿真) - 2

    目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标

  7. ruby-on-rails - 最灵活的 Rails 密码安全实现 - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于StackOverflow来说是偏离主题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,describetheproblem以及迄今为止为解决该问题所做的工作。关闭8年前。Improvethisquestion我需要实现具有各种灵活需求的密码安全。这些要求基本上取自Sanspasswordpolicy:Strongpasswordshavethefollowingcharacteristics:Containatleastthreeofthe

  8. 网站日志分析软件--让网站日志分析工作变得更简单 - 2

    网站的日志分析,是seo优化不可忽视的一门功课,但网站越大,每天产生的日志就越大,大站一天都可以产生几个G的网站日志,如果光靠肉眼去分析,那可能看到猴年马月都看不完,因此借助网站日志分析工具去分析网站日志,那将会使网站日志分析工作变得更简单。下面推荐两款网站日志分析软件。第一款:逆火网站日志分析器逆火网站日志分析器是一款功能全面的网站服务器日志分析软件。通过分析网站的日志文件,不仅能够精准的知道网站的访问量、网站的访问来源,网站的广告点击,访客的地区统计,搜索引擎关键字查询等,还能够一次性分析多个网站的日志文件,让你轻松管理网站。逆火网站日志分析器下载地址:https://pan.baidu.

  9. ABB-IRB-1200运动学分析MATLAB RVC工具分析+Simulink-Adams联合仿真 - 2

    一、机器人介绍        此处是基于MATLABRVC工具箱,对ABB-IRB-1200型号的微型机械臂进行正逆向运动学分析,并利Simulink工具实现对机械臂进行具有动力学参数的末端轨迹规划仿真,最后根据机械模型设计Simulink-Adams联合仿真。 图1.ABBIRB 1200尺寸参数示意图ABBIRB 1200提供的两种型号广泛适用于各作业,且两者间零部件通用,两种型号的工作范围分别为700 mm 和 900 mm,大有效负载分别为 7 kg 和5 kg。 IRB 1200 能够在狭小空间内能发挥其工作范围与性能优势,具有全新的设计、小型化的体积、高效的性能、易于集成、便捷的接

  10. 关于Qt程序打包后运行库依赖的常见问题分析及解决方法 - 2

    目录一.大致如下常见问题:(1)找不到程序所依赖的Qt库version`Qt_5'notfound(requiredby(2)CouldnotLoadtheQtplatformplugin"xcb"in""eventhoughitwasfound(3)打包到在不同的linux系统下,或者打包到高版本的相同系统下,运行程序时,直接提示段错误即segmentationfault,或者Illegalinstruction(coredumped)非法指令(4)ldd应用程序或者库,查看运行所依赖的库时,直接报段错误二.问题逐个分析,得出解决方法:(1)找不到程序所依赖的Qt库version`Qt_5'

随机推荐