现代密码入门 (:分组密码和序列密码

发布于 2021-05-07  10 次阅读


前言

发现做啥都逃不了密码这个东西,到处都是加密。而熟知的base64、摩斯、栅栏、凯撒等等,几乎已经不会被当作密码而是当作编码,所以直接从现代加密开始学起。

AES/DES

DES属于迭代型密码,包含的参数有分组长度、密钥长度、迭代次数和圈密钥长度。DES的分组长度为64bit,密钥长度为64bit,圈数为16,圈密钥长度为48bit。
AES也属于迭代型分组密码,分组长度为128bit,当密钥长度为128bit时,圈数为10;当密钥长度为192bit时,圈数为12;密钥长度为128bit时,圈数为14。
分组密码也就是把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文。

在AES和DES中有两种常用加密模式:ECB和CBC。当然还有其他模式,但这两个在实际应用中较多。CBC与ECB最直观的区别就是CBC模式多了一个初始向量IV。

使用python进行AES加密 pip3 install pycryptodome
加密时需要注意的参数:

  1. 秘钥:必须是16位字节或者24位字节或者32位字节(因为python3的字符串是unicode编码,需要 encode才可以转换成字节型数据)
  2. 明文:字节长度需要是16位的倍数

在python2和3中使用加密时也有不同,python3中加密时只需要二进制而不是文本,所以要在字符串前加b
输出时先base64编码,再转码为字符串

from Crypto.Cipher import AES
import base64
m=b"flag{1234567890}" #密钥
key=b"123123123qwertyu"
iv=b"ytrewq6666666666"
cipher=AES.new(key,AES.MODE_CBC,iv)
c=cipher.encrypt(m) #加密明文

print(c)
print(base64.encodebytes(c))
print(base64.encodebytes(c).decode("utf-8"))

python2中则没有对二进制的要求,输出加密明文时会直接输出字符串,而通常加密后会出现不可见字符导致无法输出,应先hex编码输出

# coding=UTF-8
from Crypto.Cipher import AES
import base64
m="flag{1234567890}" #密钥
key="123123123qwertyu" 
iv="ytrewq6666666666"
cipher=AES.new(key,AES.MODE_CBC,iv)
c=cipher.encrypt(m) #加密明文

print(c.encode("hex"))

# resutl:92f33c5f0c275ced80487c9520219411

"孓然一身 , 了无牵挂"