美文网首页GolangGolang语言社区Go
72.加密解密(MD5 SHA1 BASE64 RSA)(二)

72.加密解密(MD5 SHA1 BASE64 RSA)(二)

作者: 厚土火焱 | 来源:发表于2018-10-03 11:04 被阅读152次
    rsa非对称加密解密

    rsa要稍微复杂一下,因为rsa需要使用openssl ,是目前最流行的 SSL 密码库工具。
    在opensource网站下载 openssl https://www.openssl.org/source/

    这里下载最新版
    下载后,将其解压缩至自己的目录下,建议在C盘不含中文名和空格的目录下,这样做便于后续操作。例如我C:\openssl
    1.下载ActivePerl 5.24.1
    下载网址:https://www.activestate.com/activeperl/downloads
    这里下载最新版
    系统默认会安装到C盘根目录。
    perl安装目录
    设置系统环境变量
    我的电脑
    鼠标右键,属性
    点击环境变量
    确定Path中有c:\Perl64\site\bin;c:\Perl64\bin;
    如何确认安装成功,运行cmd,输入perl -v,然后回车,出现下面显示内容,就是成功的
    Perl安装结果检查
    安装Microsoft Visual Studio 2017,注意必须安装vc。 配置openssl

    需要安装 dmake 了。有的人在

    ppm install dmak
    必须加分号,有的不需要,这里都试一下。我这里是进入Perl64的目录,然后执行就安装成功了。

    进入perl所在目录,安装dmake

    再执行一遍配置命令

    再执行一遍配置命令 执行结果

    安装NASM
    (有的没有安装该软件也能成功,个人建议安装)
    地址:http://www.nasm.us/

    当前稳定版本为:2.12.02
    http://www.nasm.us/pub/nasm/releasebuilds/2.12.02/win64/

    下载最新版
    安装中...
    安装路径,添加到path中。
    C:\Users\Administrator\AppData\Local\NASM

    c:\openssl>perl Configure VC-WIN64A

    或者直接下载安装包
    http://slproweb.com/products/Win32OpenSSL.html

    下载安装包 直接安装openssl openssl安装成功

    生成密钥
    然后就是openssl的操作了。
    这是传统的做法,而且也太繁琐了。我想尝试的是使用go语言完成秘钥生成和加密解密过程。

    go代码生成公钥、私钥###

    核心函数

    func JoelCreatRsaKey() {
        var bits int
        flag.IntVar(&bits, "b", 2048, "密钥长度,默认为2048位")
        if err := GenRsaKey(bits); err != nil {
            log.Fatal("密钥文件生成失败!")
        }
        log.Println("密钥文件生成成功!")
    }
    func GenRsaKey(bits int) error {
        // 生成私钥文件
        privateKey, err := rsa.GenerateKey(rand.Reader, bits)
        if err != nil {
            return err
        }
        derStream := x509.MarshalPKCS1PrivateKey(privateKey)
        block := &pem.Block{
            Type:  "私钥",
            Bytes: derStream,
        }
        file, err := os.Create("private.pem")       //用来解密的
        if err != nil {
            return err
        }
        err = pem.Encode(file, block)
        if err != nil {
            return err
        }
        // 生成公钥文件
        publicKey := &privateKey.PublicKey
        derPkix, err := x509.MarshalPKIXPublicKey(publicKey)
        if err != nil {
            return err
        }
        block = &pem.Block{
            Type:  "公钥",
            Bytes: derPkix,
        }
        file, err = os.Create("public.pem")     //用来加密的
        if err != nil {
            return err
        }
        err = pem.Encode(file, block)
        if err != nil {
            return err
        }
        return nil
    }
    

    只要运行 JoelCreatRsaKey() ,就可以生成公钥和私钥。


    秘钥文件

    然后需要利用这对秘钥,对指定的内容进行加密和解密。
    首先建立一个package JoelCryptography
    然后声明一对秘钥 JoelRsaPrivateKey 、 JoelRsaPublicKey
    为了更准确,我同时在网上找了另一对秘钥做加密解密操作的验证。

    //私钥
    var JoelRsaPrivateKey = []byte(`
    -----BEGIN 私钥-----
    MIIEpAIBAAKCAQEApVbEa7ORBzH8WU6WXQh8dRTimpf+tjBRTA13ESNr6pMLCQpb
    s7RkNvV8/3XKxAYQJDuXpEQFkGHOOKntRZ/qfmyYfeuz08773l4GFvNGKxFZqvnB
    n4b+VNUDoD+bbcE2IDZpN0aA7rPQYoN3Du5VPbSOSs7l761oa+MRkTxZVJiHs6Fb
    wxFBpOlM9mVQRectXwz520tUWHaRpLA08MBKQ/Py1nRy8kSBiERRIBPdviBahFkH
    tIclQDsCI0ItDtaT/TOtsR4PQhOTkXdkZkjY3PXNvlIcCvfu1XqUCCBL7G/6Ob+S
    KlID7cg3RYn7+WLhveEG0c/3F0leMvUES2giVwIDAQABAoIBACkqQjtCeQBenKKr
    o1pEa6BG8+hjoYJA42zZCWUV+Z9svtmgX5aNekoIsvdzn2lQzSIISEgYu33oLA0F
    mdK07xBM/2aSkbJRnXoO1NtP9I9ygW3FQ0Txuk7qvj1euNcJvO0mPuoJPr6vvFla
    vADWrBhx5N+RRcR320DJRy1u5hrefKlYZgBNHOrmJ9VxgrFcJCtoaxW+4AOpUFuP
    EY1J4yMYTVQbuySAuzhGwDs9b54WMTZl3ekl0cbmSld3LEZyACWyEIGKhW1UXLcy
    FzasuGqyfZOHok6O+bd5Ph2L6vZ9PyzORn3wGlY7Xie2/qfgjh9LJS8pDNl6Cje4
    VeSjDXkCgYEAyPe7sGcICIklt1y8fjF2pi5DjFzur+nzQufmguGq93yOeyzLl5qu
    i2kuhElvxe5ow5m6juMaN+Ayo8mrAUlJh2pvq5S+sEHaal8Y32DiVjAUpbEjAGFU
    jzKQRndck+mrsSvkVlU0Pn4/li0HBhAxYt1qnDD7YoQ+zIMXifK9ITMCgYEA0p1h
    e5c6vBDP03wMcdQx74vWZRjqmgFz0nMu75oVFNKbcnqXWAEn/BlP35pSRrq+ZNfW
    fjsIkJwK7A7q8IEINySLxm96Q0fM77f3JywXR10eBq4qy81DijWwHkwfukuHnuOB
    GEcKqFO4sd281QND8jHKfLqOkz+Lmf2Ejs4yQk0CgYBGc8qhkc0YKPRG7sTJvI9q
    vKdDisTGeM6l8uQ1l+U2s7zDY7XP5RMxnmMHTzNXAThK8habxvPHCNrX3ngLkGSt
    i1uwnAmpgryOM95lWPKf4mUqnQm3NWfOd5xqh6e11uIwz0FSHrac/edOv2RJ9N1L
    WnHoZaeLJu9ZBM/4tVcmTwKBgQCkAb4Zmeg47vaHfz/JnC3Olhw72a1Gg/8HUH6q
    QlhMQLyf5urXsv7KB4P1YZzUSzNcH999qMbApWKz8+Hrqu8U0baurbyNi+oAekdS
    D7mI7vAkz5ev4IXJqIke7rR+Q7a2ef7bQub/sUJP75XOYp6UiUVe33+LFp7FKXAC
    LHtiuQKBgQCH0LJtAxb4rQbMfl/ZlS6/KuzdoU4bHKmI+lvzRvsLbdPAaiHYdKj3
    NmtqySovSZCgqGEbpaatR0UV6eWbD9+jSKQ2+kSwlhBtGnvfpBMTciOv6M5Ndg1j
    t0ef5nSxU9N36vPCEEHoboCfbDKCvAwijiCmXR/5XmeaFRGlvwFdZg==
    -----END 私钥-----
    `)
    var JoelRsaPrivateKey2 = []byte(`
    -----BEGIN RSA PRIVATE KEY-----
    MIICXQIBAAKBgQDZsfv1qscqYdy4vY+P4e3cAtmvppXQcRvrF1cB4drkv0haU24Y
    7m5qYtT52Kr539RdbKKdLAM6s20lWy7+5C0DgacdwYWd/7PeCELyEipZJL07Vro7
    Ate8Bfjya+wltGK9+XNUIHiumUKULW4KDx21+1NLAUeJ6PeW+DAkmJWF6QIDAQAB
    AoGBAJlNxenTQj6OfCl9FMR2jlMJjtMrtQT9InQEE7m3m7bLHeC+MCJOhmNVBjaM
    ZpthDORdxIZ6oCuOf6Z2+Dl35lntGFh5J7S34UP2BWzF1IyyQfySCNexGNHKT1G1
    XKQtHmtc2gWWthEg+S6ciIyw2IGrrP2Rke81vYHExPrexf0hAkEA9Izb0MiYsMCB
    /jemLJB0Lb3Y/B8xjGjQFFBQT7bmwBVjvZWZVpnMnXi9sWGdgUpxsCuAIROXjZ40
    IRZ2C9EouwJBAOPjPvV8Sgw4vaseOqlJvSq/C/pIFx6RVznDGlc8bRg7SgTPpjHG
    4G+M3mVgpCX1a/EU1mB+fhiJ2LAZ/pTtY6sCQGaW9NwIWu3DRIVGCSMm0mYh/3X9
    DAcwLSJoctiODQ1Fq9rreDE5QfpJnaJdJfsIJNtX1F+L3YceeBXtW0Ynz2MCQBI8
    9KP274Is5FkWkUFNKnuKUK4WKOuEXEO+LpR+vIhs7k6WQ8nGDd4/mujoJBr5mkrw
    DPwqA3N5TMNDQVGv8gMCQQCaKGJgWYgvo3/milFfImbp+m7/Y3vCptarldXrYQWO
    AQjxwc71ZGBFDITYvdgJM1MTqc8xQek1FXn1vfpy2c6O
    -----END RSA PRIVATE KEY-----
    `)
    
    
    //公钥
    var JoelRsaPublicKey = []byte(`
    -----BEGIN 公钥-----
    MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApVbEa7ORBzH8WU6WXQh8
    dRTimpf+tjBRTA13ESNr6pMLCQpbs7RkNvV8/3XKxAYQJDuXpEQFkGHOOKntRZ/q
    fmyYfeuz08773l4GFvNGKxFZqvnBn4b+VNUDoD+bbcE2IDZpN0aA7rPQYoN3Du5V
    PbSOSs7l761oa+MRkTxZVJiHs6FbwxFBpOlM9mVQRectXwz520tUWHaRpLA08MBK
    Q/Py1nRy8kSBiERRIBPdviBahFkHtIclQDsCI0ItDtaT/TOtsR4PQhOTkXdkZkjY
    3PXNvlIcCvfu1XqUCCBL7G/6Ob+SKlID7cg3RYn7+WLhveEG0c/3F0leMvUES2gi
    VwIDAQAB
    -----END 公钥-----
    `)
    var JoelRsaPublicKey2 = []byte(`
    -----BEGIN PUBLIC KEY-----
    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDZsfv1qscqYdy4vY+P4e3cAtmv
    ppXQcRvrF1cB4drkv0haU24Y7m5qYtT52Kr539RdbKKdLAM6s20lWy7+5C0Dgacd
    wYWd/7PeCELyEipZJL07Vro7Ate8Bfjya+wltGK9+XNUIHiumUKULW4KDx21+1NL
    AUeJ6PeW+DAkmJWF6QIDAQAB
    -----END PUBLIC KEY-----
    `)
    

    加密和解密函数

    //加密
    func JoelRsaEncrypt(origData []byte) ([]byte, error) {
        block, _ := pem.Decode(JoelRsaPublicKey)    //将秘钥解释成公钥实例
        if block == nil{
            return nil, errors.New("public key error")
        }
        pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)   //解析pem.Decode() 返回的block指针实例
        if err != nil {
            return nil, err
        }
        pub := pubInterface.(*rsa.PublicKey)
        return rsa.EncryptPKCS1v15(rand.Reader, pub, origData)
    }
    //解密
    func JoelRsaDecrypt(ciphertext []byte) ([]byte, error) {
        block, _ := pem.Decode(JoelRsaPrivateKey)   //将秘钥解析成私钥实例
        if block == nil {
            return nil, errors.New("private key error")
        }
        priv, err := x509.ParsePKCS1PrivateKey(block.Bytes) //解析成pem.Decode()返回指针实例
        if err != nil {
            return nil, err
        }
        return rsa.DecryptPKCS1v15(rand.Reader, priv, ciphertext)   //RSA算法解密
    }
    

    需要一个页面文件,来显示密文和原文

    {{define "HelloRsa"}}
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Go Rsa</title>
    </head>
    <body>
    
    {{.加密}}
    <hr>
    {{.解密}}
    <hr>
    
    
    </body>
    </html>
    {{end}}
    

    编写一个handler函数,要加密的原文直接写在代码里了


    要加密的原文
    func Joeltemplate14(writer http.ResponseWriter, request *http.Request) {
    
        data, err := JoelCryptography.JoelRsaEncrypt([]byte("junbojian@qq.com"))    //加密
        if err != nil {
            panic(err)
        }
        fmt.Println("RSA加密",string(data))
    
        oriData, err := JoelCryptography.JoelRsaDecrypt(data)   //解密
        if err != nil {
            panic(err)
        }
        fmt.Println("RSA解密",string(oriData))
    
        result := map[string]string{}
        result["加密"] = string(data)
        result["解密"] = string(oriData)
        t, _ := template.ParseFiles("./JoelTemplate/sayHelloRsa.html")
        t.ExecuteTemplate(writer, "HelloRsa", result)
    
    }
    

    在main中添加调用

    http.HandleFunc("/rsa/", JoelTempFunc.Joeltemplate14)
    server := http.Server{Addr:":8090"}
    server.ListenAndServe()
    
    运行效果

    每次的密文都不同


    每次的密文都不同
    修改一下原文
    效果依旧

    你也可以使用 JoelRsaPublicKey2 、 JoelRsaPrivateKey2 做一遍测试。

    相关文章

      网友评论

        本文标题:72.加密解密(MD5 SHA1 BASE64 RSA)(二)

        本文链接:https://www.haomeiwen.com/subject/fpwdoftx.html