关于加密和编码的说明

162 阅读8分钟

@[TOC]

古典密码学

起源于古代战争:在战争中,为了防⽌书信被截获后重要信息泄露,⼈们开始对书 信进⾏加密。

移位式加密

如密码棒,使⽤布条缠绕在⽊棒上的⽅式来对书信进⾏加密 加密算法:缠绕后书写 密钥:⽊棒的尺⼨在这里插入图片描述

替换式加密

按规则使⽤不同的⽂字来替换掉原先的⽂字来进⾏加密。

现代密码学

  1. 可以加密任何⼆进制数据
  2. ⾮对称加密的出现使得密码学有了更⼴泛的⽤途:数字签名

对称加密

  1. 通信双⽅使⽤同⼀个密钥,使⽤加密算法配合上密钥来加密,解密时使⽤加密过程 的完全逆过程配合密钥来进⾏解密。
  2. 特点:加密是解密使用相同密钥,但加密和解密算法不同,解密算法是加密算法的逆运算。
  3. 算法:DES(56 位密钥,密钥太短⽽逐渐被弃⽤)、AES(128 位、192 位、256 位密钥, 现在最流⾏)
  4. 对称加密作用:保护通信,防⽌信息在不安全⽹络上被截获后,信息被⼈读取或篡改。
  5. 对称加密破解风险:由于加密和解密的密钥相同,例如在一个登陆网站上,一旦密钥被截取,然后对网站进行疯狂的注册操作,就可以拿到很多的原文-密文对,同时又有解密后的原数据,这样就有一定的概率可以试出来密钥内容,从而破解密钥,这就是中间人攻击。只能通过优化加密算法来降低这种概率。
  6. 对称加密缺点:如上所述,不能在不安全的网络上传输密钥,容易泄露密钥,但是网络往往是不安全的。
  7. 对称加密过程图解: 在这里插入图片描述

⾮对称加密

  1. 原理:⾮对称加密的密钥是一对两个(公钥和私钥),使⽤公钥对数据进⾏加密得到密⽂;使⽤私钥对数据进⾏解密得到原数据。图解如下: 在这里插入图片描述

  2. 优势:如上图所示,使⽤⾮对称加密通信,可以在不可信⽹络上将双⽅的公钥传给对⽅,在数据传输前,发送方使用对方的公钥对原数据进行加密,发送过去后,接收方使用自己的私钥进行解密。

  3. 特点:非对称加密的加密密钥和解密密钥不相同,但是加密算法相同。

  4. 作用:非对称加密的公钥和私钥是互相可解的,因此⾮对称加密还可以应⽤于数字签名技术。

签名与认证:

①发送方和接受方分别持有自己的私钥和对方的公钥如下: 在这里插入图片描述②. 发送方使用自己的私钥和加密算法对原数据进行签名,然后和原数据一起发送给接收方,接收方使用发送方的公钥对签名数据进行解密得到原数据,和发送的原数据进行对比验证。 在这里插入图片描述 ③上述做法实际上会发送两遍原数据,通常做法是原数据是不能在网络上进行传输的,有泄露风险,取而代之的是我们先在数据发送前对原数据进行一次hash算法(不可逆)生成摘要,然后用自己的私钥对hash后的数据摘要进行签名,然后将签名后的摘要放在对原数据hash后的摘要后边发送出去。接收方使用发送方的公钥对签名后的摘要进行解密得到原数据hash后的数据,然后和发送过来的hash后的原数据进行比对,从而验证一致性。也就是说原数据不直接传递,也不经过加密后传递,而是传递它的hash值,接受方也不保存原数据(类似于服务器不保存密码,只保存密码的hash值) 在这里插入图片描述 5. 非对称加密算法:RSA(可⽤于加密和签名)、DSA(仅⽤于签名,但速度更快) 6. ⾮对称加密的优缺点:可以在不安全⽹络上传输密钥,因为传输的是公钥,但是计算复杂,性能会比对称加密差很多。 7. 破解风险:常用密码可能会在彩虹表中被收集。

hash算法

  1. 定义:把任意数据转换成指定⼤⼩范围(通常很⼩,例如 256 字节以内)的数据
  2. 作用①:从数据中提出摘要信息,因此最主要⽤途是数字指纹。
  3. 作用②:快速唯⼀性验证,例如 Java 中的 hashCode() ⽅法,可以快速的验证两个值的不相等。
  4. 作用③:数据完整性验证。例如从⽹络上下载⽂件后,通过⽐对⽂件的 Hash 值(例如 MD5、SHA1,SHA256都属于hash算法,都是不可逆的),可以确认下载的⽂件是否有损坏。如果下载的⽂件 Hash 值和⽂件提供⽅给出的 Hash 值⼀致,则证明下载的⽂件是完好⽆损的。
  5. 作用④:快速查找,例如HashMap,内部使用了数组,通过计算key的HashCode()直接定位value所在的索引,不需要遍历整个数组。
  6. 作用⑤:隐私保护,当重要数据必须暴露的时候,有事可以选择暴露它的 Hash 值(例如 MD5),以保障原数据的安全。例如⽹站登录时,可以只保存⽤户密码的 Hash 值,在每次登录验证时只需要将输⼊的密码的 Hash 值和数据库中保存的 Hash 值作⽐对就好,⽹站⽆需知道⽤户的密码。这样,当⽹站数据失窃时,⽤户不会因为⾃⼰的密码被盗导致其他⽹站的安全也受到威胁,但是hash算法不属于加密,因为它是单向不可逆操作。同时它也不属于编码,因为编码对应着解码,是可逆的。

编码和解码

  1. 定义:编码即把数据从⼀种数据格式转换为另⼀种数据格式。解码同理。同时也是可逆操作,有编码就有解码。

Base64编码

  1. 定义:将⼆进制数据(所有计算机数据都是⼆进制数据)转换成由 64 个字符组成的字符串的编码算法,
  2. 算法:将原数据每 6 位对应成 Base 64 索引表中的⼀个字符编排成⼀个字符串(每个字符8 位),base64索引表如下: 在这里插入图片描述
  3. Base64 的⽤途:将⼆进制数据扩充了储存和传输途径。普通的字符串在经过 Base64 编码后的结果会变得⾁眼不可读。
  4. Base64 的缺点:因为⾃身的原理(6 位变 8 位),因此每次 Base64 编码之后,数据都会增⼤约1/3,所以会影响存储和传输性能。所以使用base64对图片进行编码传输既不会高效(因为体积增大),也不会安全(因为base64是编码方式,是可逆的,可以解码的)

变种:Base58,⽐特币使⽤的编码⽅式,去掉了 Base64 中的数字 "0",字⺟⼤写 "O",字⺟⼤写 "I",和字⺟⼩写 "l",以及 "+" 和 "/" 符号,⽤于⽐特币地址的表示。 Base58 对于 Base64 的改动,主要⽬的在于⽤户的便捷性。由于去掉了难以区分的 字符,使得 Base58 对于「⼈⼯抄写」更加⽅便。另外,去掉了 "+" "/" 号后也让⼤ 多数的软件可以⽅便双击选取

URL 使⽤的百分号编码

在 URL 的字符串中,对⼀些不⽤于特殊⽤途的保留字符,使⽤百分号 "%" 为前缀进 ⾏编码,以避免出现解析错误。

压缩与解压缩编码

压缩:将数据使⽤更具有存储优势的编码算法进⾏编码。 解压缩:将压缩数据解码还原成原来的形式,以⽅便使⽤ 目的就是为了减⼩数据占⽤的存储空间。

序列化

把数据对象(⼀般是内存中的,例如 JVM 中的对象)转换成字节序列的过程。对象 在程序内存⾥的存放形式是散乱的(存放在不同的内存区域、并且由引⽤进⾏连 接),通过序列化可以把内存中的对象转换成⼀个字节序列,从⽽使⽤ 字节数组byte[] 等形 式进⾏本地存储或⽹络传输,在需要的时候重新组装(反序列化)来使⽤。目的是让内存中的对象可以被储存和传输。

序列化 不是编码,编码是把数据由⼀种数据格式转换成另⼀种数据格式;⽽序列化是把数据由内存中的对象(⽽不是某种具体的格式)转换成字节序列