为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
Go


设置系统环境变量

webp

我的电脑


鼠标右键,属性

webp

点击环境变量


webp

确定Path中有c:\Perl64\site\bin;c:\Perl64\bin;


如何确认安装成功,运行cmd,输入perl -v,然后回车,出现下面显示内容,就是成功的

webp

Perl安装结果检查


安装Microsoft Visual Studio 2017,注意必须安装vc。


webp

配置openssl


需要安装 dmake 了。有的人在

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

webp

进入perl所在目录,安装dmake

再执行一遍配置命令

webp

再执行一遍配置命令

webp

执行结果

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

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

webp

下载最新版


webp

安装中...


安装路径,添加到path中。
C:\Users\Administrator\AppData\Local\NASM


c:\openssl>perl Configure VC-WIN64A

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

webp

下载安装包


webp

直接安装openssl

webp

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() ,就可以生成公钥和私钥。


webp

秘钥文件


然后需要利用这对秘钥,对指定的内容进行加密和解密。
首先建立一个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函数,要加密的原文直接写在代码里了


webp

要加密的原文

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()

webp

运行效果


每次的密文都不同


webp

每次的密文都不同


webp

修改一下原文


webp

效果依旧



作者:厚土火烟
链接:https://www.jianshu.com/p/a60be6726499


点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消