浅析密码与加密

176 阅读8分钟

为什么是浅析,今天只是做一个简单的介绍,加密算法有很多,而且很复杂,一次肯定讲不完,主要就是让大家大概了解一下,后续会有详细讲解。

加密算法发展史

古代加密算法

阴符

周朝(3000多年前) - 姜子牙

将要表达的军事机密由长短不一的竹片替代,由于无文字无图案,不用担心泄露机密,这就是最初的密码

凯撒密码

凯撒是个著名的军事家,著名的凯撒大帝,公元前100年左右,他发明的这个密码。

凯撒密码不是最早的,但凯撒密码是首个广泛运用到军事通信领域的加密技术。

明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。

PJ方式也很简单,暴力穷举25次就能PJ出来

现代加密算法

对称加密算法

什么是对称加密?加密和解密使用相同密钥的加密算法。比如上面的凯撒密码

对称加密的安全性不仅取决于加密算法,密钥也很重要。

常见对称加密

DES、3DES、AES

DES已经不推荐使用了,时间关系,这次主要介绍AES

AES(Advanced Encryption Standard):高级加密标准

aes大家在平时开发时应该都使用过,使用的时候都会有一个密钥,用它来加密我们的数据。

填充方式:NoPadding、PKCS5Padding

我们在使用AES的时候会有一些疑问,

1、密钥长度必须是16字节,为什么?

因为我们一般使用的是AES-128,对应的密钥长度是16字节,16*8=128位

除了AES-128之外,还有AES-192,密钥长度要求是24字节,AES-256对应密钥32字节,他们的区别就是加密强度不一样,速度和消耗资源也不一样

2、NoPadding、PKCS5Padding、ISO10126Padding这些是什么?

回答这个问题之前,我们需要了解的是,aes加密,并不是一次把整个明文加密成一段密文,而是把明文拆分成一个个独立的明文块,每一个明文块长度128bit,也就是16字节。这些明文块经过AES加密器复杂处理,生成一个个独立的密文块,这些密文块拼接在一起,就是最终的AES加密的结果。

但是,我们的明文不一定就是128的倍数,最后一组不够128怎么办?这就需要进行填充(padding)

几种典型的填充方式:

​NoPadding​​​: 不做任何填充,但是要求明文必须是16字节的整数倍。​​PKCS5Padding​​​(默认): 如果明文块少于16个字节(​​128bit​​),在明文块末尾补足相应数量的字符,且每个字节的值等于缺少的字符数。 比如明文:{1,2,3,4,5,a,b,c,d,e},缺少6个字节,则补全为{1,2,3,4,5,a,b,c,d,e,6,6,6,6,6,6 }

​ISO10126Padding​​​:如果明文块少于16个字节(​​128bit​​),在明文块末尾补足相应数量的字节,最后一个字符值等于缺少的字符数,其他字符填充随机数。比如明文:{1,2,3,4,5,a,b,c,d,e},缺少6个字节,则可能补全为{1,2,3,4,5,a,b,c,d,e,5,c,3,G,$,6}

3、初始化向量(IV)是什么?为什么长度也是16字节?

我们平时使用aes加密的时候,有时候只需要传进去一个密钥就可以加密,有时候还需要传一个叫iv的东西,而且必须是16字节,这是为什么?

这就要说到AES的加密模式了:ECB、CBC、CFB、OFB、CTR

我们常用的就是ECB和CBC

ECB模式:Electronic Code Book mode(电子密码本模式)

ECB是最简单的加密模式,明文消息被分成固定大小的块(分组),并且每个块被单独加密。  每个块的加密和解密都是独立的,且使用相同的方法进行加密,所以可以进行并行计算,但是这种方法一旦有一个块被PJ,使用相同的方法可以解密所有的明文数据,安全性比较差。

CBC模式:Cipher Block Chaining mode(密码分组链接/密码块 模式)

CBC模式中每一个分组要先和前一个分组加密后的数据进行XOR异或操作,然后再进行加密 。 这样每个密文块依赖该块之前的所有明文块,为了保持每条消息都具有唯一性,在第一个块进行加密之前需要用初始化向量IV进行异或操作 。 CBC模式是一种最常用的加密模式,它主要缺点是加密是连续的,不能并行处理。

到这里,就可以回答上面的问题了,为什么IV是16字节,因为每个分组是16字节的,它必须也得时16字节。

总结一下:

首先AES是分组加密的

然后,AES的三个概念,密钥、填充、加密模式

密钥:16字节、24字节、32字节,分别对应aes128、aes192、aes256

填充:NoPadding、PKCS5Padding、PKCS7Padding、ISO10126Padding,默认PKCS5Padding

加密模式:ECB、CBC(推荐)

所以我们以后使用AES,达成一致,使用AES128/PKCS5Padding/CBC

AES加密安全吗?

128位密钥,其可能性总共2^128=3.4×10^38。平均PJ次数那就是除以2了,1.7×10^38。现在最厉害的超算之一是天河二号,排名前五,其极限速度是每秒运算6亿亿次。这个速度是指最简单的运算,那就是整数加法。普通电脑CPU主频4GHz,极限速度就是40亿次运算每秒。如果是8核CPU就乘以8。那么一台天河二号超算大约相当于1百万台普通电脑。

概括一下,AES-128加密平均需要穷举1.7×1038次可以PJ。一台天河二号超算极限运算速度一秒6*1016次。这个运算是指整数加法运算,我们就姑且把复杂的AES解密看作加法这么简单吧。接下来就是一看就懂的算式:1.7×10^38÷6×10^16=2.8×10^21秒。即90万亿年。

非对称加密算法

非对称加密的意思是使用两个不同的密钥进行加密和解密。

非对称加密算法有RSA、DSA、ECC、DH,常用的是RSA。

RSA是一种非对称加密算法,是由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)在1977年一起提出,并以三人姓氏开头字母拼在一起组成的。

举个例子

你可以说任意一个三位数 * 91,告诉我后三位,就能反推出原来的数:

123*91=11193

可以看出加密解密都用到了N,如果n可以被因数分解,d就可以算出,也就意味着私钥被PJ,可是,大整数的因数分解,是一件非常困难的事情。

目前已知分解出来的最大整数是长度232的整数,二进制位是768位,2009年

240长度的整数,二进制数是795位,2020年计算出来

RSA现在普遍使用的是RSA2048,至少几十年之内是安全的,即使几十年以后,可能到时候使用的是RSA4096

哈希算法

将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法。

常见的有MD5(message-digest algorithm 5, 消息摘要算法)和SHA(Secure Hash Algorithm, 安全散列算法)

SHA又分为SHA1、SHA2(SHA256、SHA512)

为什么MD5和SHA1不安全?

不安全不是说它能够反推出原文,而是他们存在碰撞。

什么是碰撞呢?意思就是存在两个不同的原文,加密之后的值是一样的。

为什么会存在这种情况?因为密文长度是有限的,而原文是无限的,肯定存在无穷多的原文都能得到一样的密文。

理论上所有的这种哈希算法都存在这个问题,只是难度不一样,目前MD5和SHA1都已经有算法可以找到相同的

谷歌在2017年宣布攻破SHA1,他们创建出两个不同的文件,但是SHA1值是相同的。