继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

慕的地10843
关注TA
已关注
手记 1081
粉丝 202
获赞 967


设置系统环境变量

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


打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP