zoukankan      html  css  js  c++  java
  • golang实现AES加密和解密-自已动手写个加解密软件

    目的: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

  • 相关阅读:
    js作用域
    正则表达式方法
    for-in
    关于this
    由indexOf引发的一系列探究和思考
    Html第一个程序
    转:1.ASP.Net MVC开发基础学习笔记;2.HtmlHelper与扩展方法
    转:单例模式
    转:ORM框架EF(Entity framework)实体框架
    C#lambda表达式
  • 原文地址:https://www.cnblogs.com/pu369/p/12924007.html
Copyright © 2011-2022 走看看