密码学简单入门

580 阅读11分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情

密码学简单入门

对称密码学

对称密码学的核心是对称加密算法。对称加密算法是应用较早的加密算法,技术成熟。在对称加密算法中,数据发送方将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。接收方收到密文后,若想解读原文,则需要使用加密过程中用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,使用的密钥只有一个,发、收双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥。

原理与特点

image-20220519141201991

对称加密算法的特点是算法公开、计算量小、加密速度快、加密效率高。对称加密算法的不足之处是,通信双方都使用同样的钥匙,因此密钥交换或者说密钥管理比较困难,安全性很难得到保证。此外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的唯一密钥,这会使得发、收信双方所拥有的密钥数量呈几何级数增长,密钥管理成为用户的负担。

image-20220519141247614

举例

典型的对称加密算法包括DES算法、3DES算法、TDEA算法、Blowfish算法、RC5算法、IDEA算法、AES加密算法等。

DES算法又称为美国数据加密标准,是1972年由美国IBM公司研制的对称密码体制加密算法。明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数个1),分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。

image-20220519141355772

DES算法入口参数有三个:key、data、mode。key为加密和解密使用的密钥,data为加密和解密的数据,mode为其工作模式。当模式为加密模式时,明文按照64位进行分组,形成明文组,key用于对数据加密;当模式为解密模式时,key用于对数据解密。实际运用中,密钥只用到了64位中的56位,这样才具有很高的安全性。

DES算法把64位的明文输入块变为64位的密文输出块(分为L0和R0两部分),它所使用的密钥(用Kn表示)也是64位,整个DES算法的主流程图

image-20220519141516105

对称加密算法的核心是位置的代换和字母的替换

公钥密码学

在密码学中,公开密钥密码学,简称公钥密码学,又称非对称密码学,是使用一对公钥和私钥的密码学,与只用一个秘密密钥的密码学相对应。

原理与特点

公钥算法是基于数学函数而不是基于替换和置换,更重要的是公钥密码是非对称的,它使用两个独立的密钥。使用两个密钥在消息的保密性、密钥分配和认证领域有着重要的意义。

公钥加密算法的原理

用抽象的观点来看,公钥密码就是一种陷门单向函数(trapdoor one-wayfunction)。在公钥密码中,加密密钥和解密密钥是不一样的,加密密钥为公钥,解密密钥为私钥。在公钥密码机制之中,破译已经加密后的密码应该是一个难解问题。一个问题是难解的,直观上讲,就是不存在一个计算该问题的有效算法,也可称之为按照目前的计算能力,无法在一个相对的短时间内完成,即解决这个问题所付出的成本远远超过了解决之后得到的结果。计算一个难解的问题所需要的时间一般是以输入数据长度的指数函数形式递增的,所以随着输入数据的增多,复杂度会急剧增大。对于一个问题,如果存在一个求其解的有效算法,则称其为有效问题,否则称为无效问题。

公钥密码的理论基础是陷门单向函数:设f是一个函数,如果对于任意给定的x,计算y=f(x)是容易的,但对于任意给定的y,计算f(x)=y是难解的,则称f是一个单向函数。

另外,设f是一个函数,t是与f有关的一个参数,对任意给定的x,计算y使得y=f(x)是容易的。如果当不知道参数t时,计算f的逆函数是难解的,但当知道参数t时,计算f的逆函数是容易的,则称f是一个陷门单向函数,参数t称为陷门。

举例

常见的公钥加密算法包括RSA、ElGamal、背包算法、Rabin(Rabin加密法是RSA方法的特例)、Diffie-Hellman(D-H)密钥交换协议中的公钥加密算法、EllipticCurve Cryptography(ECC,椭圆曲线加密算法)等。

当前最著名、应用最广泛的公钥系统RSA是在1978年由美国麻省理工学院的Rivest、Shamir和Adleman提出的。RSA正是这三个人名的首字母。RSA是一个基于数论的非对称密码体制,是一种分组密码体制。RSA算法是第一个既能用于数据加密也能用于数字签名的算法。RSA使用一个公钥(public key)和一个私钥(private key)。公钥加密,私钥解密,密钥长度从40 bit到2048 bit可变,加密时也把明文分成块,块的大小可变,但不能超过密钥的长度。RSA算法把每一块明文转化为与密钥长度相同的密文块。密钥越长,加密效果越好,但加密和解密的开销也大,所以要在安全与性能之间折中考虑,一般64位是较合适的。RSA的一个比较知名的应用是SSL[1],在美国和加拿大,SSL用128位RSA算法,由于出口限制,在其他地区(包括中国)通用的则是40位版本。

RSA的安全性基本大于大整数的因子分解,其基础是数论中的欧拉定理。因子分解可以破解RSA密码系统,但是目前尚无人证明RSA的解密一定需要分解因子。

RSA密钥生成过程如下

(1)选择一对不同的、足够大的素数p、q。

(2)计算n=pq。

(3)计算f(n)=(p-1)(q-1),同时对p、q严格保密,不让任何人知道。

(4)找一个与f(n)互质的数e,且1<e<f(n)。

(5)计算d,使得de≡1 mod f(n)。这个公式也可以表达为d≡e-1 modf(n)。

(6)公钥PU=(e,n),私钥PR=(d,n)。

(7)加密时,先将明文变换成0至n-1的一个整数M。若明文较长,可先分割成适当的组,然后再进行交换。设密文为C,则加密过程为C=Me(mod n)。

(8)解密过程为M=Cd(mod n)。

在RSA密码应用中,公钥PU是公开的,即e和n的数值可以被第三方窃听者得到。破解RSA密码的问题就是从已知的e和n的数值,求出d的数值,这样就可以得到私钥来破解密文。密码破解的实质问题是:只要求出p和q的值,就能求出d的值,从而得到私钥。

image-20220519182238425

哈希函数

哈希(Hash)算法(也称散列算法)的特别之处在于它是一种单向算法,用户可以通过Hash算法对目标信息生成一段特定长度的、唯一的Hash值,却不能通过这个Hash值重新获得目标信息。因此,Hash算法常用于不可还原的密码存储、信息完整性校验等。常见的Hash算法有MD2、MD4、MD5、HAVAL、SHA。MD5和SHA-1是最常见的Hash算法。MD5是由国际著名密码学家、麻省理工学院的Ronald Rivest教授于1991年设计的;而SHA-1有美国国家安全局的背景。

MD5哈希算法

MD5是计算机安全领域曾经广泛使用的一种哈希函数,为消息的完整性提供保护。对MD5加密算法的简要叙述是:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位的子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位Hash值。

MD5广泛用于各种软件的密码认证和密钥识别。MD5用的是哈希函数,它的典型应用是对一段消息(message)产生指纹(fingerprint),以防止“篡改”。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。MD5还广泛用于操作系统的登录认证,如UNIX、各类BSD系统登录密码。

MD5哈希算法的总体流程

image-20220519221613479

SHA1哈希算法

SHA1是和MD5一样流行的消息摘要算法。SHA[2]加密算法模仿MD4加密算法。SHA1设计为和数字签名算法DSA一起使用。

SHA1主要适用于数字签名标准里面定义的数字签名算法。对于长度小于264位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。SHA1无法从消息摘要中复原信息,而两个不同的消息不会产生同样的消息摘要。这样,SHA1就可以验证数据的完整性。所以,SHA1是为了保证文件完整性而提出的技术。

SHA1对于每个明文分组的摘要生成过程如下。

(1)将512位的明文分组划分为16个子明文分组,每个子明文分组为32位。

(2)申请5个32位的链接变量,记为A、B、C、D、E。

(3)16份子明文分组扩展为80份。

(4)80份子明文分组进行4轮运算。

(5)链接变量与初始链接变量进行求和运算。

(6)链接变量作为下一个明文分组的输入重复进行以上操作。

(7)最后,5个链接变量里面的数据就是SHA1摘要。

SHA1哈希算法流程图

image-20220519221803326

SHA1哈希算法可以采用不超过264位的数据输入,并产生一个160位的摘要。输入被划分为512位的块,并单独处理。160位缓冲器用来保存哈希函数的中间和最后结果。缓冲器可以由5个32位的寄存器(A、B、C、D和E)来表示。SHA1是一种比MD5更安全的算法,理论上,凡是采取“消息摘要”方式的数字验证算法都是会存在“碰撞”的——也就是两个不同的消息算出的消息摘要相同。但是安全性高的算法要找到指定数据的“碰撞”很困难,而利用公式来计算“碰撞”就更困难。

SHA1与MD5的差异主要在于:SHA1对任意长度明文的预处理和MD5的过程是一样的,即预处理完后的明文长度是512位的整数倍,但是有一点不同,那就是SHA1的原始报文长度不能超过264,然后SHA1才能生成160位的报文摘要。SHA1算法简单而且紧凑,容易在计算机上实现。

在安全性方面,SHA1所产生的摘要比MD5长32位。若两种哈希函数在结构上没有任何问题的话,SHA1比MD5更安全。

在速度方面,两种方法都是主要考虑以32位处理器为基础的系统结构。但SHA1的运算步骤比MD5多了16步,而且SHA1记录单元的长度也比MD5多了32位。因此,若是以硬件来实现SHA1,其速度大约比MD5慢了25%。

在简易性方面,两种方法都相当简单,在实现上不需要很复杂的程序或是大量存储空间。然而总体上来讲,SHA1对每一步骤的操作描述还是要比MD5简单。