发送者对明文进行加密而后生成密文,接受者再对密文解密获得明文的过程。 如今使用的全部加密算法都是公开的!可是密钥确定不是公开的。git
公钥
加密,使用 私钥
解密私钥
加密,使用 公钥
解密(私钥签名,公钥验签)1是对数据加密,2是防止伪造客户端数据,对服务器攻击,更重要是防止模拟了客户端,进行支付相关的操做github
就我的理解,最主要的就是密钥的不一样,对称加密客户端和服务端使用同一个密钥,非对称加密使用不一样的密钥。算法
客户端的代码是很容易被破解的,IDA、hopper disassembler
工具的使用,使得破解更加简单并且破解后容易阅读,再配合Charles抓取网络包,根据关键字很容易就定位到加密代码,而后获取密钥。sass
因为对称加密密钥同样,因此解密就垂手可得;可是非对称加密就不会出现这种问题,由于服务端和客户端的密钥不同,公钥加密私钥解密,加密的公钥也是公开的,而私钥通常放在服务端,黑客通常是拿不到的。安全
另外就是没有密钥状况下强制暴力破解,非对称加密也要比对称加密花的多的多的时间来破解。一条信息就要花你几年的时间,因此很安全。服务器
好比对于"Hello world!"
进行加密后获得结果R,还可使用密钥经过结果R解密获得"Hello world!"
;而对"Hello world!"
进行签名获得结果R,却不能使用密钥经过R得到"Hello world!"
,要否则的话压缩算法要逆天了!好比hash,使用几十个字符就能存储几G几T的数据。。。网络
好比A对B发送了信息Message;经过加密后,即使C经过网络包截取得到了Message,它也不知道里面的具体内容,只能看到一堆乱码;经过签名,假设D也用相同的加密算法发送了此Message,可是签名错误,那么B经过签名依然拒绝D的Message。函数
假设A、B双方均拥有一对公私钥(PUB_A
、PRI_A
、PUB_B
、PRI_B
)。工具
A向B发送Message的整个签名和加密的过程以下:性能
Message_hash_A
PRI_A
对Message_hash_A
进行签名获得Message_sign
(这里为何不直接对Message进行签名,而要对Message_hash_A
进行签名呢?由于Message的长度可能很长,而Message_hash_A
的长度则是固定的,这样性能更高,格式也固定,何况hash的结果通常不会出现重复的可能)PUB_B
对信息Message
和信息Message_sign
进行加密获得Message_RSA
,这时A将Message_RSA
发送给B。当B接收到A的信息Message_RSA
后,获取Message
的步骤以下:
PRI_B
解密获得明文:Message
和Message_sign
;PUB_A
解Message_sign
获得Message_hash_A
;同时,B再对Message
使用与A相同的HASH获得Message_hash_B
;Message_hash_A
与Message_hash_B
相同,则说明Message
没有被篡改过。上面的过程当中,A知道A的公私钥同时也要知道B的公钥;同理B要知道A的公钥和B的公私钥
关于公私钥再打个比方:公钥
就像一把锁同样将数据锁住;私钥
就像钥匙同样,能将对应的锁打开。
公钥加密,私钥解密的好处是:公钥能够公开,那么不管谁有公钥均可以给你发送信息,并且也只有你才能解密
咱们常用的Github就是使用了签名的方法,SSH,在本地电脑生成一对公私钥,将公钥传到github,而后使用私钥进行签名,github经过公钥延签后认为你的身份合法。
另外,加密和编码是不同的,好比ASCII是属于编码,是将0~255与字符一一对应。