设置系统环境变量
我的电脑
鼠标右键,属性
点击环境变量
确定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()
运行效果
每次的密文都不同
每次的密文都不同
修改一下原文
效果依旧
作者:厚土火烟
链接:https://www.jianshu.com/p/a60be6726499
共同学习,写下你的评论
评论加载中...
作者其他优质文章