密码技术应用--SM4文件加解密
生活随笔
收集整理的這篇文章主要介紹了
密码技术应用--SM4文件加解密
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
記錄一下對(duì)一些稍大文件進(jìn)行SM4加解密的實(shí)現(xiàn),這里只列出了核心代碼,其他不涉及的代碼或者有任何疑問(wèn)可以查看我之前寫的密碼技術(shù)專題博客
var key = []byte("1234567812345678") var iv = []byte("1111111122222222")/* 函數(shù)名: paddingLastGroup對(duì) CBC 加密模式的加密算法提供最后一個(gè)分塊的明文數(shù)據(jù)填充 參 數(shù):plainText , 明文數(shù)據(jù)blockSize , CBC 分塊大小 返回值:填充后的明文數(shù)據(jù) 創(chuàng)建時(shí)間及創(chuàng)建者:2021-06-15 Yuan_sr */ func paddingLastGroup(plainText []byte, blockSize int) []byte{padNum := blockSize - len(plainText) % blockSizechar := []byte{byte(padNum)}newPlain := bytes.Repeat(char, padNum)newText := append(plainText, newPlain...)return newText }/* 函數(shù)名: unpaddingLastGroup對(duì) CBC 加密模式的加密算法提供最后一個(gè)分塊的明文數(shù)據(jù)去填充 參 數(shù):plainText , 明文數(shù)據(jù) 返回值:去填充后的明文數(shù)據(jù) 創(chuàng)建時(shí)間及創(chuàng)建者:2021-06-15 Yuan_sr */ func unpaddingLastGroup(plainText []byte) []byte{length := len(plainText)lastChar := plainText[length - 1]number := int(lastChar)return plainText[:length - number] }/* 函數(shù)名: sm4Enctrptsm4 加密算法實(shí)現(xiàn)對(duì)文件的加密 參 數(shù):filePathIn , 待加密文件key , 加密密鑰 返回值:加密后密文文件名錯(cuò)誤信息 創(chuàng)建時(shí)間及創(chuàng)建者:2021-06-17 Yuan_sr */ func sm4Enctrpt(filePathIn string, key []byte) (string, error){inFile, err := os.Open(filePathIn)if err != nil {return "", err}defer inFile.Close()outFile, err := os.Create(encryptFileName)if err != nil {return "", err}defer outFile.Close()buf := make([]byte, bufferSize)//初始化一個(gè)底層加密算法block, err := sm4.NewCipher(key)if err != nil {return "", err}//選擇加密模式blockMode := cipher.NewCBCEncrypter(block, iv)for {n, err := inFile.Read(buf)if err == io.EOF{break}if err != nil && err != io.EOF {return "", err}//判斷時(shí)最后一段數(shù)據(jù)則進(jìn)行數(shù)據(jù)填充if n != bufferSize{groupData := paddingLastGroup(buf[:n], block.BlockSize())n = len(groupData)buf = make([]byte, n)buf = groupData}cipherText := make([]byte, n)blockMode.CryptBlocks(cipherText, buf[:n])_, err = outFile.Write(cipherText)if err != nil {return "", err}}//outFile.Write(iv)return encryptFileName, nil }/* 函數(shù)名: sm4Decryptsm4 解密算法實(shí)現(xiàn)對(duì)文件的解密 參 數(shù):cipherFile , 密文文件key , 解密密鑰 返回值:解密后文件名錯(cuò)誤信息 創(chuàng)建時(shí)間及創(chuàng)建者:2021-06-17 Yuan_sr */ func sm4Decrypt(cipherFile string, key []byte) (string, error){//字符串處理imgTagName := getImgTagName(dvImgName)plainFileName := imgTagName + ".tar"if dvOutPath != "./" {err := os.MkdirAll(dvOutPath, 0755)if err != nil {return "", err}plainFileName = dvOutPath + imgTagName + ".tar"}//1.創(chuàng)建一個(gè)aes底層密碼接口block, err := sm4.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() / bufferSizevar num int64fw, err := os.Create(plainFileName)if err != nil {return "", err}defer fw.Close()buf := make([]byte, bufferSize)for {num += 1n, 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])//判斷時(shí)最后一段數(shù)據(jù)則進(jìn)行數(shù)據(jù)去填充if num == blockNum + 1{plainText = unpaddingLastGroup(plainText)n = len(plainText)}_, err = fw.Write(plainText[:n])if err != nil {return "", err}}return plainFileName, nil }總結(jié)
以上是生活随笔為你收集整理的密码技术应用--SM4文件加解密的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 密码技术应用--AES文件加解密
- 下一篇: 密码技术应用--RSA文件签名验签