从计算困难问题的视角看密码学算法
计算困难问题是理论计算机和密码学的交叉论题,密码学的加密算法都基于计算困难问题(一般来说是NP-Complete和NP-Hard问题),在这篇文章里我们将讨论计算困难问题和各种加密算法的关系,从而引出我们的观点:密码学算法其实就是利用验证容易但是求解困难的计算问题来设计的,从而使得破解者的计算代价接近密钥空间的穷搜;
计算困难问题的形式化
对于一个计算困难问题 F F F,若设他的解为 x ∗ x^{*} x∗,那么我们称 x ∗ x^{*} x∗满足 F F F; F F F的所有可能的解组成的空间称作解空间 X \mathcal{X} X;计算困难问题 F F F的求解过程即在解空间 X \mathcal{X} X里面搜索 x ∗ x^{*} x∗满足 F F F,这一过程中要尽可能利用问题的特性来加速搜索;下面列举几个例子:
-
对于旅行商问题(TSP),解空间 X \mathcal{X} X即为所有可行的路径组成的轨迹空间;
-
对于可满足性问题(SAT),解空间 X \mathcal{X} X即为所有变元(假设数量为 n n n)的真值空间 ( T , F ) n (T,F)^{n} (T,F)n;
-
对于布尔方程组求解问题,解空间 X \mathcal{X} X即为所有变元(假设数量为 n n n)的布尔值空间 ( 0 , 1 ) n (0,1)^{n} (0,1)n;
计算困难问题有个特点,验证某个可能的解 x ∈ X x \in \mathcal{X} x∈X是否是计算困难问题 F F F的解是容易的(验证是多项式级别的复杂度 O ( n c ) \mathcal{O}(n^c) O(nc),其中 c c c是常数),但是找到计算困难问题 F F F的解 x ∗ ∈ X x^{*} \in \mathcal{X} x∗∈X是困难的(求解是超多项式级别的复杂度,比如指数复杂度 O ( c n ) \mathcal{O}(c^n) O(cn),其中 c c c是常数);验证容易,可以用来设计加密解密算法,即加密算法的有效性和高效性,求解困难,则保证了安全性;
计算困难问题和密码学算法
密码学中的一个核心概念:将安全性基于计算困难问题,许多密码学算法和协议的安全性是建立在特定计算问题的难度上的;以下是一些经典的计算困难问题及其在密码学中的应用示例,注意和我们刚才说的形式化对应:
-
大整数分解(RSA算法):计算困难问题是给定一个大的合数 N N N,找到其素因数分解.解是 N N N的素因数 p p p和 q q q.密码协议应用是RSA公钥加密和数字签名.公钥包含大合数 N N N,而私钥基于 N N N的素因数 p p p和 q q q.
-
离散对数问题(Diffie-Hellman密钥交换和ElGamal加密):计算困难问题是给定一个质数 p p p,及其原根 g g g,和 g x m o d p g^x \mod p gxmodp的值,求解 x x x.对应的解x是指数 x x x,使得满足 g x m o d p g^x \mod p gxmodp.密码协议应用是Diffie-Hellman密钥交换,利用离散对数问题的难解性来安全地在不安全的信道上协商一个共享密钥.ElGamal加密也基于此问题,提供公钥加密功能.
-
椭圆曲线离散对数问题(ECC,椭圆曲线密码学):计算困难问题是给定椭圆曲线上的点 P P P和 Q = k P Q = kP Q=kP(即点 P P P的 k k k倍),求解 k k k;其解是系数 k k k,使得 Q = k P Q = kP Q=kP.而密码协议的应用,ECC提供了与RSA等系统相同安全级别的加密和数字签名,但使用更短的密钥长度.椭圆曲线版本的Diffie-Hellman和ElGamal算法也基于椭圆曲线离散对数问题.
-
哈希函数的抗碰撞性(比特币的工作量证明):计算困难问题是给定一个哈希函数 H H H和输出值的一部分(比如前 n n n位为0的哈希值),找到一个输入 x x x,使得 H ( x ) H(x) H(x)满足给定的条件.解是满足条件的输入 x x x.密码协议应用如比特币的工作量证明(Proof of Work)机制.矿工需要找到一个使得区块的哈希值满足网络当前难度条件的nonce值.这是一个计算上非常困难的问题,但一旦找到解,验证是非常快速的.
这些例子都展示了密码协议设计中一个基本原则:即通过选择特定的、已知难以解决的计算问题,来确保攻击者在没有密钥的情况下不能轻易破解加密算法或协议(但是加密解密过程是高效的).这样的设计不仅为数据传输提供了安全性保障,也为数字签名、身份认证等多种应用提供了可靠的基础.
扩域带来的非线性混淆作用
刚刚我们讨论的大都属于公钥密码学的范畴,现在我们来看看AES和DES方法除了计算困难问题之外还利用了什么技巧;首先AES加密和DES加密的破解可以看作布尔可满足性问题(SAT)的求解,实际上,把AES加密和DES加密的破解转换成SAT问题是密码分析中的一种先进技术(称之为代数攻击,建立为代数方程的形式求解也属于这个范畴),这种方法不仅仅依赖于穷举搜索,而是利用现代SAT求解器的强大能力来寻找满足特定逻辑条件的解,这些逻辑条件反映了加密算法的约束.总之,SAT求解器在很多场景的效果是不错的(比如用来求解一些交通规划问题),那么为什么AES加密能很好地对抗这种破解方法呢,这在于"非线性"带来的安全性;
在讨论加密算法是否容易受到代数攻击的影响时,算法的“非线性”特性是一个关键因素.非线性性质强的算法通常更难以用代数方法攻击,因为它们能够更好地抵抗通过代数方程简化分析过程的尝试.高度非线性的加密算法示例:
-
AES(高级加密标准):AES使用了复杂的替代-置换网络SPN结构,其S盒(Substitution boxes)设计确保了高度的非线性,因此不容易用简单的代数攻击手段破解;
-
Serpent:作为AES候选之一的Serpent提供了很高的非线性特性和多层安全保证,它通过多轮的数据变换来确保攻击的复杂度;
-
Twofish:另一个AES候选,Twofish利用了复杂的密钥依赖S盒和PHT(Pseudo-Hadamard Transform),提供高度的非线性和复杂的结构来抵抗代数攻击;
较低非线性的加密算法可能容易受到代数攻击:
-
DES(数据加密标准):DES的非线性主要来源于其S盒,但由于其较短的密钥长度56位和设计时对当时计算能力的估计不足,DES现在被认为是不够安全的,对一些形式的代数攻击较为脆弱.
-
RSA:作为一种基于大数分解难题的公钥加密算法,理论上RSA的安全性高于简单的代数攻击.然而,若RSA参数(比如密钥长度)选择不当,或者实现上存在缺陷,RSA可能会受到基于数学策略的代数攻击,如常见的分解攻击.
-
线性密码:理论性地存在一些设计上更偏向线性的密码学算法,这些算法可能直接采用了简单的线性变换.这类算法在现实中较少使用,且容易受到代数攻击.
AES高级加密标准使用了不同的设计理念,包括更大的密钥(128、192或256位)和复杂的数据块处理过程。AES的加密过程在 G F ( 2 8 ) GF(2^8) GF(28)的扩域上进行,主要通过以下几个步骤:字节替代(SubBytes)、行移位(ShiftRows)、列混淆(MixColumns)和轮密钥加(AddRoundKey).其中,字节替代使用非线性的S盒,基于 G F ( 2 8 ) GF(2^8) GF(28)上的逆元运算与仿射变换,确保了高度的非线性;列混淆步骤通过特定的多项式在 G F ( 2 8 ) GF(2^8) GF(28)上进行乘法运算,进一步增加了操作的复杂度和非线性.
将AES的操作与DES比较,确实可以看出AES在设计上引入了更高维度的数学结构(如 G F ( 2 8 ) GF(2^8) GF(28)),这不仅使得加密过程更为复杂,而且确实提高了算法的非线性程度.在有限域 G F ( 2 8 ) GF(2^8) GF(28)上的变换,相对于 G F ( 2 ) GF(2) GF(2)的操作,可以提供更强的非线性特性,这对于抵抗线性和差分密码分析攻击非常关键,为了更好地阐释这种非线性的效果,我们举个更好理解的例子.
设 C \mathbb{C} C上的线性变换 y = a x + b y = ax+b y=ax+b,其中 a , b ∈ C a,b \in \mathbb{C} a,b∈C, a = a 0 + a 1 i , b = b 0 + b 1 i a=a_{0}+a_{1}i,b=b_{0}+b_{{}1}i a=a0+a1i,b=b0+b1i; 那么再搞一个 C → R \mathbb{C} \rightarrow \mathbb{R} C→R的变换 y = y 0 + y 1 i → y ′ = y 0 2 + y 1 2 y = y_{0}+y_{1}i \rightarrow y'=y_{0}^2+y_{1}^2 y=y0+y1i→y′=y02+y12(相当于加密);那么由 y ′ y' y′还原恢复 x x x是可行的,因为 a 0 , a 1 , b 0 , b 1 a_{0},a_{1},b_{0},b_{1} a0,a1,b0,b1已知的情况下(相当于密钥),此时还原恢复 x x x就是解一个 R \mathbb{R} R上的一元二次方程(相当于解密);此时回头看,你会发现这个toy级别的加密算法里, C \mathbb{C} C上的线性变换 y = a x + b y = ax+b y=ax+b相当于 R \mathbb{R} R上的非线性变换,这种非线性增加了破解的复杂度;如果放大密钥长度,这个复杂度就会很可观,AES加密算法的技巧和这个例子类似.
补注:这里 y = a x + b = a 0 x + b 0 + ( a 1 x + b 1 ) i y = ax+b = a_{0}x+b_{0}+(a_{1}x+b_{1})i y=ax+b=a0x+b0+(a1x+b1)i;而 y ′ = y 0 2 + y 1 2 = ( a 0 x + b 0 ) 2 + ( a 1 x + b 1 ) 2 y'= y_{0}^2+y_{1}^2 = (a_{0}x+b_{0})^2 + (a_{1}x+b_{1})^2 y′=y02+y12=(a0x+b0)2+(a1x+b1)2;那么已知密文 y ′ y' y′和密钥 a 0 , a 1 , b 0 , b 1 a_{0},a_{1},b_{0},b_{1} a0,a1,b0,b1时恢复明文 x x x 就是解一个一元二次方程;