【网络】编码与加密

本文介绍了网络传输过程中的加密和编码的相关内容
加密
对称加密
对称加密是指使用相同的密钥进行加密和解密的加密算法。在对称加密中,发送方和接收方使用相同的密钥进行加密和解密操作,因此加密和解密的过程都是基于同一个密钥。
常见的对称加密算法包括:
- DES(Data Encryption Standard):一种对称加密算法,由IBM公司于1975年提出。
- AES(Advanced Encryption Standard):一种对称加密算法,由美国国家标准与技术研究所(NIST)于2001年提出。
- 3DES(Triple DES):一种对称加密算法,由IBM公司于1978年提出。
- RC4(Rivest Cipher 4):一种流加密算法,由Ron Rivest于1987年提出。
对称加密的优点是加密和解密的速度快,适用于对大量数据进行加密的场景。然而,对称加密的缺点是密钥的分发和管理比较复杂,需要确保密钥的安全性。
破解思路: 拿到⼀组或多组原⽂-密⽂对,设法找到⼀个密钥,这个密钥可以将这些原⽂-密⽂对中的原⽂加密为密⽂,以及将密⽂解密为原⽂的组合,即为成功破解。
反破解: ⼀种优秀的对称加密算法的标准是,让破解者找不到⽐穷举法(暴⼒破解法)更有效的破解⼿段,并且穷举法的破解时间⾜够⻓(例如数千年)。
非对称加密
非对称加密是指使用不同的密钥进行加密和解密的加密算法。在非对称加密中,发送方和接收方使用不同的密钥进行加密和解密操作,因此加密和解密的过程都是基于不同的密钥。
原理:使用公钥对数据加密得到密文,使用私钥对数据解密得到原数据。⾮对称加密使⽤的是复杂的数学技巧,在古典密码学中没有对应的原型。
常见的非对称加密算法包括:
- RSA(Rivest-Shamir-Adleman):一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman于1977年提出。
- ECC(Elliptic Curve Cryptography):一种非对称加密算法,由Koblitz在1985年提出。

用同样的算法,不同密钥再算一遍,就得到原数据。
举例:
规定以下字符:0123456789 需要发110 加密算法:对一个字符都进行加法运算 加密密钥,4 密文:554 解密密钥:6 还原数据:11 11 10,溢出后,只保留后一位,就还原了110
其实由此可以知道,非对称加密最关键的点: 溢出
对称加密的难点:无法用安全高效的方式将加密的密钥给到对方,而非对称加密则无需担心这个问题。
非对称加密的示意图:公钥可以在网络上公开,而私钥一定要掌握在自己手里。A要给B发消息,首先用A的公钥来进行加密,密文发给B后,B使用自己的私钥来解密密文。在这个过程中,就算C能看到密文,却无法拿到私钥B来解密密文。

以上是公钥加密,私钥来解,即私钥解公钥。
问:公钥可以解私钥吗?
可以的。即私钥X, 公钥Y,原数据data, 密文secret,加密算法为algorithm。 非对称加密符合以下过程:
data*algorithm*Y = secret
secret*algorithm*X = data即data*algorithm*Y*algorithm*X = data
"*algorithm*Y*algorithm*X " 这一段其实就相当于还原了数据。
即使用私钥加密公钥解密也是可行的。
但是,公钥和私钥的位置是不可以互换的。因为公钥是可以被计算出来的。比如比特币的公钥就是拿私钥算出来的。还比如RSA加密算法,它的公钥关键部分都是一样的。
非对称加密的优点是密钥的分发和管理相对简单,适用于对少量数据进行加密的场景。然而,非对称加密的缺点是加密和解密的速度相对较慢,不适用于对大量数据进行加密的场景。
破解思路
和对称加密不同之处在于,⾮对称加密的公钥很容易获得,因此制造原⽂-密⽂对是没有困难的事。所以,⾮对称加密的关键只在于,如何找到⼀个正确的私钥,可以解密所有经过公钥加密过的密⽂。找到这样的私钥即为成功破解。由于⾮对称加密的⾃身特性,怎样通过公钥来推断出私钥通常是⼀种思路(例如 RSA),但往往最佳⼿段依然是穷举法,只是和对称加密破解的区别在于,对称加密破解是不断尝试⾃⼰的新密钥是否可以将自己拿到的原⽂-密⽂对进⾏加密和解密,⽽⾮对称加密是不断尝试⾃⼰的新私钥是否和公钥互相可解。
反破解
和对称加密⼀样,⾮对称加密算法优秀的标准同样在于,让破解者找不到⽐穷举法更有效的破解⼿段,并且穷举法的破解时间⾜够⻓。
混合加密
混合加密是指使用对称加密和非对称加密相结合的加密算法。在混合加密中,发送方和接收方使用不同的密钥进行加密和解密操作,因此加密和解密的过程都是基于不同的密钥。 常见的混合加密算法包括:
- SSL/TLS:一种基于非对称加密和对称加密相结合的加密算法,由Netscape公司于1995年提出。
混合加密的优点是加密和解密的速度相对较快,适用于对大量数据进行加密的场景。然而,混合加密的缺点是密钥的分发和管理比较复杂,需要确保密钥的安全性。
签名与验证
签名:用于让任何人都知道这个内容确实是来自我的。用自己的私钥来加密,那么任何人去用对应的公钥来解密,都可以得到原数据。加密后的那个密文只有我造得出来,只有我造的加密数据可以用我的公钥解密出原数据,就可以证明这个东西是属于我的。

往往会把原数据与签名数据一起放出,让其他节点可以用公钥去解密对比。
加密+签名
用两方的公钥私钥配合,可以制造签了名的加密数据。

防伪造
坏人C用B的公钥来制造加密假数据,B拿到后,用自己的私钥一解密也可以得到正常的数据。

用上面的签名+加密的方式就可以避免这种伪造的情况。
A使用B的公钥发消息,同时用A的私钥签名,那么B拿到消息后,用A的公钥去验证,用自己的私钥来解密数据。就可以确切的知道这个数据是来自A的。而中间的C既看不懂,也无法伪造与篡改。
编码
Base64
Base64是一种基于64个可打印字符来表示二进制数据的表示方法。它通常用于在URL、Cookie、HTML等文本数据中传输二进制数据。
什么是二进制数据? ⼴义:所有计算机数据都是⼆进制数据 狭义:⾮⽂本数据即⼆进制数据(图片,视频,,,) 文本数据:字符串
码表

例如将字符串”Man”进行Base64编码:

转换后的位数不是6的整数时,会对末尾进行补0:

在Java中,可以使用java.util.Base64类来进行Base64编码和解码。
import java.util.Base64;
public class Base64Example {
public static void main(String[] args) {
String originalString = "Hello, World!";
byte[] originalBytes = originalString.getBytes();
}
}
缺点:
因为⾃身的原理(6 位变 8 位),因此每次 Base64 编码之后,数据都会增⼤约 1/3,所以会影响存储和传输性能。
为了性能,那为什么不用八位对八位进行编码呢? 八位对八位需要256个字符,现在没有那么多字符可以来制作编码集。
用途
- 将⼆进制数据扩充了储存和传输途径(例如可以把数据保存到⽂本⽂件、可以通过聊天对话框或 短信形式发送⼆进制数据、可以在 URL 中加⼊简单的⼆进制数据)
- 普通的字符串在经过 Base64 编码后的结果会变得⾁眼不可读,因此可以适⽤于⼀定条件下的防 偷窥(较少⽤)
问:Base加密传输图片可以更安全高效吗? Base64无任何加密效果,只是重新编了个码;他把数据变长了1/3,也不算高效。
变种:Base58
把Base64去掉了几个字符(看起来容易混淆的字符): ⽐特币使⽤的编码⽅式,去掉了 Base64 中的数字 “0”,字⺟⼤写 “O”,字⺟⼤写 “I”,和字⺟⼩写 “l”,以及 “+” 和 “/” 符号,⽤于⽐特币地址的表示。因为这些虚拟货币的地址,很大可能会被手抄,去掉容易混淆的几个字符。而➕和/去掉是为了便于双击复制。
变种:URL encoding
在 URL 的字符串中,对⼀些不⽤于特殊⽤途的保留字符,使⽤百分号 “%” 为前缀进⾏单ᇿ编码,以避免出现解析错误。比如中文等字符。
压缩与解压缩
压缩:将数据使⽤更具有存储优势的编码算法进⾏编码。 解压缩:将压缩数据解码还原成原来的形式,以⽅便使⽤。
常见压缩算法:DEFLATE, JPEG, MP3
压缩是编码吗?是的
例如:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
使用某种压缩算法处理之后:
compress:a:1032;b:105
图片与音视频的编解码
含义:将图像、⾳频、视频数据通过编码来转换成存档形式(编码),以及从存档形式转换回来(解码)。 目的:方便存储和压缩媒体数据
一张图片的压缩举例:

目前的图片压缩算法,google的Webp比JPEG和PNG更优。
Hash
含义:把任意数据转换成指定⼤⼩范围(通常很⼩,例如 256 字节以内)的数据。
就是从元数据里抽离出特征值,作为Hash值。
例如:把每个学院都编号,001, 002, 003,,,这就是一个Hash的过程。
作用:相当于从数据中提出摘要信息,因此最主要⽤途是数字指纹
经典算法:MD5(容易破解,已经遗弃)、SHA1、SHA256
好的算法需要碰撞率低,即重复率。
实际用途:
- 数据完整性验证,原数据与现有数据hash值对比。
- 快速查找:hashCode()和HashMap()。 重写了equals,同时也要重写HashCode。
class HashDemo {
int age;
String name;
public boolean equals(Object obj) {
age == obj.age &&
name.equals(obj.name);
}
public long hashCode() {
return age * 100 + name.length();
}
}
为什么要重写HashCode()?
使用HashMap时,对于HashMap里的元素,有元素要进来时,比较这个元素key的HashCode和现存地址里的key的HashCode,如果不同就添加,如果相同就替换原元素的value。 HashCode没有写好时,发生碰撞时,会把原来那个元素的value给替换掉。 即重写HashCode是为了使用HashMap时不会出错,在equals不相等时,需要HashCode也不相等。
可以用于隐私保护,在储存用户密码时,不可以保存明文,而是将用户密码Hash一次,再存储。数据泄露时因为Hash不可逆,所以仍然不能获取关键数据。
- 破解:彩虹表,将常用密码与Hash值一一对应,反推出
- 加盐:做数据Hash时,提前在数据里加入其他的salt,这个盐是不可以泄露的。例如,在密码末尾加333,变成zhukai333,再进行Hash,那彩虹表也会失效。
注意:Hash不属于编码,也不属于加密,它是单向的不可逆转的。
用法举例:联系非对称加密,对数据签名时,会先进行Hash,大幅缩小数据体量,然后再对这个Hash值进行签名。

字符集
含义:⼀个由整数向现实世界中的⽂字符号的 Map 分支: • ASCII:128 个字符,1 字节 • ISO-8859-1:对 ASCII 进⾏扩充,1 字节 • Unicode:13 万个字符,多字节 • UTF-8:Unicode 的编码分⽀ • UTF-16 :Unicode 的编码分⽀ • GBK / GB2312 / GB18030:中国⾃研标准,多字节,字符集 + 编码