博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
有没高手帮忙看看这样加密文件靠不靠谱
阅读量:6120 次
发布时间:2019-06-21

本文共 8802 字,大约阅读时间需要 29 分钟。

  hot3.png

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}

 

转载于:https://my.oschina.net/bysu/blog/3012570

你可能感兴趣的文章
从0开始学Flutter
查看>>
mysql操作入门基础之对数据库和表的增删改查
查看>>
IIS负载均衡
查看>>
分布式事务,EventBus 解决方案:CAP【中文文档】
查看>>
Linux下的CPU性能瓶颈分析案例
查看>>
spring mvc入门
查看>>
2012在数据库技术会议上的讲话PPT打包
查看>>
【Android】 TextView设置个别字体样式
查看>>
python svn
查看>>
raise语句
查看>>
sequence2(高精度dp)
查看>>
ABP实战--集成Ladp/AD认证
查看>>
存储过程
查看>>
phpcms v9栏目列表调用每一篇文章内容方法
查看>>
python 自定义信号处理器
查看>>
luov之SMTP报错详解
查看>>
软件概要设计做什么,怎么做
查看>>
dwr
查看>>
java的特殊符号
查看>>
word2010中去掉红色波浪线的方法
查看>>