为什么我们要加密?
加密是为了信息通报更加安全!
这样才能更好的让信息通报更具有保密性,不会被他人随意修改、也能够让信息真实有效的到达指定工具的手里!
我们加密的目的,多数是环绕这上面这些情形来的!
举个栗子
在信息通信过程当中,比如你发送一条主要信息给对方, 在这个过程中实在有很多人可以利用一些技能手段打仗到这一段信息! 如果是很主要的信息但个别人利用,说不一定就会产生严重的经济丢失!
例如: 信息中包含了一些敏感信息,如身份证、银行卡、密码、而这些敏感信息是最随意马虎被人偷窥的!
如图
为了避免涌现以上的情形,我们就要将信息进行加密处理, 这样子即便是被人拿到了关键信息,他也是在短韶光内无法查看的,也便是让任何第三方都无法直接读取和读懂的信息!
只有发送方和吸收方能看懂全体数据传输的信息。
加密系统的大略架构加密的产生过程,大略点说实在便是: 明文+密钥+算法=密文
如图
从上面的图来看,实在明文和算法都还是比较好理解,但个中有一个叫密钥的东西,它就好比是像彼此约定好了的暗号一样, 也是最大略的加密办法!
举个栗子
从生活中我们用一个锁家里的门来举例的话,便是家中有代价的物品,便是你的明文、那么密钥便是你的钥匙,那么算法便是你是通过什么样的情形来锁门的! 当门锁好之后,那么一个家就形成了一个加密状态了!
以是这个密钥常日都是须要保密的,便是这个意思,你总不可能把你的钥匙随便丢吧!
对称加密那么在打算机中,我们也一些有比较安全和常见的加密办法, 例如:对称加密
对称加密实在分为两种形式: 对称加密和非对称加密
大略的说对称加密也便是加密和解密都会利用同样密钥
非对称加密则正好相反,这种加密和解密利用的是不同密钥
AES对称加密算法AES全称:advanced encryption standard 它是密码学中的高等加密标准,也是美国联邦政府采取的区块加密的标准,也是当下比较盛行的对称密码算法!
我们前面提到的对称加密中就包含了AES 也便是加密和解密都会利用同样密钥的加密算法
大略的说发送方将明文和密钥一起经由分外加密算法处理后,使其变成繁芜的加密密文再发送出去!
吸收方如果想解读明文, 那么须要利用加密用过的密钥及相同算法然后按照与加密时相反的顺序逆推算法对密文进行解密,才能使其规复成可读的明文信息!
前面说了,在对称AES加密算法中,利用的密钥只有一个, 发送方和吸收方都利用这个密钥对数据进行加密和解密,那么这就哀求解密的一方事先必须知道加密密钥对吧!
如图
这就像是它哀求发送方和吸收方在通信之前,约定一个密钥(暗号)
对称算法的安全性依赖于密钥,如果泄露密钥就意味着任何人都可以对他们发送或吸收的数据进行解密
以是密钥的保密性对AES通信的安全性至关主要!
对称加密算法的优点在于加密和解密的快速和利用长密钥时的难破解性,而这种加密算法支持长度为 128比特的密钥长度, 同时也支持192、256比特一共三种选择!
我们知道加密的核心在于密钥而算法本身实在终极都会被破解的,以是现在盛行的密码算法都是公开的,以是从密码学的角度而言也没有人去保密算法来提高安全性,以是说对付现在某些密码攻击手段对付一些高等加密标准算法本身并没有效果,真正核心的还是密钥, 这里密钥的长度直接就会影响到蛮力攻击要取获胜利须要耗费相称长的韶光,而这种对称加密算法的安全性取决于密钥的保存情形来决定!
以是普通情形下,没有分外需求,基本上首先的是AES加密
运用处景这里我大略说一个案例
假设我们现在有一个包含用户个人信息的JSON工具,须要进行加密处理
如下
{ "name": "张三", "age": 30, "email": "zhangsan@example.com", "phone": "13812345678" }
那么此时我们可以利用一些加密算法,比如:AES、RSA 对这个JSON工具中的一些数据进行加密处理。
然后加密之后的数据会变成一串密文,用户是无法直接阅读和理解。
例如:利用AES算法加密上述JSON工具,结果可能类似于以下形式:
{ "name": "张三", "age": 30, "email": "zhangsan@example.com", "phone": "tv/yxsWlDIPHOnD50WVnFw==" }
现在可以看到,加密后的JSON工具中的phone电话字段已经被更换为一串看似随机的字符串,我们是无法直接读取原始的手机号的, 这样也对全体JSON工具也变得难以理解和解析。
这里加密后的JSON数据须要解密后才能还原为原始数据,而解密过程与加密相反,
须要利用相应的解密算法和密钥来还原数据。
PHP实现AES对称加密我们来实现一个大略的加密案例,有兴趣的朋友可以来看看,java、php、python等等用什么措辞都可以!
我用php中的OpenSSl扩展库来实现AES对称加密与解密
不用我们去理解底层,只须要轻松几步就可以实现一个大略加密和解密数据的过程!
代码如下
<?php function encryptAES($data, $key, $iv) { $encrypted = openssl_encrypt($data, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv); $encrypted = base64_encode($encrypted); return $encrypted; } function decryptAES($encryptedData, $key, $iv) { $encryptedData = base64_decode($encryptedData); $decrypted = openssl_decrypt($encryptedData, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv); return $decrypted; } // 加密数据 $data = 'Hello-World!'; $key = '0123456789abcdef';$iv = '1234567890abcdef'; $encryptedData = encryptAES($data, $key, $iv); echo '加密后的数据:' . $encryptedData; echo '<hr>';// 解密数据 $decryptedData = decryptAES($encryptedData, $key, $iv); echo '解密后的数据:' . $decryptedData; ?>
效果如下
代码剖析
这里大略的利用到了php中OpenSSl扩展库的openssl_encrypt和openssl_decrypt函数来实现的AES
openssl_encrypt函数阐明如下表
参数列表
含义
参数1:data
待加密的明文信息数据, 也便是须要加密的数据,你可以把它想象成你想要锁起来的秘密信息
参数2:method
加密办法, 也便是你想要用来加密数据的加密算法, 常见的加密算法包括 AES, 详细可以查看官方文档 例如: 你利用 AES-256-CBC 算法,那么 CBC 表示加密模式,256 表示密钥的长度
参数3:key
约定加密和解密的一把钥匙, 而这把密钥的长度必须与所选择的加密算法相匹配.........例如,如果利用 AES-256-xxx,那么你的密钥该当是 256位长! 以是我们最好要给定相应字节长度的字符串密钥,虽然有时候我们没有定义指定长度的字符的密钥,但仍旧能够成功加密数据,是由于PHP的OpenSSL扩展自动处理了密钥的添补和天生! 但是为了确保最佳的安全性,最好显式地指定一个符合长度哀求的密钥! 这样可以避免任何潜在的添补问题,并确保密钥的长度与所选加密算法的哀求相匹配, 比如说: 在 AES-256 算法中,密钥的长度为 32字节(256 位)的字符串就可以了! 这里我采取的是AES,而AES密钥的长度常日可以是128位、192位、256位
参数4:options
它可以掌握如何处理返回的数据, 它有两种常量设置办法: OPENSSL_RAW_DATA和 OPENSSL_ZERO_PADDING 例如,你可以设置 OPENSSL_RAW_DATA 常量选项,这样函数会返回原始的二进制数据,一把也都设置这个!
参数5:iv
它是一个初始化向量, 用于增加加密的安全性和随机性! 这里所谓的初始化向量实在便是一个随机字符串,但是这个随机字符串是有一定讲究的,它的字符长度常日须要与加密模式的哀求相匹配, 也便是说不同的加密模式可能会有不同的iv哀求, 例如: 当我们利用AES-256-CBC加密模式时,iv参数该当至少为16字节长度的随机字符串, 如果利用AES-128-CBC加密模式时, iv参数必须为16字节长度的随机字符串,多一个或少一个都会报错! 以是iv这个参数,最好是要和加密模式中的长度同等就行了! 为了更加安全,这个iv最好不能写去世,用一种算法办法天生指定长度的iv 这样子在每次加密操作时都会改变加密结果!
....................................
返回值:成功时返回加密后的字符串
openssl_decrypt函数阐明如下表
参数列表
描述
参数1:data
要解密的数据字符串,常日是由 openssl_encrypt 函数加密后的结果。
参数2:method
填写加密办法,既然要解密那么就要知道是如何加密的,以是这里就必须填写与加密时利用的算法模式相同! 例如: 加密模式为 AES-256-CBC 那么这里就必须填写AES-256-CBC
参数3:key
解密密钥。这是用于解密的密钥,与加密时利用的密钥相同! 举个生活上的案例,你用什么钥匙锁门,那么你就要用相应的钥匙来开门,对吧! 并且这个密钥的长度也要同等!
参数4:options
数据以什么形式进行处理并返回 它有两种常量设置办法: OPENSSL_RAW_DATA和 OPENSSL_ZERO_PADDING , 加密时设置的什么,这里就设置什么!
参数5:iv
解密时须要利用加密时相同的 iv
.........................................
以是在上面的案例中encryptAES函数接管要加密的数据、密钥和初始向量,并返回加密后的结果。
而且decryptAES函数接管加密后的数据、密钥和初始向量,并返回解密后的原始数据。
特殊把稳的是密钥和初始向量的长度,必须要符合加密算法的哀求!
大致流程如下图:
小结
看到这里你也该当大致理解了一下对称加密了吧, 实在关于对称加密还有很多有趣的内容,往后可以逐步给跟大家分享!
大家的支持便是我坚持的动力!
如果文章对你有帮助的话就请
点赞 ✍️评论 收藏
一键三连哦!
如果以上内容有任何缺点或者不准确的地方,欢迎不才面 留个言指出!
或者你有更好的想法,欢迎一起互换学习❤️