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 了。有的人在
进入perl所在目录,安装dmakeppm install dmak
必须加分号,有的不需要,这里都试一下。我这里是进入Perl64的目录,然后执行就安装成功了。
再执行一遍配置命令 执行结果再执行一遍配置命令
安装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的操作了。
这是传统的做法,而且也太繁琐了。我想尝试的是使用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 做一遍测试。
网友评论