【密码学】对称密码体制

【密码学】对称密码体制

【密码学】对称密码体制

请设置文章作者

密码学

发布于:Apr 25, 2020

次浏览

本文学习对称密码学的基础概念,分组密码的四种工作方式,以及详细介绍DES、AES的加密算法过程与Python实现。

概述:对称密码

要求加密与解密使用同一个共享密钥,因此要求通信双方必须在通信前商定密钥并妥善保存。

对称密码体制从工作方式上可以分为分组加密和序列密码两大类。

优点:算法公开、计算量小、加密速度快、加密效率高

缺点:交易双方都使用同样钥匙,安全性得不到保证

序列密码(流加密):对明文的单字节进行运算,明文加密后密码保持和明文同样长度,解密是指用同样的密钥和密码算法及与加密相同的伪随机位流,用以还原明文位流。常见流密码算法有RC4、SEAL等。

分组密码(块加密):将明文信息划分成不同的块,分别对每个块进行运算。多用于网络加密。分块长度越长,密码分析越困难,越不利于操作和运算,分块长度应该权衡安全性与实用性。常见分组密码算法有DES、AES等。

DES、3DES、AES常见对称加密算法包括DES、3DES、AES。

DES(Data Encryption Standard) 数据加密标准,速度较快,适用于加密大量数据的场合。

3DES(Triple DES) 基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高、

AES(Advanced Encryption Standard) 高级加密标准,下一代的加密算法,速度、安全级别更高,支持128,192,256,512位密钥的加密。

算法特征:

加密方与解密方使用同一个密钥。

加密解密的速度比较快,适合数据比较大时的使用。

密钥传输的过程不安全,且容易被破解,密钥管理比较麻烦。

分组加密的四种工作方式

ECB(Electronic Code Book) 电子编码本

CBC(Cipher Block Chaining) 密码分组链接

CFB(Cipher Feedback) 密码反馈

OFB(Output Feedback) 输出反馈

ECBECB模式是最简单的加密算法,明文消息被分成固定大小的块,并且每个块被单独加密。每个块的加密与解密都是独立的,且使用相同的方式进行加密,所以可以进行并行计算。但是这种方法存在缺点,一旦有一个块被破解,使用相同的方式可以解密其他块,导致可以解密出所有明文数据,安全性比较差。

适用场景:数据较少,加密前需要把明文数据填充到块大小的整数倍。

优点:简单、孤立,每个块单独运算。适合并行运算,传输错误一般只影响当前块。

缺点:同明文输出同密码,可能导致明文攻击。

ECB Encryption示意图

ECB Decryption示意图

CBCCBC模式中每一个分组要先和前一个分组加密后的数据进行XOR异或操作,然后再进行加密。因此每个密文块依赖该块之前的所有明文块,为了保持每条消息都具有唯一性,第一个数据块进行加密之前需要用初始化向量IV进行异或操作。

适用场景:最常见的加密方式,并且与ECB一样消息块必须填充到块大小的整倍数。

优点:串行化运算,相同明文不同密文。

缺点:需要初始向量。加密是连续的,不能并行处理。

CBC Encryption示意图

CBC Decryption示意图

CFBCFB模式与CBC模式比较相似,前一个分组的密文加密后和当前分组的明文XOR异或操作生成当前分组的密文。(与CBC模式仅在异或的顺序上不同)

优点:同明文不同密文,分组密钥转换为流密码

缺点:串行运算不利并行,传输错误可能导致后续传输块的错误

CFB Encryption示意图

CFB Decryption示意图

OFBOFB模式将分组密码转换为同步流密码(根据明文长度先独立生成相应长度的流密码),与CFB模式非常相似,CFB是前一个分组的密文加密后XOR当前分组明文。OFB是初始化向量IV不断加密后XOR前一组的明文。由于异或操作的对称性,OFB模式的解密与加密的流程一样。

优点:同明文不同密文,分组密钥转换为流密码

缺点:串行运算不利并行,传输错误可能导致后续传输块的错误。

OFB Encryption示意图

OFB Decryption示意图

DES加密过程概述采用56位密钥加密64位的明文数据

当n个64位明文数据块都经过DES加密处理(这里采用上述四种工作方式中的ECB模式)后,所得到的n个64位密文数据块串在一起就是密文输出。

加密流程图

Round:每一轮都进行一次扩展置换、S盒压缩和P盒置换。

三个知识难点

初始(终止)置换

扩展置换

S盒压缩

初始(终止)置换初始和终止置换都是按照一定的规则,将原来的64位二进制重新排序。

初始置换与终止置换表

从初始置换表中可以看出,将输入的58位换到第1位,第50位换到第2位,以此类推

从终止置换表中可以看出,将输入的40位换到第1位,第08位换到第2位,以此类推

举例例子来说明根据上述初始置换与终止置换表,给定原始数据(一般是16位十六进制数,下图已将其转化为64位二进制数)

计算置换后的数据

终止置换的原理和初始置换是一样的,他们的排列是互逆的,即经过一次初始置换和终止置换,64位二进制数就还原了。

扩展置换经过初始置换的64位数据被分成左右32位数据,其中一边的32位进行扩展置换得到48位的数据。

具体的扩展过程就是在某些位置进行添位操作。

我们仍可以参照初始数据置换表类似的扩展置换表。

扩展置换表

根据这32位二进制数据来展示扩展置换的过程.

将原始数据分成8组,接着将每个组从4位扩展成6位的组。

121101 0001 0011 01000010 0011 0011 1011

根据扩展字段表

第一组的头添位是原始数据的第32位1,第一组的尾添位是原始数据的第05位0

第二组的头添位是原始数据的第04位1,第一组的尾添位是原始数据的第09位0

…依次类推

这样就完成从32位扩展到48位的扩展置换过程。

12111010 100010 100110 101000000100 000110 100111 110111

S盒压缩处理经过扩展的48位明文和48位密钥进行异或运算后,再使用8个S盒压缩处理得到32位数据。

实际上就是将48位输入等分成8块,每块6位输入压缩为4位输出。与前面置换表类似的,具体处理时是分别采用8张4行16列的表来进行替换从而达到压缩的目的。

举例例子来说明输入原始数据,并将其分成8组,每组6位。

1234111111 100101110011 001100011001 010111111011 011000

第一组的压缩表

我们以第一组为例来演示S盒压缩处理

12345原始数据:111111头尾数据(第0位和最后一位):11 -> 3 行数中间四位:1111 -> 15 列数根据行数和列数即可在压缩表中找到对应的压缩数13再转化成二进制1101。

在全部组完成S盒压缩,则是从48位转换到32为的S盒压缩处理过程。

P盒置换经过S盒压缩处理后,再经过P盒置换,就得到一轮运算中的最后输出了。

DES Python实现若需要在Python中使用des加密,可以直接使用pyDes库加密,该库提供了CBC和ECB两种加密方式。(注:安装pyDes库 pip install pyDes)

pyDes.des(key, [mode], [IV], [pad], [padmode])

Key 输入密钥

mode ECB或者CBC

IV 初始密钥8位(在使用CBC模式时)

pad/padmode 默认None/PAD_NORMAL

需要注意的是在说明文档里写着Python3使用字节而不是字符串。

以下为本人使用的例子,采用CBC加密方法。

12345678910111213import base64import pyDesDes_key = b"ABCDEFGH" # 密钥Des_IV = b"\x33\x22\x81\x35\x38\xBC\xE7\x5A" #自动IV向量def DesEncrypt(str): k = pyDes.des(Des_key, pyDes.CBC, Des_IV, pad=None, padmode=PAD_PKCS5) EncryptStr = k.encrypt(str) return base64.b64encode(EncryptStr)DesEncrypt(b"let do it")

1Output: b'Ub48xNwxZ/B8ZpEvpO+Mwg=='

AES加密过程

AES加密方式有五种:ECB, CBC, CTR, CFB, OFB

从安全性角度推荐CBC加密方法,本文介绍了CBC,ECB两种加密方法的python实现

python 在 Windows下使用AES时要安装的是pycryptodome 模块 pip install pycryptodome

python 在 Linux下使用AES时要安装的是pycrypto模块 pip install pycrypto

CBC加密需要一个十六位的key(密钥)和一个十六位iv(偏移量)

ECB加密不需要iv

AES-CBC Python实现1234567891011121314151617181920212223242526272829303132333435363738394041from Crypto.Cipher import AESfrom binascii import b2a_hex, a2b_hex# 如果text不足16位的倍数就用空格补足为16位def add_to_16(text): if len(text.encode('utf-8')) % 16: add = 16 - (len(text.encode('utf-8')) % 16) else: add = 0 text = text + ('\0' * add) return text.encode('utf-8')# 加密函数def encrypt(text): key = '9999999999999999'.encode('utf-8') mode = AES.MODE_CBC iv = b'qqqqqqqqqqqqqqqq' text = add_to_16(text) cryptos = AES.new(key, mode, iv) cipher_text = cryptos.encrypt(text) # 因为AES加密后的字符串不一定是ascii字符集的,输出保存可能存在问题,所以这里转为16进制字符串 return b2a_hex(cipher_text)# 解密后,去掉补足的空格用strip() 去掉def decrypt(text): key = '9999999999999999'.encode('utf-8') iv = b'qqqqqqqqqqqqqqqq' mode = AES.MODE_CBC cryptos = AES.new(key, mode, iv) plain_text = cryptos.decrypt(a2b_hex(text)) return bytes.decode(plain_text).rstrip('\0')if __name__ == '__main__': e = encrypt("hello world") # 加密 d = decrypt(e) # 解密 print("加密:", e) print("解密:", d)

AES-ECB Python实现1234567891011121314151617181920212223242526272829303132333435363738394041"""ECB没有偏移量"""from Crypto.Cipher import AESfrom binascii import b2a_hex, a2b_hexdef add_to_16(text): if len(text.encode('utf-8')) % 16: add = 16 - (len(text.encode('utf-8')) % 16) else: add = 0 text = text + ('\0' * add) return text.encode('utf-8')# 加密函数def encrypt(text): key = '9999999999999999'.encode('utf-8') mode = AES.MODE_ECB text = add_to_16(text) cryptos = AES.new(key, mode) cipher_text = cryptos.encrypt(text) return b2a_hex(cipher_text)# 解密后,去掉补足的空格用strip() 去掉def decrypt(text): key = '9999999999999999'.encode('utf-8') mode = AES.MODE_ECB cryptor = AES.new(key, mode) plain_text = cryptor.decrypt(a2b_hex(text)) return bytes.decode(plain_text).rstrip('\0')if __name__ == '__main__': e = encrypt("hello world") # 加密 d = decrypt(e) # 解密 print("加密:", e) print("解密:", d)

博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议

本文永久链接是:http://example.com/2020/04/25/%E3%80%90%E5%AF%86%E7%A0%81%E5%AD%A6%E3%80%91%E5%AF%B9%E7%A7%B0%E5%AF%86%E7%A0%81%E4%BD%93%E5%88%B6/

更新于:Apr 26, 2020

[OpenStack]2.虚拟化

学习虚拟化及其技术KVM。

虚拟化虚拟化是云计算的基础。

虚拟化让一台物理机可以运行多个虚拟机,共享物理机的CPU、内存、IO,但是在逻辑上虚拟机之间是相互隔离的。

注:宿主机Host,虚拟...

常见端口及攻防手段

本文学习常见端口以及对应的服务器的攻防手段。

端口号

端口说明

攻击技巧

21/22/69

ftp/tftp文件传输协议

爆破\嗅探\溢出\后门

22

ssh:远程连接

爆破...

相关推荐

鬼魂之刃

鬼魂之刃

10-15 👁️ 8152
怀旧服头腿附魔如何获取 8种秘药获取方式
童话镇消亡史:封杀陈一发的24小时