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
}