# golang中DES/AES密码的使用

# DES特点

DES是一种64bit明文 加密成64bit密文对称密码算法 。它的密钥长度是56bit 。 (从规格上讲密钥长度是64bit,但是每隔7bit会设置1bit进行错误检查,因此实际上密钥长度是56bit)

DES以64bit的明文为一个单位进行处理,这64的单位称为分组 。以分组为单位处理的密码算法称为分组密码(blockcipher) ,des也是分组密码的一种。

DES已被破解,可在一天内被解密。

# 3DES特点

3DES(triple-DES)即三重DES,目的是加强DES的强度,将DES重复3次得到的密码算法。

三重DES密钥在算法中会被分成DES密钥1-2-3。

明文会被密钥1 DES加密,被密钥2 DES解密,再被密钥3 DES加密。(解密顺序反过来)

三重DES的密钥密钥长度为24 byte。(即三个DES密钥的长度)

3DES较为安全,但是效率比较低。

3DES依然是分组密码。

# AES特点

AES是取代DES出现的一种加密算法。AES的规格中,密钥长度只有128bit(16byte),192bit,256bit 三种

AES是一种非常安全的对称加密 算法,它也是一种分组密码,分组长度为128 bit / 16 byte。

在golang中提供的接口中,密钥长度只能是16 byte

# 分组密码的模式

可参见配图:分组密码工作模式

# 按位异或

golang按位异或操作符(XOR)^。(两个二进制数异或相同为0,不同为1)。

神奇特性:a异或b得c,相当于对a加密得c,那么,b异或c也能得到a,相当于对c解密得到a。

# ECB模式

ECB模式即电子密码本(Electronic Codebook)模式。需要加密的消息按照块密码的块大小被分为数个块,并对每个块进行独立加密/解密。

优点:每个块的加密/解密都是独立的,且使用相同的方法进行加密,所以可以进行并行计算。

缺点:但是这种方法一旦有一个块被破解,使用相同方法可以解密所有密文数据。安全性比较差,用于数据较少的情形,加密前需要把明文数据填充到块大小的整数倍。 同样的明文块会被加密成相同的密文块;因此,它不能很好的隐藏数据模式。在某些场合,这种方法不能提供严格的数据保密性。

(不推荐使用,golang中没有提供接口)

# CBC模式

CBC模式即密码块链接模式(Cipher-block chaining)。在cbc中