golang实现AES加密和解密-自已动手写个加解密软件
补充:下面代码思路有问题,我后来重新写了个python版本的: https://www.cnblogs.com/pu369/p/15420768.html
目的:win10环境,当前目录下创建一个 解密的密码.txt ,写入一些内容 。用一个密码加解密,相应生成“加密的密码.txt”,
代码:
package main import ( "bytes" "crypto/aes" "crypto/cipher" "crypto/md5" "encoding/hex" "fmt" "io/ioutil" "os" ) func padding(src []byte, blocksize int) []byte { padnum := blocksize - len(src)%blocksize pad := bytes.Repeat([]byte{byte(padnum)}, padnum) return append(src, pad...) } func unpadding(src []byte) []byte { n := len(src) unpadnum := int(src[n-1]) return src[:n-unpadnum] } func encryptAES(src []byte, key []byte) []byte { block, _ := aes.NewCipher(key) src = padding(src, block.BlockSize()) blockmode := cipher.NewCBCEncrypter(block, key) blockmode.CryptBlocks(src, src) return src } func decryptAES(src []byte, key []byte) []byte { block, _ := aes.NewCipher(key) blockmode := cipher.NewCBCDecrypter(block, key) blockmode.CryptBlocks(src, src) src = unpadding(src) return src } func FileExist(path string) bool { _, err := os.Lstat(path) return !os.IsNotExist(err) } func main() { var inputStr string plainfile := "解密的密码.txt" cipherfile := "加密的密码.txt" loginpwd := "cnblogs" //登录口令,若希望密码不回显,可参考https://github.com/slonzok/getpass pwd := "3.14159265358979" //加密用的密码 fmt.Println("请输入口令!") fmt.Scanln(&inputStr) if inputStr != loginpwd { fmt.Println("登录口令错误!") fmt.Scanln(&inputStr) return } if FileExist(plainfile) && FileExist(cipherfile) { //明文和密文文件都存在 fmt.Println("请删除明文文件或密文文件之一!") fmt.Scanln(&inputStr) return } else if FileExist(plainfile) { //明文文件存在 bytes, err := ioutil.ReadFile(plainfile) if err != nil { fmt.Println("error : %s", err) fmt.Scanln(&inputStr) return } else { h := md5.New() h.Write([]byte(pwd)) pwdmd5 := hex.EncodeToString(h.Sum(nil)) //生成32位md5值 key := []byte(pwdmd5[8:24]) //取16位 x := bytes x1 := encryptAES(x, key) err2 := ioutil.WriteFile(cipherfile, x1, 0666) //写入文件 os.Remove(plainfile) //删除明文。这里应确认删除成功、以及防操作系统恢复或备份... if err2 != nil { fmt.Println("error : %s", err2) fmt.Scanln(&inputStr) return } else { fmt.Println("已加密: ", cipherfile) fmt.Scanln(&inputStr) return } } } else if FileExist(cipherfile) { //密文文件存在 bytes, err := ioutil.ReadFile(cipherfile) if err != nil { fmt.Println("error : %s", err) fmt.Scanln(&inputStr) return } else { h := md5.New() h.Write([]byte(pwd)) pwdmd5 := hex.EncodeToString(h.Sum(nil)) //生成32位md5值 key := []byte(pwdmd5[8:24]) //取16位 x := bytes x2 := decryptAES(x, key) err2 := ioutil.WriteFile(plainfile, x2, 0666) //写入文件 os.Remove(cipherfile) //删除密文 if err2 != nil { fmt.Println("error : %s", err2) fmt.Scanln(&inputStr) return } else { fmt.Println("已解密:", plainfile) fmt.Scanln(&inputStr) return } } } else { //明文和密文文件都不存在 fmt.Println("请创建:", plainfile) fmt.Scanln(&inputStr) return } }
参考:https://blog.csdn.net/baidu_25845567/article/details/82625924
https://www.cnblogs.com/hlxs/p/9852594.html
https://www.jianshu.com/p/3741458695d2