文章目录
- 学习资源来自:扔物线
- 加密
- 古代密码学
- 现代密码学
- 对称加密
- 非对称加密
- 密码学密钥和登录密码
- Base64
- URL 使用的百分号编码
- 压缩与解压缩
- 图片与音频、视频编解码
- 序列化
- Hash
- 字符集
- 课后题
学习资源来自:扔物线
加密
古代密码学
- 起源:古代战争——古典密码学
- 移位式加密:密码棒
- 加密算法:缠绕木棒后书写
- 密钥:木棒的尺寸规格
- 替换式加密
- 加密算法:替换文字
按规则使⽤不同的⽂字来替换掉原先的⽂字来进行加密。
码表:
- 加密算法:替换文字
原始字符:ABCDEFGHIJKLMNOPQRSTUVWXYZ
密码字符:BCDEFGHIJKLMNOPQRSTUVWXYZA
原始书信:I love you
加密书信:J mpwf zpv
解读后:I love you
加密算法:替换⽂文字
密钥:替换的码表
现代密码学
不止可以用于文字内容,还可以用于各种二进制数据
对称加密
对称加密又叫做私钥加密,即信息的发送方和接收方使用同一个密钥去加密和解密数据。对称加密的特点是算法公开、加密和解密速度快,适合于对大数据量进行加密。
加密过程如下:明文 + 加密算法 + 私钥 => 密文
解密过程如下:密文 + 解密算法 + 私钥 => 明文
-
经典算法
- DES(56 位密钥,密钥太短⽽逐渐被弃⽤)、AES(128 位、192 位、256 位密钥,现在最流行)
-
对称加密作⽤
- 加密通信,防⽌信息在不安全网络上被截获后,信息被人读取或篡改。
-
对称加密(如 AES)的破解
破解思路路- 拿到一组或多组原文-密文对
- 设法找到一个密钥,这个密钥可以将这些原⽂-密文对中的原⽂加密为密文,以及将密文解密为原文的组合,即为成功破解
反破解
一种优秀的对称加密算法的标准是,让破解者找不到⽐穷举法(暴力破解法)更有效的破解手段,并且穷举法的破解时间足够长(例如数千年)。
对称加密的缺点
密钥泄露露:不能在不安全⽹络上传输密钥,一旦密钥泄露则加密通信失败。
非对称加密
使用公钥对数据进行加密得到密文;使用私钥对数据进行解密得到原数据。
加密过程如下:明文 + 加密算法 + 公钥 => 密文,
解密过程如下:密文 + 解密算法 + 私钥 => 明文
使⽤非对称加密通信,可以在不可信⽹网络上将双方的公钥传给对方,然后在发消息前分别对消息使用
对方的公钥来加密和使用⾃己的私钥来签名,做到不可信网络上的可靠密钥传播及加密通信。
由于私钥和公钥互相可解,因此非对称加密还可以应用于数字签名技术。
通常会对原数据 hash 以后对 hash 签名,然后附加在原数据的后⾯作为签名。这是为了让数据更小
经典算法:RSA(可用于加密和签名)、DSA(仅⽤用于签名,但速度更更快)
-
非对称加密的优缺点
- 优点: 可以在不安全网络上传输密钥
- 缺点: 计算复杂,因此性能相比对称加密差很多
-
非对称加密(如 RSA、ECDSA)的破解
破解思路- 和对称加密不同之处在于,非对称加密的公钥很容易获得,因此制造原⽂-密⽂对是没有困难的
事 - 所以,非对称加密的关键只在于,如何找到⼀个正确的私钥,可以解密所有经过公钥加密过的密文。找到这样的私钥即为成功破解
- 由于非对称加密的⾃身特性,怎样通过公钥来推断出私钥通常是⼀种思路(例如 RSA),但往最佳⼿段依然是穷举法,只是和对称加密破解的区别在于,对称加密破解是不断尝试⾃己的新密钥是否可以将⾃己拿到的原文-密文对进⾏加密和解密,⽽非对称加密时不断尝试⾃己的新私钥是否和公钥互相可解。
- 和对称加密不同之处在于,非对称加密的公钥很容易获得,因此制造原⽂-密⽂对是没有困难的
反破解
和对称加密⼀样,⾮非对称加密算法优秀的标准同样在于,让破解者找不到⽐穷举法更有效的破解⼿段,并且穷举法的破解时间⾜够长。
密码学密钥和登录密码
- 密钥 (key)
- 场景: 用于加密和解密
- 目的: 保证数据被盗时不会被人读懂内容
- 焦点: 数据
- 登录密码 (password)
- 场景: 用户进入网站或游戏前的身份验证
- 目的: 数据提供方或应用服务方对账户拥有者数据的保护,保证“你是你”,的时候才提供权限
- 焦点: 身份
Base64
将二进制数据转换成由 64 个字符组成的字符串的编码算法
- 什么是二进制数据?
- 广义: 所有计算机数据都是二进制数据
- 狭义:非文本数据即二进制数据
算法
将原数据每 6 位对应成 Base 64 索引表中的一个字符编排成一个字符串 (每个字符 8 位)
Base64 索引表:
编码示例:把Man进行Base64编码
编码示例:Base64的末尾补足
Base64 的用途
- 将二进制数据扩充了储存和传输途径(例如可以把数据保存到文本文件、可以通过聊天对话框或短信形式发送二进制数据、可以在 URL 中加入简单的二进制数据)
- 普通的字符串在经过 Base64 编码后的结果会变得肉眼不可读,因此可以适用于一定条件下的防偷窥 (较少用)
Base64 的缺点
因为自身的原理 (6 位变 8 位),因此每次 Base64 编码之后,数据都会增大约 1/3,所以会影响存储和传输性能。
Base64 加密图片传输更安全和高效? ? ?
不。首先,Base64 并不是加密;另外,Base64 会导致数据增大 1/3,降低网络性能,增大用户流量开销,是画蛇添足的手段。 (最好不要拿来 diss 你们公司的后端哟,友善)Base64 对图片进行编码的用于在于,有时需要使用文本形式来传输图片。除此之外,完全没必要使用 Base64 对图片进行额外处理。
变种: Base58
bt币使用的编码方式,去掉了 Base64 中的数字“ 0 “,字母大写“ O ”,字母大写” I “,和字母小写” l “,以及“ + ”和“ / ”符号,用于bt币地址的表示,
Base58 对于 Base64 的改动,主要目的在于用户的便捷性。由于去掉了难以区分的字符,使得Base58 对于[人工抄写,更加方便。另外,去掉了”+”"/"号后也让大多数的软件可以方便双击选取。
URL 使用的百分号编码
在 URL 的字符串中,对一些不用于特殊用途的保留字符,使用百分号”%”为前缀进行单独编码,以避免出现解析错误。
例如,要在 http://hencoder.com/users
后面添加查询字符串,查询 name 为隐匿&伟大]的用如果直接写成 http://hencoder.com/user/?name=隐匿&伟大
,"&”符号就会被解析为分隔符号、因此需要对它进行转码,转码后的 URL为 http://hencoder.com/user/?name=隐匿%26伟大
这种编码仅用于URL,目的是避免解析错误的出现
压缩与解压缩
-
含义
- 压缩:将数据使用更具有存储优势的编码算法进行编码。
- 解压缩:将压缩数据解码还原成原来的形式,以⽅便使⽤。
-
⽬的
- 减小数据占用的存储空间
举例:
将下面的文本压缩
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
使用算法压缩后:
compress:a:1062;b:105
-
压缩是编码吗?
- 是。所谓编码,即把数据从一种形式转换为另一种形式。压缩过程属于编码过程,解压缩过程属于解码过程。
-
常见压缩算法
- DEFLATE、JPEG、MP3 等。
图片与音频、视频编解码
-
图片的编码:把图像数据写成 JPG、PNG 等文件的编码格式
-
图片的解码:把JPG、PNG 等文件中的数据解析成标准的图像数据
-
含义
- 将图像、音频、视频数据通过编码来转换成存档形式 (编码),以及从存档形式转换回来 (解码)
-
目的
- 存储和压缩媒体数据 (大多数媒体编码算法会压缩数据,但不是全部)
-
图片压缩粗暴算法举例
一张纯白 (白色的 16 进制数值为 xffffff) 的 64x64 不透明像素图片,原数据格式大致为:
width:64;height:64;ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff.......f
fffff
使用算法压缩后:
width:64;height:64;ffffff:[0,0]-[63,63]
音频与视频的编码与上面的图片编码同理
序列化
把数据对象(一般是内存中的,例如JVM 中的对象)转换成字节序列的过程。对象在程序内存里的存放形式是散乱的(存放在不同的内存区域、并且由引用进行连接),通过序列化可以把内存中的对象转换成一个字节序列,从而使用 bvte 等形式进行本地存储或网络传输,在需要的时候重新组装(反序列化)来使用
- 反序列化:把字节序列重新转换成内存中的对象
- 序列化:把数据对象(一般是内存中的,例如JVM 中的对象)转换成字节序列的过程
- 目的:让内存中的对象可以被存储和传输
序列化是编码吗?- 严格来说不是,序列化是jvm管理的内容,编码是将A格式变B格式
Hash
- 定义:把任意数据转换成指定大小范围 (通常很小)的数据
- 作用:摘要、数字指纹
- 经典算法: MD5、SHA1、SHA256等
- 实际用途:
-
唯一性验证
Java 中的 hashCode() ⽅方法。 -
数据完整性验证
-
快速查找:
hashCode()和 HashMap -
隐私保护
当重要数据必须暴露的时候,有事可以选择暴露它的 Hash 值 (例如 MD5),以保障原数据的安全例如网站登录时,可以只保存用户密码的 Hash 值,在每次登录验证时只需要将输入的密码的 Hash值和数据库中保存的 Hash 值作比对就好,网站无需知道用户的密码。这样,当网站数据失窃时,用户不会因为自己的密码被盗导致其他网站的安全也受到威胁
-
注意: 这不属于加密
-
Hash 是编码吗?
不是。Hash 是单向过程,往往是不可逆的,无法进行逆向恢复操作,因此 Hash 不属于编码 -
Hash 是加密吗?
不是。Hash 是单向过程,往往是不可逆的,无法进行逆向恢复操作,因此 Hash 不属于编码
字符集
含义:一个由整数向现实世界中的文字符号的 Map
分支:
- ASCI: 128 个字符,1 字节
- ISO-8859-1: 对 ASCII 进行扩充,1 字节
- Unicode: 13 万个字符,多字节
。 UTF-8: Unicode 的编码分支
。 UTF-16: Unicode 的编码分支 - GBK/GB2312/GB18030: 中国自研标准,多字节,字符集 +编码
课后题
- 【单选题】现代密码学可以加密什么数据?
A. 文本数据
B. 二进制数据
C. 文本数据和二进制数据都可以
答案: C
答案解析:现代密码学可以加密的数据类型包括文本数据和二进制数据。文本数据通常是指人类可读的字符信息,例如文本文件、电子邮件等。二进制数据则是指计算机内部以0和1表示的数据,例如图片、音频、视频等。通过使用不同的加密算法和密钥,可以对这些数据进行加密和解密操作,以保护数据的机密性和完整性。因此,答案为C. 文本数据和二进制数据都可以。
- 【单选题】对称加密的加密与解密过程?
A. 使用相同的密钥,相同的算法,对数据进行计算后得出的结果就是密文,之后再对密文进行计算之后得出的结果就是解密后的原数据
B. 使用密钥和加密算法,对数据进行计算后得出的结果就是密文;使用相同的密钥,以及加密算法的逆过程,对密文进行计算之后得出的结果就是解密后的原数据
C. 使用公钥对数据进行加密算法,计算得出的结果就是密文;使用私钥以及和加密过程同样的加密算法,对密文进行计算之后得出的结果就是解密后的原文。
答案: B
答案解析:对称加密的加密和解密过程是:使用相同的密钥和相同的算法,对数据进行加密计算,得到密文;然后使用相同的密钥和加密算法的逆过程,对密文进行解密计算,得到原始数据。因此,答案是B
- 【单选题】非对称加密的加密与解密过程?
A. 使用相同的密钥,相同的算法,对数据进行计算后得出的结果就是密文,之后再对密文进行计算之后得出的结果就是解密后的原数据
B. 使用密钥和加密算法,对数据进行计算后得出的结果就是密文;使用相同的密钥,以及加密算法的逆过程,对密文进行计算之后得出的结果就是解密后的原数据
C. 使用公钥对数据进行加密算法,计算得出的结果就是密文;使用私钥以及和加密过程同样的加密算法,对密文进行计算之后得出的结果就是解密后的原文。
答案: C
答案解析:非对称加密的加密与解密过程是:使用公钥对数据进行加密算法,计算得出的结果就是密文;然后使用私钥以及和加密过程同样的加密算法,对密文进行解密计算,得到解密后的原文。因此,答案是C
- 【单选题】使用非对称加密进行数字签名的原理?
A. 使用公钥对数据进行加密,然后使用私钥对数据进行解密。
B. 使用私钥对数据进行加密,然后使用公钥对数据进行解密。
答案: B
答案解析:非对称加密是一种加密方法,其中有两个密钥:公钥和私钥。公钥用于加密数据,而私钥用于解密数据。数字签名是一种用于验证数据完整性和身份认证的技术,它使用了非对称加密的原理。数字签名的过程是:发送方使用私钥对数据进行加密,然后接收方使用公钥对数据进行解密,以验证数据的完整性和身份认证
- 【单选题】在实际运用中,为什么要用原数据的 hash 来进行数字签名?
A. 因为直接签名会导致原数据变得不直接可读
B. 因为如果直接对原数据进行签名,然后把签名附加在原数据的后面,会导致签名数据过大,占用传输和存储空间。
C. 以上两点都有
答案: C
答案解析:在实际运用中,要使用原数据的哈希值来进行数字签名,而不是直接对原数据进行签名,原因有两点:
- 如果直接对原数据进行签名,然后把签名附加在原数据的后面,会导致签名数据过大,占用传输和存储空间。
- 使用哈希值进行签名可以保证原数据的完整性,因为任何微小的改变都会导致哈希值发生改变,从而使得签名无效。
- 【单选题】在不可信网络上直接传输对称加密的密钥,然后使用密钥来通信,会有什么风险?
A. 会被别人拦截到密钥,然后窃听通信内容
B. 会被别人拦截到密钥,然后篡改通信内容
C. 以上两个都有
答案: C 答案解析:在不可信网络上直接传输对称加密的密钥,然后使用密钥来通信,会面临以下两个主要风险:
- 密钥被拦截:由于是在不可信网络上进行密钥传输,攻击者可能会在网络上拦截这个密钥。一旦攻击者获得了密钥,他们就能够解密之后的通信内容,从而窃听通信内容。
2.通信内容被篡改:使用同一个密钥进行通信意味着攻击者不仅能够拦截通信内容,而且可以篡改通信内容。这是因为使用同一个密钥进行加密和解密,攻击者可以修改通信内容(例如,插入、删除或更改信息)而不改变加密和解密的结果。因此,正确答案是C
- 【单选题】在不可信网络上直接传输非对称加密的公钥,然后只使用对方的公钥来加密通信内容,而不是用自己的私钥来签名,有什么风险?
A. 被别人拿到对方公钥,然后窃听通信内容
B. 被别人拿到对方公钥,然后篡改通信内容
C. 以上两个都有
答案: B
答案解析:在不可信网络上直接传输非对称加密的公钥,然后只使用对方的公钥来加密通信内容,而不是用自己的私钥来签名,仍然存在以下两个主要风险:
- 公钥被拦截:由于是在不可信网络上进行公钥传输,攻击者可能会在网络上拦截这个公钥。一旦攻击者获得了这个公钥,他们就能够解密之后的通信内容,从而窃听通信内容。
- 通信内容被篡改:使用对方的公钥进行加密,虽然不能直接解密内容,但攻击者仍然可以篡改通信内容。这是因为非对称加密的公钥只是用于加密,而不是用于验证信息的完整性。因此,即使通信内容被篡改,接收方也很难察觉。因此,正确答案是C
8.·【单选题】Base64 编码的本质是什么?
A. 把数据做成字符串
B. 把数据加密
C. 把数据加密并做成字符串
答案: A 答案解析:Base64 编码的本质并不是加密数据,而是将二进制数据转化为可打印的 ASCII
字符。它是一种编码方式,目的是在不考虑字符集和编码的情况下,将任意二进制数据转换为可打印的 ASCII
字符串。这样做的好处是可以方便地在不支持二进制数据的场景(例如电子邮件)中传输数据。因此,答案是A
9.【单选题】压缩与解压缩属于编码与解码吗?
A. 属于
B. 不属于
答案: A
答案解析:压缩与解压缩是一种将数据从一种格式转换为另一种格式的过程。在压缩过程中,数据被编码为一个更小的表示形式,这样可以节省存储空间或提高传输效率。解压缩则是相反的过程,将压缩的数据解码或转换回原始的形式。这两个过程可以看作是编码和解码的一种形式,因为它们涉及到将数据从一种形式转换为另一种形式。因此,答案是A
- 【单选题】序列化的本质是什么?
A. 把二进制数据变成可读写的形式
B. 把内存中的对象变成二进制形式
答案: B
答案解析:序列化的本质是把内存中的对象变成二进制形式。序列化是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化过程中,对象被转换为二进制序列,可以保存在文件中、传输到另一个计算机或通过网络发送到另一个进程。这个二进制序列可以在需要时通过反序列化重新创建对象。因此,答案为B
- 【单选题】Hash 的本质是?
A. 把数据进行一种不可逆加密
B. 从数据中提出摘要信息
C. 把数据变成字符串
答案: B
答案解析:Hash 的本质是从数据中提取摘要信息。Hash函数将任意长度的二进制值映射为固定长度的二进制值,这个映射的结果就是所谓的“摘要”。摘要可以看作是原始数据的“指纹”,它提供了数据的简要表示,同时保留了足够的信息以便可以进行比对和验证。这种摘要信息的提取是单向的,也就是说,一旦数据被哈希,它就不能被还原回原始数据。因此,答案为B
- 【多选题】Hash 的作用有:
A. 唯一性验证:判断一个数据是否是原数据,通过对比 hash 值就可以大概率做到
B. 数据完整性验证:从网络上下载文件后,通过 MD5 值等 hash 值来判断文件是否损坏
C. 快速查找:在 HashMap 的实现中,使用 hash 值快速寻找目标值的内存地址
存地址
D. 隐私保护:将用户的密码进行 hash 计算后再保存,防止网站数据泄露后暴露用户密码
答案: A B C D
答案解析:A. 唯一性验证:判断一个数据是否是原数据,通过对比 hash 值就可以大概率做到。这个选项是正确的,因为hash 函数的输出结果具有很高的唯一性,也就是说,输入稍微变化一点,输出的 hash值就会完全不同。因此,我们可以利用这个特性来判断一个数据是否是原数据,即通过对比 hash 值来判断。
B.数据完整性验证:从网络上下载文件后,通过 MD5 值等 hash 值来判断文件是否损坏。这个选项也是正确的,因为 hash 函数可以用于检测数据的完整性。在下载文件后,我们可以计算下载的文件和源文件的 hash值,并将这两个值进行对比。如果两个值相同,那么文件就是完整的;否则,文件就可能已经损坏。
C. 快速查找:在 HashMap 的实现中,使用hash 值快速寻找目标值的内存地址。这个选项也是正确的,因为 HashMap 是一种使用 hash 表的关联式容器,它通过计算键的hash 值来定位键值对在内存中的位置。这种做法可以大大提高查找速度,使得查找操作的时间复杂度为 O(1)。
D.隐私保护:将用户的密码进行 hash 计算后再保存,防止网站数据泄露后暴露用户密码。这个选项也是正确的,因为通过对用户的密码进行 hash
计算并保存其 hash 值而不是原始密码,即使网站数据泄露,攻击者也无法直接获取到用户的密码。这是因为 hash函数是单向的,即从原始密码到 hash 值的计算是很容易的,但是从 hash 值反推出原始密码是非常困难的。因此,通过保存用户密码的hash 值而不是原始密码,可以有效地保护用户的隐私。因此,所有选项 A、B、C、D 都是正确的