pu369com

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

https://www.jianshu.com/p/d3a03fcb7f56

https://www.jianshu.com/p/58dcbf490ef3

posted on 2020-05-20 15:43  pu369com  阅读(1270)  评论(0编辑  收藏  举报

导航