https://blog.csdn.net/liangguangchuan/article/details/77482186
https://studygolang.com/articles/11101
https://blog.csdn.net/skh2015java/article/details/78806486
运行程序:
加密:1.输入加密的串(密码);2.需要加密的文件的路径;3.直接回车
解密:1.输入上面加密的输入的加密串(密码);2.需要解密的文件的路径(支持单文件加密和输入目录,加密其下层子文件);3.随意输入任意字符然后回车
下面为总代码
cryption_operate.go
package mainimport ( "io/ioutil" "encoding/base64" "fmt" "crypto/sha256" "os" "crypto/des" "crypto/cipher")//对加解密进行操作func initAndOperate(argsList map[int]string){ //第一个参数用于生成密钥 arg1:=sha256.Sum224([]byte(argsList[0])) key:=arg1[:24] //第二个参数是目标文件 dirlist,_ := GetDirList(argsList[1]) fileNames := GetFileList(dirlist) for _,fileName := range fileNames{ file,err:=os.Open(fileName) if err != nil{ fmt.Println("未找到待处理文件") os.Exit(0) } defer file.Close() //读取文件内容 plain,_ := ioutil.ReadAll(file) //创建block block,_ := des.NewTripleDESCipher(key) //第三个参数表明是解密 if argsList[2] != "" { defer func() { //捕捉异常 if err := recover(); err != nil{ fmt.Println("请确认该文件为加密文件!") panic(err) } }() decryption(plain,block,key,fileName) //解密 }else { defer func(){ //捕捉异常 if err := recover();err != nil{ fmt.Println("出现未知异常!") panic(err) } }() encryption(plain,block,key,fileName) //加密 } }}//解密文件func decryption(plain []byte,block cipher.Block,key []byte,fileName string){ DecryptMode := cipher.NewCBCDecrypter(block, key[:8]) plain, _ = base64.StdEncoding.DecodeString(string(plain)) DecryptMode.CryptBlocks(plain, plain) plain = PKCS5remove(plain) err := ioutil.WriteFile(fileName, plain, 0777) if err != nil { fmt.Println("保存解密后文件失败!") } else { fmt.Println("文件已解密!") }}//加密文件func encryption(plain []byte,block cipher.Block,key []byte,fileName string){ EncryptMode := cipher.NewCBCEncrypter(block,key[:8]) //明文补足PKCS5Padding plain = PKCS5append(plain) EncryptMode.CryptBlocks(plain,plain) err := ioutil.WriteFile(fileName,[]byte(base64.StdEncoding.EncodeToString(plain)),0777) if err != nil{ fmt.Println("保存加密后文件失败!") }else{ fmt.Println("文件已加密,务必记住加密key!") }}func PKCS5append(plaintext []byte) []byte { num := 8 - len(plaintext)%8 for i:=0;i
get_file_list.go
package mainimport ( "os" "io/ioutil" "path/filepath")// 判断所给路径文件/文件夹是否存在func IsFileExists(path string) bool { _, err := os.Stat(path) //os.Stat获取文件信息 if err != nil { if os.IsExist(err) { return true } return false } return true}//目录下所有文件(非文件夹)func GetFileList(filePaths []string) []string{ var fileResult []string //目录下所有文件(非文件夹) for _,filePath := range filePaths{ if !IsDir(filePath) { fileResult = append(fileResult,filePath) return fileResult } files,_ := ioutil.ReadDir(filePath) for _, file := range files { if file.IsDir() { continue }else { fileResult = append(fileResult, filePath + "\\" + file.Name()) } } } return fileResult}//判断是否是目录,true为目录,false为文件func IsDir(path string) bool { s, err := os.Stat(path) if err != nil { return false } return s.IsDir()}func GetDirList(dirpath string) ([]string, error) { var dir_list []string if !IsFileExists(dirpath) { //如果文件不存在,则直接返回 return dir_list,nil } if !IsDir(dirpath) { dir_list = append(dir_list,dirpath) return dir_list,nil } dir_err := filepath.Walk(dirpath, func(path string, f os.FileInfo, err error) error { if f == nil { return err } if f.IsDir() { dir_list = append(dir_list, path) return nil } return nil }) return dir_list, dir_err}
Input_info.go
package mainimport ( "fmt" "bufio" "os")//读入从控制台输入的信息func readInputString() string{ fmt.Println("please input string:") acceptStr := bufio.NewScanner(os.Stdin) boolean := acceptStr.Scan() inputStr := acceptStr.Text() if boolean { if len(inputStr)!= 0{ return inputStr } } return inputStr}//把控制台输入的信息存入map[int]string中func PramList() map[int]string { result := make(map[int]string) for i:=0;i < 3 ; i++ { result[i] = readInputString() } return result}
main
package mainimport( "fmt")func main() { fmt.Println("使用说明:\n第一行为密码:\t任何可显示字符;\nfile:\t第二行为要处理的文件\nmode:\t第三行为加解密的标志,直接回车为加密,输入任意值为解密(值任意)") argsList := PramList() initAndOperate(argsList)}
----------------------旧代码-----------------------------------------------
获取文件列表
package mainimport ( "fmt" "os" "path/filepath" "io/ioutil")func main() { list, err := getDirList("C:\\Users\\swx558409\\IdeaProjects\\workspace\\go\\gobase") if err != nil { fmt.Println(err) return } fmt.Println(getFileList(list))}// 判断所给路径文件/文件夹是否存在func isFileExists(path string) bool { _, err := os.Stat(path) //os.Stat获取文件信息 if err != nil { if os.IsExist(err) { return true } return false } return true}//目录下所有文件(非文件夹)func getFileList(filePaths []string) []string{ var fileResult []string //目录下所有文件(非文件夹) for _,filePath := range filePaths{ if !IsDir(filePath) { fileResult = append(fileResult,filePath) return fileResult } files,_ := ioutil.ReadDir(filePath) for _, file := range files { if file.IsDir() { continue }else { fileResult = append(fileResult, filePath + "\\" + file.Name()) } } } return fileResult}//判断是否是目录,true为目录,false为文件func IsDir(path string) bool { s, err := os.Stat(path) if err != nil { return false } return s.IsDir()}func getDirList(dirpath string) ([]string, error) { var dir_list []string if !isFileExists(dirpath) { //如果文件不存在,则直接返回 return dir_list,nil } if !IsDir(dirpath) { dir_list = append(dir_list,dirpath) return dir_list,nil } dir_err := filepath.Walk(dirpath, func(path string, f os.FileInfo, err error) error { if f == nil { return err } if f.IsDir() { dir_list = append(dir_list, path) return nil } return nil }) return dir_list, dir_err}
package mainimport ( "fmt" "io/ioutil" "os" "crypto/cipher" "crypto/des" "crypto/sha256" "encoding/base64" "bufio" "path/filepath")func main() { fmt.Println("使用说明:\n第一行为密码:\t任何可显示字符;\nfile:\t第二行为要处理的文件\nmode:\t第三行为加解密的标志,直接回车为加密,输入任意值为解密(值任意)") argsList := paramList() initAndOperate(argsList)}// 判断所给路径文件/文件夹是否存在func isFileExists(path string) bool { _, err := os.Stat(path) //os.Stat获取文件信息 if err != nil { if os.IsExist(err) { return true } return false } return true}//目录下所有文件(非文件夹)func getFileList(filePaths []string) []string{ var fileResult []string //目录下所有文件(非文件夹) for _,filePath := range filePaths{ if !IsDir(filePath) { fileResult = append(fileResult,filePath) return fileResult } files,_ := ioutil.ReadDir(filePath) for _, file := range files { if file.IsDir() { continue }else { fileResult = append(fileResult, filePath + "\\" + file.Name()) } } } return fileResult}//判断是否是目录,true为目录,false为文件func IsDir(path string) bool { s, err := os.Stat(path) if err != nil { return false } return s.IsDir()}func getDirList(dirpath string) ([]string, error) { var dir_list []string if !isFileExists(dirpath) { //如果文件不存在,则直接返回 return dir_list,nil } if !IsDir(dirpath) { dir_list = append(dir_list,dirpath) return dir_list,nil } dir_err := filepath.Walk(dirpath, func(path string, f os.FileInfo, err error) error { if f == nil { return err } if f.IsDir() { dir_list = append(dir_list, path) return nil } return nil }) return dir_list, dir_err}//对加解密进行操作func initAndOperate(argsList map[int]string){ //第一个参数用于生成密钥 arg1:=sha256.Sum224([]byte(argsList[0])) key:=arg1[:24] //第二个参数是目标文件 dirlist,_ := getDirList(argsList[1]) fileNames := getFileList(dirlist) for _,fileName := range fileNames{ file,err:=os.Open(fileName) if err != nil{ fmt.Println("未找到待处理文件") os.Exit(0) } defer file.Close() //读取文件内容 plain,_ := ioutil.ReadAll(file) //创建block block,_ := des.NewTripleDESCipher(key) //第三个参数表明是解密 if argsList[2] != "" { defer func() { //捕捉异常 if err := recover(); err != nil{ fmt.Println("请确认该文件为加密文件!") panic(err) } }() decryption(plain,block,key,fileName) //解密 }else { defer func(){ //捕捉异常 if err := recover();err != nil{ fmt.Println("出现未知异常!") panic(err) } }() encryption(plain,block,key,fileName) //加密 } }}//解密文件func decryption(plain []byte,block cipher.Block,key []byte,fileName string){ DecryptMode := cipher.NewCBCDecrypter(block, key[:8]) plain, _ = base64.StdEncoding.DecodeString(string(plain)) DecryptMode.CryptBlocks(plain, plain) plain = PKCS5remove(plain) err := ioutil.WriteFile(fileName, plain, 0777) if err != nil { fmt.Println("保存解密后文件失败!") } else { fmt.Println("文件已解密!") }}//加密文件func encryption(plain []byte,block cipher.Block,key []byte,fileName string){ EncryptMode := cipher.NewCBCEncrypter(block,key[:8]) //明文补足PKCS5Padding plain = PKCS5append(plain) EncryptMode.CryptBlocks(plain,plain) err := ioutil.WriteFile(fileName,[]byte(base64.StdEncoding.EncodeToString(plain)),0777) if err != nil{ fmt.Println("保存加密后文件失败!") }else{ fmt.Println("文件已加密,务必记住加密key!") }}func PKCS5append(plaintext []byte) []byte { num := 8 - len(plaintext)%8 for i:=0;i< 3 ; i++ { result[i] = readInputString() } return result}