Created
January 11, 2019 07:34
-
-
Save harryhare/6ff18e0c2dc0e6d6452c45e31b201568 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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