【在厨房想30天的演算法】Day 24 资讯安全与演算法 : 共用金钥密码系统

Aloha!又是我少女人妻 Uerica !最近 KTV 终於解封了,只是戴口罩又只能喝水要怎麽唱,气氛完全不对啊~,不能喝不能吃少一味,还是居家防疫好了!


还记得昨天提到的加密金钥吗~今天就来说明一下金钥是什麽吧!

共用金钥密码系统 shared-key crypto system

共用金钥密码系统是一种对称式加密,加密和解密都使用相同的金钥,就像前面所说的,交换日记都各有一把钥匙,上锁和打开都是同一把。共用金钥密码系统的密码现在大多都是使用 AES ( 进阶加密标准 Advanced Encryption Standard )。

在使用金钥进行加密时,需要加密的明文长度通常会大於金钥的长度,所以为了让加密演算法可以加密个整长度的讯息,会将明文切成多个区块来依序处理,而区块的大小就是金钥的长度,而演算法如何处理这些区块,又分为五种加密模式 mode of operation

  • 金钥 Key : 是指某个用来完成加密、解密、完整性验证等密码学应用的秘密信息

加密模式 mode of operation

电子密码本模式 ( Electric CodeBook Mode, ECB )

最简单的加密模式,做法是将需要加密的讯息分成数个区块,并对每个区块进行独立加密,这种做法虽然直观简单,但同样的明文区块会生成同样的密文区块,所以容易从大量的密文回推明文资料,所以不推荐使用此加密模式。
kl3k2MT

密码分组连结模式 ( Chiper Block Chaining Mode, CBC )

因为 ECB 模式容易被回推,所以 CBC 模式会让每个加密前的明文区块与前一个密文区块做 XOR 运算,之後再进行加密,而第一个区块因为没有上一个密文区块,所以设计了一个叫初始化向量 ( Initial Vector, IV ) 的概念,但因为每个密文区块需要解密的话,都依赖着上一个密文区块,虽然资料隐密性比 ECB 更好,但缺点是整个加密过程是串行的,要解密就必须一一推算出之前的密文。

  • 初始化向量 ( Initialization Vector, IV ) :
    又称起始变数,是一串固定长度的输入值,通常为随机数或拟乱数。通常同样的金钥不建议一直使用同样的 IV。

  • XOR 互斥或 : XOR 运算子会将三个值其中两个无论怎麽替换都可推演出另一个值。例如: a xor b = c,那 b xor c = a 、 a xor c = b。
    gk2OfXq

密文反馈模式 ( Chiper FeedBack Mode, CFB )

CFB 模式与 CBC 模式雷同,只是运算的顺序稍微不同,CFB 模式中,前一个密文区块会先用加密演算法运算过後,再与明文做 XOR 运算。
9shS1YG

输出反馈模式 ( Output FeedBack Mode, OFB )

与 CBC 、 CFB 模式类似,但 OFB 模式是将上一个区块的加密演算法与目前区块的加密演算法一起运算,结果再与明文区块做 XOR 运算,最後产生出密文区块,前面提到 CBC 、 CFB 解密都需一个个回推之前的密文,而 OFB 好处是想要解密某区块,只要从加密演算法慢慢推导到目前的区块即可。
qrvVHDx

计数器模式模式 ( Counter Mode, CTR )

上一个提到的 OFB 模式需要从第一个 IV 加入演算法慢慢推导到目前区块,而 CTR 模式是先产生一组乱数,再加上用计数器计算的值,计数器可以是任意保证长时间不产生重复输出的函式。
MDWH7no

参考资料 :

密码的加密模式(ECB CBC CFB OFB CTR)

Day 21. 加密演算法要注意的那些毛 (一) - 加密模式

AES-JS:JavaScript 的 AES 对称式资料加密工具

维基百科 : 区块加密法工作模式


好的今天就先到这边啦~感谢阅读,明天见!掰掰


<<:  【Day 26】迁移学习(Transfer Learning)(上)

>>:  那些被忽略但很好用的 Web API / ScrollIntoView

Day04 - Gem-activerecord-import 批次建立介绍与应用

前言 当需要大量建立资料时,可以选择逐笔建立,但会有 N+1 insert problem 透过 a...

Day 26 Compose UI Navigation

今年的疫情蛮严重的,希望大家都过得安好,今天疫情已经降级, 希望疫情快点过去,能回到一些线下技术聚会...

Day 2 - 如何运用sail快速建置Laravel 8.0

观看Laravel 8.0的官方文件教学,可以看到一个新的东西就是我们这次要介绍的Sail,用起来非...

Day 28: gulp 是怎麽运作的

要讲到 gulp 怎麽运作的就不得不讲到 vinyl 跟 Node.js 的 stream viny...

[Day 04] 测试驱动开发

接下来要讨论的问题是, 什麽时候开始写测试, 很多人会觉得应该在整个软件开发完之後开始写测试, 但是...