通常采用同一个秘钥进行信息的加密和解密操作,称为单秘钥加密,也称为对称加密。
这里介绍其中一种对称加密算法 -- AES,采用唯一的key进行加密和解密
对称加密的优点:
算法公开,计算量小,加密速度快,加密效率高。
缺点:
双方使用相同的钥匙,安全性得不到保证。
使用对称加密需要注意的是秘钥的保密性,并且秘钥要求定期更换
写一个NSString分类,NSString+wxAES.h:
NSString+wxAES.m:
使用示例:
打印结果为:
在上面对AES加密的初步认知中,我们知道AES加密需要一个key,加减密双方都需要知道,那这个key怎么设定好?看一下下面的一种场景:
在社交的APP中,一般对聊天内容都会是加密的,A和B聊天,A和C聊天。如果这个Key都是固定的,那么是不是意味着:如果B通过蛮力等方法破解某段聊天信息,拿到了和A之间的AES_Key,再抓包劫持了A和C的传输内容,就可以轻易的破解A和C之间的内容,显然这种做法是不安全的。
所以安全的模式是A和B,A和C,B和C, 他们聊天内容加密的key都是不同的(再安全点加密方式也可以有区别)。那样即使A和B的加密被破解了,A和C,B和C等其他的聊天记录都不会被轻易破解。
那怎么传送这个key,肯定不是明文传送,那用哪一种加密方式更好点,一般都是非对称加密,如RSA、ECC等。
非对称加密:加减密的密钥不同,分私钥和公钥。
主流的非对称加密方式如:RSA和ECC
这边为什么选用ECC,客观因素有很多:
安全性高
有研究表示160位的椭圆密钥与1024位的RSA密钥安全性相同,256位相当于3072位。
加密效率比较
1)计算负荷:在私钥的加密解密速度上,速度更快。
2)密钥大小:存储空间占用小。
3)带宽:带宽要求低.
AES的Key经过接收方公钥加密和AES加密的内容 一起发送
给接收方,接收方通过自己私钥先将加密后的AES_KEY解密,再通过解密得到的原始AES_KEY,并用该key解密发送方发送的内容,得到明文。
如下图所示:
上面这种加密方式性能上绝对是杠杠的,虽然自己没有用具体的数据测试过,但也找过很多资料看了,加密算法速度高于
扩展:AES和ECC的混合加密还有一种特殊的场景,先来看一下ECC 数学函数 Q=dG; (Q是公钥 d是私钥 G是他们之间的关系);Q1 = d1G1; Q2=d2G2;那么能推出 key=Q1d2G2 = Q2d1G1;
有没有亮点 1的公钥和2的私钥 2的公钥和1的私钥 他们能得到一个相同的值 key。那么我们能不能把这个相同的key 作为他们之间AES加减密的key呢?
那我们是不是可以在这个发送过程少传一个AES密钥key‘的参数,那在传输的过程透露的信息是不是有可以少,安全性是不是会高一点呢?
32位的ECC加密 和32位AES解密,经实践可以使用上述方法。
先了解下AES和RSA的区别,前者属于 对称加密 ,后者属于 非对称加密 。
1、对称加密
对称加密就是加密和解密使用同一个密钥。
用数学公示表示就是:
▲加密:Ek(P) = C
▲解密:Dk(C) = P
这里E表示加密算法,D表示解密算法,P表示明文,C表示密文。
是不是看起来有点不太容易理解?看下图:
看过间谍局的知友们一定知道电台和密码本的功能。潜伏里面孙红雷通过电台收听到一堆数字,然后拿出密码本比对,找到数字对应的汉字,就明白上级传达的指令。而军统的监听台没有密码本,只看到一堆没有意义的数字,这就是对称算法的原理。
AES就属于对称加密 ,常见的对称加密方法还有DES、3DES、Blowfish、RC2以及国密的SM4。
2、非对称加密
对称加密快而且方便,但是有个缺点——密钥容易被偷或被破解。非对称加密就可以很好的避免这个问题。
非对称算法 把密钥分成两个 ,一个自己持有叫 私钥 ,另一个发给对方,还可以公开,叫 公钥 ,用公钥加密的数据只能用私钥解开。
▲加密: E公钥(P) = C
▲解密::D私钥(C) = P
这下就不用担心密钥被对方窃取或被破解了,私钥由自己保管。
非对称加密算法核心原理其实就是设计一个数学难题,使得用公钥和明文推导密文很容易,但根据公钥、明文和密文推导私钥极其难。
RSA 就属于非对称加密,非对称加密还有Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)以及国家商用密码SM2算法。
3、AES和RSA
AES和RSA都很安全,至少在目前的计算机体系结构下,没有任何有效的攻击方式。量子计算机时代,RSA有一定的破绽,因为利用shro's algorithm,量子计算机穷举计算质因子速度可以提高N个数量级,能够在有限的时间内破解RSA密钥。AES256至少目前并没有什么明显的漏洞。
AES作为对称加密技术,加密速度很快。 现在高端一点的CPU都带有AES-NI指令,可以极快的完成加密和解密。
举例来说,坚果云存储系统采用了intel 的AES-NI加速,在采用AES加密和解密的时候,
单核的性能可以超过 1GB Byte/秒,非常非常快,很适合对大量数据进行加解密。
但是AES作为对称加密技术,如何安全的分发密钥是一个难题。通过任何方式传递密钥都有泄密的风险。当然,目前我国高大上的量子通信技术或许能很好的解决这个问题。
RSA作为非对称加密技术的代表, 加解密的速度其实相当慢,只能对小块的数据进行加解密。但是其非对称的特点,满足公钥可以随处分发,只有公钥能解密私钥加密的数据,只有私钥能解密公钥加密的数据。所以很适合用来进行密钥分发和身份验证,这两个应用场景刚好相反。
1)用于对称秘钥分发的场景,其他人用公钥加密对称的秘钥,那么只有授权人才持有私钥,因此才能解密获得对应的秘钥,解决了AES密钥分发的难题;
2)对于身份验证的场景,授权人用私钥加密一段指令,其他人用公钥解密对应的数据,验证对应的指令与之前约定的某些特征一致(例如,这段话必须使用四川口音,像是坚果云CEO
的标准四川口音==),如果一致,那么可以确认这个指令就是授权人发出的。
相关趣闻轶事:
RSA除了是一个伟大的发明,被免费开放给所有互联网用户使用。它的发明者还以此成立了一家名为 RSA Security 的网络安全公司,这家公司最后被EMC高价收购。这是德艺双馨的伟大证明, 是“又红又专”的典范。
RSA的算法是以三个发明者的名字命名的,三位都是成功的数学家,科学家和企业家,其中的排名第一Ron Rivest,有非常多的杰出贡献。
RSA是整个互联网数据安全的基础,与光纤处于同样基础和重要的方式。 大部分的加密和解密的应用都是同时应用RSA和AES。
总结
破解加密的难度除了跟 加密方法 有关,还跟 密钥长度 以及 加密模式 有很大的关系,就拿AES来说,有AES128和AES256( 代表密钥长度 ),显然AES256的安全性能比AES128更高,而AES又要四种模式:ECB、CBC、CFB、OFB( 代表加密模式 )。
RSA1024是属于非对称加密,是基于大整数因式分解难度,也就是两个质数相乘很容易,但是找一个大数的质因子非常困难。量子计算机时代,RSA有一定的风险,具体可以参考: 超链接
AES256目前没有明显的漏洞,唯一的问题就是如何安全的分发密钥。
现在大部分的加密解密都是同时应用RSA和AES,发挥各自的优势,使用RSA进行密钥分发、协商,使用AES进行业务数据的加解密。
环境:ubuntu-14.04,8核,32G内存,64位系统
AES秘钥长度:128
结论:AES加密和解密的速度跟要加密的内容长度的关系不大,解密效率要比加密效率高。
下面是RSA、ECC的在不同秘钥长度下的测试结果:
最近两年一直从事与金融相关项目的开发与维护。但是,关于 PHP 加密解密的最佳实践,网上没有人给出一个完美的总结。恰逢最近看了《图解密码技术》一书,对 PHP 加解密有了更深刻的认识。
为了避免各位看枯燥的文字理论,开篇我就把总结给出:
一、对称加密
对称加密的特点是加解密速度快,加密后的密文强度目前还没有硬解的可能性。但是,在未来随着计算机性能的提升有可能会出现被破解的可能性。
对称加密的缺点也很明显。对称加密的加密过程与解密过程使用的是同一把密钥。一旦泄漏密钥,加密就失去了任何意义。
根据《图解密码技术》一书的推荐,对称加密目前推荐使用 AES。在 PHP 当中要实现 AES 加解密,是使用 openssl 扩展来实现。所以,请确保你的 PHP 已经开启了 openssl 扩展。
可以通过如下方式检测:
或者如下方式检测:
AES 的加密模式属于分组密码模式。所谓分组密码,是加密时把明文按照固定的长度分组,然后再进行加密。当然,细节之处很很多不同。AES 分组模式有多种:ECB、CBC、CFB、OFB、CTR 五种分组模式。目前优先推荐使用 CBC 模式。
如果使用 CBC 模式,那么在加密的时候,就需要一个前置的加密向量 IV。当初博主在使用 AES 来加密的时候,就很奇怪一个对称加密为何要这个向量。因为,在博主寒冰的潜意识里,对称加密只需要一个密钥就 Ok 了。没想到 AES 加密还有多种模式,而这个 CBC 模式恰恰就需要一个这样的向量值。关于这个向量大家可以在网上查阅相关的资料。这个东西非常重要,也非常好理解。
关于 PHP AES 加解密会用到的相关方法:
AES 支持三种强度:128、192、256。128 位的强度最低,但是,加密解密速度较快。256 位强度最高,但是,加密解密速度最低。所以,大家根据自己系统的重要程度选择使用对应强度。通常普通的金融项目使用 192 位完整够用了。顶级的就用 256 位。其他的就用 128 位吧。
二、非对称加密
非对称加密是指公钥加密私钥解密,私钥加密公钥解密的算法。非对称加密的算法有很多。《图解密码技术》一书推荐使用 RSA 算法。它使用起来也非常简单。
要使用 RSA 算法。首先,我们必须生成一对公钥私钥。其实生成公钥私钥很简单。
在 Linux 系统,直接使用如下命令生成:
此命令会生 ~/.ssh/ 目录下生成两个文件:
id_rsa 是私钥, is_rsa.pub 是公钥。
关于 PHP RSA 加解密会用到的相关方法:
以上就是关于在 PHP 项目开发中,我们使用的加密解密算法的一个总结。博主寒冰在总结过程中难免会有不足之处,还请大家指正!谢谢!