密码技术应用--AES文件加解密
【密码技术应用--AES文件加解密】记录一下对一些稍大文件进行AES加解密的实现,这里只列出了核心代码,其他不涉及的代码或者有任何疑问可以查看我之前写的密码技术专题博客
var key = []byte("1234567812345678")
var iv = []byte("1111111122222222")/*
函数名:paddingLastGroup
对 CBC 加密模式的加密算法提供最后一个分块的明文数据填充
参 数:
plainText , 明文数据
blockSize , CBC 分块大小
返回值:
填充后的明文数据
创建时间及创建者:
2021-06-15Yuan_sr
*/
func paddingLastGroup(plainText []byte, blockSize int) []byte{
padNum := blockSize - len(plainText) % blockSize
char := []byte{byte(padNum)}
newPlain := bytes.Repeat(char, padNum)
newText := append(plainText, newPlain...)
return newText
}/*
函数名:unpaddingLastGroup
对 CBC 加密模式的加密算法提供最后一个分块的明文数据去填充
参 数:
plainText , 明文数据
返回值:
去填充后的明文数据
创建时间及创建者:
2021-06-15Yuan_sr
*/
func unpaddingLastGroup(plainText []byte) []byte{
length := len(plainText)
lastChar := plainText[length - 1]
number := int(lastChar)
return plainText[:length - number]
}/*
函数名:aesEnctrpt
aes 加密算法实现对文件的加密
参 数:
filePathIn ,待加密文件
key ,加密密钥
返回值:
加密后密文文件名
错误信息
创建时间及创建者:
2021-06-15Yuan_sr
*/
func aesEnctrpt(filePathIn string, key []byte) (string, error){
inFile, err := os.Open(filePathIn)
if err != nil {
return "", err
}
defer inFile.Close()fileInfo, err := inFile.Stat()
if err != nil {
return "", err
}
blockNum := fileInfo.Size() / bufferSize
var num int64outFile, err := os.Create(encryptFileName)
if err != nil {
return "", err
}
defer outFile.Close()buf := make([]byte, bufferSize)//初始化一个底层加密算法
block, err := aes.NewCipher(key)
if err != nil {
return "", err
}
//选择加密模式
//stream := cipher.NewCTR(block, iv)
blockMode := cipher.NewCBCEncrypter(block, iv)for {
num += 1
n, err := inFile.Read(buf)
if err == io.EOF{
break
}
if err != nil && err != io.EOF {
return "", err
}//判断时最后一段数据则进行数据填充
if num == blockNum + 1{
groupData := paddingLastGroup(buf[:n], block.BlockSize())
n = len(groupData)
buf = make([]byte, n)
buf = groupData
}
cipherText := make([]byte, n)
//stream.XORKeyStream(cipherText, buf[:n])
blockMode.CryptBlocks(cipherText, buf[:n])
_, err = outFile.Write(cipherText)
if err != nil {
return "", err
}
}
//outFile.Write(iv)
return encryptFileName, nil
}/*
函数名:aesDecrypt
aes 解密算法实现对文件的解密
参 数:
cipherFile ,密文文件
key ,解密密钥
返回值:
解密后文件名
错误信息
创建时间及创建者:
2021-06-15Yuan_sr
*/
func aesDecrypt(cipherFile string, key []byte) (string, error){
plainFileName = "plainText.file"
//1.创建一个aes底层密码接口
block, err := aes.NewCipher(key)
if err != nil {
return "", err
}
//2.选择解密模式
blockMode := cipher.NewCBCDecrypter(block, iv)
//3.解密
fr, err := os.Open(dvOutPath + cipherFile)
if err != nil {
return "", err
}
defer fr.Close()
fileInfo, err := fr.Stat()
if err != nil {
return "", err
}
blockNum := fileInfo.Size() / bufferSize
var num int64
fw, err := os.Create(plainFileName)
if err != nil {
return "", err
}
defer fw.Close()
buf := make([]byte, bufferSize)
for {
num += 1
n, err := fr.Read(buf)
if err == io.EOF{
break
}
if err != nil && err != io.EOF {
return "", err
}plainText := make([]byte, n)
blockMode.CryptBlocks(plainText, buf[:n])
//判断时最后一段数据则进行数据去填充
if num == blockNum + 1{
plainText = unpaddingLastGroup(plainText)
n = len(plainText)
}
_, err = fw.Write(plainText[:n])
if err != nil {
return "", err
}
}
return plainFileName, nil
}
推荐阅读
- 8、Flask构建弹幕微电影网站-搭建后台页面-密码修改、主页控制面板
- “终南秘境”——《终南山密码》
- crontab无法查看,原来是密码过期了
- 实现财富自由、让钱来找你的密码……
- “不可能任务”背后,有关键人物串起的惊天大阴谋。|“不可能任务”背后,有关键人物串起的惊天大阴谋。|《清明上河图密码3》
- 带着觉知生活,人生才开始变得有深度|带着觉知生活,人生才开始变得有深度 快乐密码空间
- linux服务器间建立免密码登录
- 寒假社会实践|寒假社会实践|探寻双墩密码,传承创新文化
- 生命密码426
- 斯坦福大学密码学公开课——分组加密的应用(一次性密钥)