Skip to content

Instantly share code, notes, and snippets.

@harryhare
Created January 11, 2019 07:34
Show Gist options
  • Save harryhare/6ff18e0c2dc0e6d6452c45e31b201568 to your computer and use it in GitHub Desktop.
Save harryhare/6ff18e0c2dc0e6d6452c45e31b201568 to your computer and use it in GitHub Desktop.
package main
import (
"encoding/pem"
"errors"
"crypto/x509"
"crypto/rsa"
"crypto/rand"
"fmt"
"encoding/base64"
"crypto"
"crypto/sha1"
)
var privateKey = []byte(`
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQCrGh1sc5AKD1EQ8WdA1iWF4m7wXtO6WoS7Dtfd0Jm2ud+LKBQ+
e7R6YIXnwfEKB/4Jm+jNtCi7/Zrx5gtEpUuVAyrEo5+qr5al5KibeJq3xyI/626I
BsDMFX5o3WOoXceTF7+lgi6r+OuokqFJgpeh7YANXQ8Y8mn8ucw+Ly+LbQIDAQAB
AoGAGgoxbC3yP/WwyrlSk4WD1Gpvo9lqs7PO+4D4zWNP4YVMRitlWVUOVImYF3tm
qbYprWCy/4tpn6KrECGImXvmkplXPxd4x3W+haZftx3VjTwh5fvT9yHp4swXxN+h
LMItDdIOWS4U6wVJa77Dy7VfK303LZrPLqnxkf4oEywp5YECQQDZOz1WD7nOqOiy
AlwDhfeLTmArN0f+gV6RLrxMp2XRqC2DN5nMq5O5BVVMK9LBgArNqYfxWYuMa3K2
qliRDPPxAkEAyaNWq/fDvjpK9TgztqsHIiG+cUQpWI759zt5qHNA+QF4L43dtAVZ
zBR/uam1jnRuM6K0ZCSZo2ITiqapmk8bPQJAEd9d3IbOssIS4xJun5uWElAQeX3C
3p2mOiuuMmBTcDx2AiXA8aXsMXzO18WDQYhXWzRniuPjJ1pvxbeeMdDvAQJBAMDh
uZAJEzrOAlQurfFICyvQQZ+Rx0dKhbzFLOxBS96mVDSRLYn+MFbzKPcOa3lY0O4d
7xd4l2td7zmLkePlVjUCQQCY8VuIfKc0+AWvPnktKXbx9bBdJZSDginZM5cu7pdx
W0uB9KZoLqgbGLIvWrLyA6SBqo87Q1j1//wFgLP+A2Gn
-----END RSA PRIVATE KEY-----
`)
var publicKey = []byte(`
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCrGh1sc5AKD1EQ8WdA1iWF4m7w
XtO6WoS7Dtfd0Jm2ud+LKBQ+e7R6YIXnwfEKB/4Jm+jNtCi7/Zrx5gtEpUuVAyrE
o5+qr5al5KibeJq3xyI/626IBsDMFX5o3WOoXceTF7+lgi6r+OuokqFJgpeh7YAN
XQ8Y8mn8ucw+Ly+LbQIDAQAB
-----END PUBLIC KEY-----
`)
// self_gen key not work, don't know why
var self_gen_private_key = []byte(`
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAo8wsWDzGSQ0SW7XqW1pFlb9Z+2RgIzmL+MhbqWUmRmGi4Gtq
zlDCWgeArJAZP/BGZCq7tkHHGHrBh3GSoGiROSD8SJ9qYB55kziULYp0sJ8Pn7ox
xGtT9uqO6SGZLXtZ5Z98DqTThgm9xo7rEs3VHRXeFYo+PuQoCgIh87SKkBUGRJXo
hJvOTdNrqkFxLwIJNiroMzv2vAMabHzShQSPPVDF/JgDS2D99AXOhbNGSc7+h3cW
eSDPs/89X7k1iOvxiEz/J5SRppg2jc3rELjZUB2KdPVJkPwCkjoQjUgBN2IeiMEK
o9bJ6n1iNTLIyHUzLdhVgbCTr4q7rp6Dz7VocQIDAQABAoIBAC+kVUmc87ePu8U9
FltX2GGD9LIwMd5NAK9t52tP5mAWSf+ofrpftwfkosKObymvw2mjHFIYs8Yk/mFc
4V8Syxqow3iEFba7ZnUxwbe1S9eLjEnTKGKPLS7mbobUpO8br7wgNT81JekYsEAu
laU0hUYedCgju5MjXZn7oNB3tM3POGw0ng1jHYubQ5zgRMvNsq4Rk8/GoyMQ/OkD
gK6LceC2BAG0tY546CGh+n0Mo/+9k7g/2ceyeulBZk76eBmr/pJ915VMigfsSMy3
9KHReAKg9wazrT6VZ3xHlhD9vd/dpElld7D6dt6OBrn+iV7jBTrlRwQUUaTTfg31
rcHnyXkCgYEA10KXqvoyHnhbQxfyflRtibkAUwB3JQeFsAxFm6rBso9dz4wC+xj6
jdstwwqetSV+vf4KD7nKjKijk8Bfyf0wGNEqqlUPs/F0a/bIraTTPVmyl60AG057
+mJIWVrI04Z5X8E/H3PTP2DoKL8mjmtuh7INxaI2net3QtxMHzZotxMCgYEAwsw0
vDzoKCD878LmMzxQ4rY9Yt8zw7Awz9oSm8pwaRK6ac5W/vfW+NUn7I0rKzQ/OvPL
0FzP3+G/iGs0QjTy4PtMa2Vi5cJgnnIoplatJwOXwUh42QfGrBAMHTPlZRuhG7oU
uCXpmMJn8ti9grsw5EsB1yrTrNpvWOSJTEvefusCgYAd0TWdE2cZ3WYW1xxZ72v0
5dFrrebTFEWqayjBNVf7WeyOsUBAc+dQ+wlNuQze3sC9pJDUONIbxchS0RTzr8SX
y3FzgrDYJhwQUHDfzLMODny0kdwv7CE0P6Tx66dh1YC+iNArlSmv38aIzmGS3MLE
vR83Pw79tP4iHs3UjP7YTQKBgCujx+Sr2G61BTVJenzb9Fr17MarrlMWs7i86BJS
xeAkO/LcMQ0pxNU2G52Y+qTRLaEtYOmrAT7suhX7vldeuVLBuZsNuZwzcaXNeWHa
ZSwqV+MLM1ebsFx3s98O80M1b2Bgzad7htucIeF7wOj6urdKPn1PsOA2h19ow4F+
NbhFAoGAIrLkvENup6w6DtEVhMScmfwfS0OE/Ji8cb+6WQddAwhLSu+VXr4/oA0D
GaNfs9aKEoHdWDUXpEL2a4ZbmNMOmJdukCJueVZkzH8vOnkx2wvziSmWXutN63y5
t2b1vS6J2vE+5DQhrzqZ1Nnat56kGyCa291dFH878tFnbQHrRls=
-----END RSA PRIVATE KEY-----`)
var self_gen_public_key = []byte(`AAAAB3NzaC1yc2EAAAADAQABAAABAQCjzCxYPMZJDRJbtepbWkWVv1n7ZGAjOYv4yFupZSZGYaLga2rOUMJaB4CskBk/8EZkKru2QccYesGHcZKgaJE5IPxIn2pgHnmTOJQtinSwnw+fujHEa1P26o7pIZkte1nln3wOpNOGCb3GjusSzdUdFd4Vij4+5CgKAiHztIqQFQZEleiEm85N02uqQXEvAgk2KugzO/a8AxpsfNKFBI89UMX8mANLYP30Bc6Fs0ZJzv6HdxZ5IM+z/z1fuTWI6/GITP8nlJGmmDaNzesQuNlQHYp09UmQ/AKSOhCNSAE3Yh6IwQqj1snqfWI1MsjIdTMt2FWBsJOviruunoPPtWhx`)
func RsaEncrypt(origData []byte) ([]byte, error) {
//解密pem格式的公钥
block, _ := pem.Decode(publicKey)
if block == nil {
return nil, errors.New("public key error")
}
// 解析公钥
pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
if err != nil {
return nil, err
}
// 类型断言
pub := pubInterface.(*rsa.PublicKey)
//加密
return rsa.EncryptPKCS1v15(rand.Reader, pub, origData)
}
// 解密
func RsaDecrypt(ciphertext []byte) ([]byte, error) {
//解密
block, _ := pem.Decode(privateKey)
if block == nil {
return nil, errors.New("private key error!")
}
//解析PKCS1格式的私钥
priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)
if err != nil {
return nil, err
}
// 解密
return rsa.DecryptPKCS1v15(rand.Reader, priv, ciphertext)
}
func crypt_test() {
data, _ := RsaEncrypt([]byte("test dataΩ......"))
fmt.Println(base64.StdEncoding.EncodeToString(data))
origData, _ := RsaDecrypt(data)
fmt.Println(string(origData))
}
func verify() {
org := []byte("{\"status\":\"SUCCESS\",\"productId\":\"productId\",\"extension\":\"\",\"payTime\":\"2018-09-28T06:43:20Z\",\"cpOrderId\":\"cpOrderId\",\"clientId\":\"clientId\",\"uid\":\"uid\",\"currency\":\"APPC\",\"country\":\"CHINA\",\"amount\":\"1.01\"}")
sig := ("VFdTV6IU8u+gqeVqzoZIY0QWxS3+P6Q513jAfxfRnNFdtghk3mB9FLphFZ8CQrZOYAqOb4P/jjRRnYJYfA4hy3cTxCjU5AUhjieg0pEtYVVm5wTVgj4iRcAwSgiYU0Rn5Q+hbChO11JqRlZ1s+sKy0gsc5BV7tdkMSY/XleN8T+Al/Yl8gnnYSgsiFVC1BJ+oNXgF7I16bMPOCMucGyGc2mYATqrmlrIxsP2zmQMVSo9iBkEe5aW8Na8JjMZj2J850UMdd8b3/GcSzw+FYi/lYXN8HWY0f45YNI0/mUsVdBfTtyQAu2PkGivi+4jFUrDFjP6mDUJF6PIH6KSKBiDRA==")
publicKey := ("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA76C0+ZS7zBF3m1OKqys2JnsXOWhmC1KRgrC1TATmtp0ZYIeCn5oEK6N0JagdyveyTlg2nA6x5PtUvEM0Z9ZVy8ANl7bIXign2HIY2BOlpTavhgzOPXi3daRVyqCGZsvdQX+AfupPQfUD6Fi4KZw9DgoUojHQLKefFTckUmC0dBisS3/T2W1Y4ZVpDnv8qw+8nGlnoQj0IWmYqAhNT0flP9t6bWLNzN9FrQUw3jcN+mplC81P8TF8jBiwLFgCcx2lR8wdbDrzHitnpwam7nx9ssU7xB67HYbp5eTfavbyZhe2K+AgshgpoXqW7xdKuCCuSyLfFtdXlhuhWWW7CI/OqwIDAQAB")
fmt.Println(VerifySignature(org, sig, publicKey))
//pubInterface, err := x509.ParsePKCS1PrivateKey(publicKey)
//if err != nil {
// fmt.Println("parse pub key error")
// panic(err)
//}
//org,err:=rsa.DecryptPKCS1v15(rand.Reader, pubInterface, crypt)
//if err!=nil{
// fmt.Println("decrtypt")
// panic(err)
//}
//fmt.Println(string(org))
fmt.Println(string(org))
fmt.Println(string(sig))
sh1 := sha1.New()
sh1.Write(org)
hashData := sh1.Sum(nil)
//verify
decodePublickey, err := base64.StdEncoding.DecodeString(publicKey)
if err != nil {
fmt.Println("base64 decode public key error")
panic(err)
}
decodeSign, err := base64.StdEncoding.DecodeString(sig)
if err != nil {
fmt.Println("base64 decode signature error")
panic(err)
}
pubInterface, err := x509.ParsePKIXPublicKey(decodePublickey)
if err != nil {
fmt.Println("parse pub key error")
panic(err)
}
pub := pubInterface.(*rsa.PublicKey)
err = rsa.VerifyPKCS1v15(pub, crypto.SHA1, hashData, decodeSign)
if err != nil {
fmt.Println("Verify sig error, reason: ", err)
panic(err)
}
fmt.Println("Verify succ")
}
func VerifySignature(data []byte, sign string, publicKey string) (bool, error) {
decodePublic, err := base64.StdEncoding.DecodeString(publicKey)
if err != nil {
return false, err
}
pubInterface, err := x509.ParsePKIXPublicKey(decodePublic)
if err != nil {
return false, err
}
pub := pubInterface.(*rsa.PublicKey)
decodeSign, err := base64.StdEncoding.DecodeString(sign)
if err != nil {
return false, err
}
sh1 := sha1.New()
sh1.Write(data)
hashData := sh1.Sum(nil)
result := rsa.VerifyPKCS1v15(pub, crypto.SHA1, hashData, decodeSign)
if result != nil {
return false, err
}
return true, nil
}
func sign(data []byte) string {
sh1 := sha1.New()
sh1.Write(data)
hashData := sh1.Sum(nil)
// sign
block, _ := pem.Decode(privateKey)
if block == nil {
panic("private key err")
}
privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
if err != nil {
panic(err)
}
sign, err := rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA1, hashData)
if err != nil {
panic(err)
}
signature_encoded := base64.StdEncoding.EncodeToString(sign)
return signature_encoded
}
func sign_and_verify() {
org := []byte("{\"status\":\"SUCCESS\",\"productId\":\"productId\",\"extension\":\"\",\"payTime\":\"2018-09-28T06:43:20Z\",\"cpOrderId\":\"cpOrderId\",\"clientId\":\"clientId\",\"uid\":\"uid\",\"currency\":\"APPC\",\"country\":\"CHINA\",\"amount\":\"1.01\"}")
sh1 := sha1.New()
sh1.Write(org)
hashData := sh1.Sum(nil)
// sign
block, _ := pem.Decode(privateKey)
if block == nil {
panic("private key err")
}
privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
if err != nil {
panic(err)
}
sign, err := rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA1, hashData)
if err != nil {
panic(err)
}
signature_encoded := base64.StdEncoding.EncodeToString(sign)
//verify
publicKey := "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCrGh1sc5AKD1EQ8WdA1iWF4m7wXtO6WoS7Dtfd0Jm2ud+LKBQ+e7R6YIXnwfEKB/4Jm+jNtCi7/Zrx5gtEpUuVAyrEo5+qr5al5KibeJq3xyI/626IBsDMFX5o3WOoXceTF7+lgi6r+OuokqFJgpeh7YANXQ8Y8mn8ucw+Ly+LbQIDAQAB"
//解密pem格式的公钥
//block, _ = pem.Decode(publicKey)
//if block == nil {
// panic("public key error")
//}
//publicKey:=base64.StdEncoding.EncodeToString(block.Bytes)
//publicKey:=base64.StdEncoding.EncodeToString(self_gen_public_key)
ok, err := VerifySignature(org, signature_encoded, string(publicKey))
fmt.Println(ok, err)
}
func main() {
org := []byte("{\"status\":\"SUCCESS\",\"productId\":\"productId\",\"extension\":\"\",\"payTime\":\"2018-09-28T06:43:20Z\",\"cpOrderId\":\"cpOrderId\",\"clientId\":\"clientId\",\"uid\":\"uid\",\"currency\":\"APPC\",\"country\":\"CHINA\",\"amount\":\"1.01\"}")
signature := sign(org)
fmt.Println("payload:")
fmt.Println(org)
fmt.Println("signature:")
fmt.Println(signature)
publicKey := "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCrGh1sc5AKD1EQ8WdA1iWF4m7wXtO6WoS7Dtfd0Jm2ud+LKBQ+e7R6YIXnwfEKB/4Jm+jNtCi7/Zrx5gtEpUuVAyrEo5+qr5al5KibeJq3xyI/626IBsDMFX5o3WOoXceTF7+lgi6r+OuokqFJgpeh7YANXQ8Y8mn8ucw+Ly+LbQIDAQAB"
fmt.Println(VerifySignature(org, signature, publicKey))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment