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

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 做一遍测试。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,809评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,189评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,290评论 0 359
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,399评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,425评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,116评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,710评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,629评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,155评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,261评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,399评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,068评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,758评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,252评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,381评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,747评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,402评论 2 358

推荐阅读更多精彩内容