数据的加密算法一般都可以分几类,有对称加密,非对称加密,不可逆加密(也叫hash算法或者散列算法)。
对称加密:
对称加密算法是当前使用最广,使用频率最高的加密算法,优点:计算量小,速度快,加密效率高,适合对海量数据进行加密处理。缺点:密钥管理和分发难,不够安全,如果一方的密钥泄露,那加密信息就不安全了。常见的对称加密有:DES、3DES、AES
非对称加密:
非对称加密是非常可靠,密钥越长,则难破解。优点:加密和解密的密钥不一致,公钥是公开的,这样的密钥就可以方便传递,从而不被破解。缺点:加密速度慢,rsa只能加密少量数据。比较常见的就是RSA非对称加密算法。
不可逆加密:
常见的不可逆算法又叫hash算法,散列算法,常见的算法有MD5,SHA1,SHA-2,HMAC
这里我们来看下AES的实现,下面我们看下golang是如何实现这个加解密的。
代码语言:javascript复制package main
import (
"bytes"
"crypto/aes"
"crypto/cipher"
)
// aes加密
func Encrypt(plantText, key []byte) ([]byte, error) {
// 这个代码比较重要,是涉及到签名大小
if len(key) > 16 {
key = key[:16]
}
//NewCipher该函数限制了输入k的长度必须为16, 24或者32l
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}
//补全码
plantText = PKCS7Padding(plantText, block.BlockSize())
//加密模式
blockModel := cipher.NewCBCEncrypter(block, key[:block.BlockSize()])
//创建数组
ciphertext := make([]byte, len(plantText))
//加密
blockModel.CryptBlocks(ciphertext, plantText)
return ciphertext, nil
}
func PKCS7Padding(ciphertext []byte, blockSize int) []byte {
padding := blockSize - len(ciphertext)%blockSize
padtext := bytes.Repeat([]byte{byte(padding)}, padding)
return append(ciphertext, padtext...)
}
// aes解密
func Decrypt(ciphertext, key []byte) ([]byte, error) {
// 这个代码比较重要,是涉及到签名大小
if len(key) > 16 {
key = key[:16]
}
//分组秘钥
block, err := aes.NewCipher(key) // 选择加密算法
if err != nil {
return nil, err
}
//加密模式
blockModel := cipher.NewCBCDecrypter(block, key[:block.BlockSize()])
plantText := make([]byte, len(ciphertext))
//解密
blockModel.CryptBlocks(plantText, ciphertext)
//去补全码
plantText = PKCS7UnPadding(plantText, block.BlockSize())
return plantText, nil
}
func PKCS7UnPadding(plantText []byte, blockSize int) []byte {
length := len(plantText)
unpadding := int(plantText[length-1])
return plantText[:(length - unpadding)]
}
关于AES,AES:高级加密标准(Advanced Encryption Standard),又称Rijndael加密法,这个标准用来替代原先的DES。AES加密数据块分组长度必须为128bit(byte[16]),密钥长度可以是128bit(byte[16])、192bit(byte[24])、256bit(byte[32])中的任意一个。块:对明文进行加密的时候,先要将明文按照128bit进行划分。填充方式:因为明文的长度不一定总是128的整数倍,所以要进行补位,我们这里采用的是PKCS7填充方式。
总结:
1:AES加密的密钥长度必须是16,24,32字节。
2:关于AES加密比较常用来加密大文件的信息。