对称加密
对称加密指的就是加密和解密使用同一个秘钥,所以叫做对称加密。对称加密只有一个秘钥,作为私钥。
具体算法有:DES,3DES,TDEA,Blowfish,RC5,IDEA。常见的有:DES,AES,3DES等等。
优点:算法公开、计算量小、加密速度快、加密效率高。 缺点:秘钥的管理和分发非常困难,不够安全。在数据传送前,发送方和接收方必须商定好秘钥,然后双方都必须要保存好秘钥,如果一方的秘钥被泄露,那么加密信息也就不安全了。另外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的唯一秘钥,这会使得收、发双方所拥有的钥匙数量巨大,密钥管理成为双方的负担。
非对称加密
非对称加密指的是:加密和解密使用不同的秘钥,一把作为公开的公钥,另一把作为私钥。公钥加密的信息,只有私钥才能解密。私钥加密的信息,只有公钥才能解密。 私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥。
我们常见的数字证书、加密狗即是采用非对称加密来完成安全验证的。
优点:安全性更高,公钥是公开的,秘钥是自己保存的,不需要将私钥给别人。 缺点:加密和解密花费时间长、速度慢,只适合对少量数据进行加密。
主要算法:RSA、Elgamal、背包算法、Rabin、HD,ECC(椭圆曲线加密算法)。常见的有:RSA,ECC
区别
对称加密算法相比非对称加密算法来说,加解密的效率要高得多。但是缺陷在于对于秘钥的管理上,以及在非安全信道中通讯时,密钥交换的安全性不能保障。所以在实际的网络环境中,会将两者混合使用.
例如针对C/S模型,
服务端计算出一对秘钥pub/pri。将私钥保密,将公钥公开。
客户端请求服务端时,拿到服务端的公钥pub。
客户端通过AES计算出一个对称加密的秘钥X。 然后使用pub将X进行加密。
客户端将加密后的密文发送给服务端。服务端通过pri解密获得X。
然后两边的通讯内容就通过对称密钥X以对称加密算法来加解密。
常见的对称加密
# AES
高级加密标准(AES,Advanced Encryption Standard)是最常见的对称加密算法比如:微信小程序加密传输就是用这个加密算法的。对称加密算法也就是加密和解密用相同的密钥,具体的加密流程如下图:
# MD5
MD5出现最多的是在文件签名中,我们下载文件的时候,经常会看到文件页面上附带一个扩展名为.MD5 的文本或者一行字符,这行字符就是就是把整个文件当作原数据通过 MD5计算后的值。我们下载文件后,可以用检查文件MD5信息的软件对下载到的文件在进行一次计算。两次结果对比就可以确保下载到文件的准确性。
还有常用的是网站比较敏感信息的加密,比如用户密码、支付签名等。
# DES算法
DES加密算法是一种 分组密码,以 64位为 分组对数据加密,它的密钥长度 是 56位,加密解密用同一算法。DES 加密算法是对密钥进行保密,而公开算法,包括加密和解密算法。这样,只有掌握了和发送方 相同密钥 的人才能解读由 DES加密算法加密的密文数据。因此,破译 DES加密算法实际上就是搜索密钥的编码。对于56位长度的密钥来说,如果用穷举法来进行搜索的话,其运算次数为 2 ^ 56 次。
# 3DES算法
是基于DES的对称算法,对一块数据用三个不同的密钥进行三次加密,强度更高。
“DES”和“AES”算法的比较
DES
1977年1月,美国政府颁布:采纳IBM公司设计的方案作为非机密数据的正式。
目前在国内,随着三金工程尤其是金卡工程的启动,DES算法在POS、ATM、磁卡及智能卡(IC卡)、加油站、高速公路收费站等领域被广泛应用,以此来实现关键数据的保密,
如信用卡持卡人的PIN的加密传输,IC卡与POS间的双向认证、金融交易数据包的MAC校验等,均用到DES算法。
AES
2000年10月,NIST(美国国家标准和技术协会)宣布通过从15种候选算法中选出的一项新的密匙加密标准。Rijndael被选中成为将来的 AES。Rijndael是在1999年下半年,由研究员Joan Daemen 和 Vincent Rijmen 创建的。
AES正日益成为加密各种形式的电子数据的实际标准。
美国标准与技术研究院(NIST)于2002年5月26日制定了新的高级加密标准(AES)规范。
与公共密钥加密使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换和替换输入数据。
DES算法优点:DES算法具有极高安全性,到目前为止,除了用穷举搜索法对DES算法进行攻击外,还没有发现更有效的办法。
DES算法缺点:
1、分组比较短。
2、密钥太短。
3、密码生命周期短。
4、运算速度较慢。
AES算法优点:
1、运算速度快。
2、 对内存的需求非常低,适合于受限环境。
3、分组长度和密钥长度设计灵活。
4、 AES标准支持可变分组长度,分组长度可设定为32比特的任意倍数,最小值为128比特,最大值为256比特。
5、 AES的密钥长度比DES大,它也可设定为32比特的任意倍数,最小值为128比特,最大值为256比特,所以用穷举法是不可能破解的。
6、很好的抵抗差分密码分析及线性密码分析的能力。
AES算法缺点:目前尚未存在对AES 算法完整版的成功攻击,但已经提出对其简化算法的攻击。
序号 键 DES密码 AES密码 1
定义 数据加密标准(也称为DES)是一种对称密钥块密码,由IBM于1977年引入。 在DES加密中,纯文本分为两半,然后DES将输入作为64位纯文本和56位密钥作为输入,以生成64位CipherText,它是数据的加密形式。
另一方面,高级加密标准(也称为AES)也是对称键块密码,由Vincent Rijmen和Joan Daemen于2001年引入。AES采用128位纯文本和128位秘密键,它们共同形成一个128位块,该块在处理后提供16个字节(128位)的密文。 2
键长和轮数
对于DES,用于加密的密钥长度为56位,并且DES涉及16轮相同的操作,与密钥长度无关。
另一方面,如果AES键长度可以是128位,192位和256位,则由于轮数可以是10(128位),12(192位)或14(256位) )。 3
设计 DES的设计和体系结构是基于Feistal网络的。
另一方面,AES的设计基于替换置换网络。 4
安全 由于DES中的操作数是固定的,不允许排列组合,因此更容易破坏加密,因此DES的安全性不如AES。
另一方面,AES比DES密码更安全,并且是事实上的世界标准。 5
涉及的业务 在DES操作中,加密涉及的轮次有扩展、带轮次密钥的异或操作、替换和置换。
另一方面,如果使用AES进行加密,则涉及的操作回合为字节替换,移位行,混合列和键加法。 6
加密 如上所述,DES可以加密64位的纯文本。
另一方面,AES可以加密128位纯文本。
# AES
高级加密标准(AES,Advanced Encryption Standard)是最常见的对称加密算法比如:微信小程序加密传输就是用这个加密算法的。对称加密算法也就是加密和解密用相同的密钥,具体的加密流程如下图:
AES简介
高级加密标准 (AES,Advanced Encryption Standard) 为最常见的对称加密算法,相对 DES 更安全。AES 加密算法采用分组密码体制,每个分组数据的长度为128位16个字节,密钥长度可以是128位16个字节、192位或256位,一共有四种加密模式,一般采用需要初始向量 IV 的 CBC 模式,初始向量的长度也是128位16个字节。特别提醒:由于jdk对密钥长度支持受限制,使用256位密钥会抛 java.security.InvalidKeyException: Illegal key size or default parameters 异常,可以通过替换 jre 的jar包,具体方式可自行查询
分组密码体制
所谓分组密码体制就是指将明文切成一段一段的来加密,然后再把一段一段的密文拼起来形成最终密文的加密方式。AES 采用分组密码体制,即 AES 加密会首先把明文切成一段一段的,而且每段数据的长度要求必须是128位16个字节,如果最后一段不够16个字节了,就需要用 Padding 来把这段数据填满16个字节,然后分别对每段数据进行加密,最后再把每段加密数据拼起来形成最终的密文。Padding
填补 (Padding) 就是用来把不满16个字节的分组数据填满16个字节用的,它有三种模式 PKCS5、PKCS7 和 NOPADDING。PKCS5 是指分组数据缺少几个字节,就在数据的末尾填充几个字节的几,比如缺少5个字节,就在末尾填充5个字节的5;
PKCS7 是指分组数据缺少几个字节,就在数据的末尾填充几个字节的0,比如缺少7个字节,就在末尾填充7个字节的0;
NoPadding 是指不需要填充,也就是说数据的发送方肯定会保证最后一段数据也正好是16个字节。
特别提醒:使用 Nopadding 要加密数据必须是16字节的倍数,否则抛异常
初始向量 IV
初始向量 IV 的作用是使加密更加安全可靠,我们使用 AES 加密时需要主动提供初始向量,而且只需要提供一个初始向量就够了,后面每段数据的加密向量都是前面一段的密文。初始向量 IV 的长度规定为128位16个字节,初始向量的来源为随机生成。至于为什么初始向量能使加密更安全可靠,会在下面的加密模式中提到。密钥
AES 要求密钥的长度可以是128位16个字节、192位或者256位,位数越高,加密强度自然越大,但是加密的效率自然会低一些,因此要做好衡量。我们开发通常采用128位16个字节的密钥,我们使用 AES 加密时需要主动提供密钥,而且只需要提供一个密钥就够了,每段数据加密使用的都是这一个密钥,密钥来源为随机生成(我们开发时传入的那个为初始密钥,除了初始密钥以外,后面每一轮的密钥都是由上一轮的密钥扩展而来的,密钥扩展有四个步骤:排列、置换、与轮常量异或、生成下一轮密钥的其他列)。加密模式
AES 一共有四种加密模式,分别是 ECB(电子密码本模式)、CBC(密码分组链接模式)、CFB(密码反馈模式)、OFB(输出反馈模式) 我们一般使用的是 CBC 模式。ECB 模式是最基本的加密模式,使用明文和密钥来加解密数据,相同的明文块会加密成相同的密文块;
其他模式区别不大,比如 CBC 模式比 ECB 模式多了一个初始向量 IV,加密的时候,第一个明文块会首先和初始向量 IV 做异或操作,然后再经过密钥加密,然后第一个密文块又会作为第二个明文块的加密向量来异或,依次类推下去,这样相同的明文块加密出的密文块就是不同的,明文的结构和密文的结构也将是不同的,因此更加安全。
非对称加解密设计
1.1 专业术语
RSA:RSA加密算法是一种非对称加密算法。
AES:高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法。
SHA1withRSA:用SHA算法进行签名,用RSA算法进行加密,是一种签名算法。
公钥和私钥:公钥(Public Key)与私钥(Private Key)是通过一种算法得到的一个密钥对(即一个公钥和一个私钥),公钥是密钥对中公开的部分,私钥则是非公开的部分。1.2 方案对比
加密方案 前后端都用RSA非对称加密 采用RSA和AES组合加密
实现方式 前后端都保存自己的私钥和对方的公钥,公钥加密私钥解密 前端保存后端生成的RSA公钥,每次请求都用AES密钥加密,AES密钥用RSA公钥加密。后端用RSA私钥解密AES密钥,然后用AES密钥解密请求数据。响应数据用AES密钥加密,AES密钥用RSA做加签,前端验签,然后解密。
前端暴露 自己的私钥,后端的公钥 后端的公钥
安全性 因为前端暴露了自己的私钥,将使后端的加密不安全 只暴露了后端的RSA公钥,AES密钥是用RSA公钥加密的,而且AES密钥是一次一密,理论上是安全的。
1.3 方案流程
前端:事先保存后端生成的RSA公钥 —>发起请求---->用生成的AES秘钥加密请求数据,同时用RSA公钥加密AES秘钥
后端:接收前端请求数据,使用RSA私钥解密AES秘钥,再用AES秘钥解析请求数据,解密成功后,响应数据用AES密钥加密,AES秘钥用RSA私钥加签后返回;
前端:接收后验签,通过后AES秘钥解密响应数据,完成前后端的交互2. 模块设计
2.1. 前端加密
保存好后端生成的RSA公钥,每次请求都生成一个AES密钥,做到一次一密,请求json格式{“key”:”XXX”,”data”:”XXX”},key是用RSA公钥加密之后的AES密钥,data是用AES密钥加密之后请求数据。2.2. 后端解密
接收到前端请求数据之后,先用RSA私钥解密key,获取到AES密钥,再用AES密钥解密data获取到请求数据。2.3. 后端加签加密
Key是用RSA私钥用SHA1withRSA签名算法把AES密钥加签,data是用AES密钥加密响应数据。2.4. 前端验签解密
先用RSA公钥用SHA1withRSA签名算法验签key,验签通过再处理之后的流程,不通过停止执行后续流程。验签通过之后,再用AES密钥解密data。