为什么是浅析,今天只是做一个简单的介绍,加密算法有很多,而且很复杂,一次肯定讲不完,主要就是让大家大概了解一下,后续会有详细讲解。
加密算法发展史
古代加密算法
阴符
周朝(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值是相同的。