有没高手帮忙看看这样加密文件靠不靠谱

 参(抄)考(袭)自:

https://www.oschina.net/code/snippet_95905_47989

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 main

import (
	"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<num;i++{
		plaintext = append(plaintext,byte(num))
	}
	return plaintext
}

func PKCS5remove(plaintext []byte) []byte {
	length := len(plaintext)
	num := int(plaintext[length-1])
	return plaintext[:(length - num)]
}

 get_file_list.go

package main

import (
	"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 main

import (
	"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 main

import
(
	"fmt"
)

func main() {

	fmt.Println("使用说明:\n第一行为密码:\t任何可显示字符;\nfile:\t第二行为要处理的文件\nmode:\t第三行为加解密的标志,直接回车为加密,输入任意值为解密(值任意)")
	argsList := PramList()
	initAndOperate(argsList)
}

----------------------旧代码----------------------------------------------- 

获取文件列表

package main

import (
	"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 main

import (
	"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<num;i++{
		plaintext = append(plaintext,byte(num))
	}
	return plaintext
}

func PKCS5remove(plaintext []byte) []byte {
	length := len(plaintext)
	num := int(plaintext[length-1])
	return plaintext[:(length - num)]
}

//读入从控制台输入的信息
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 paramList() map[int]string {
	result := make(map[int]string)
	for i:=0;i < 3 ; i++ {
		result[i] = readInputString()
	}
	return result
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值