github.com/johnnyeven/libtools@v0.0.0-20191126065708-61829c1adf46/crypto/rsa2/rsa2.go (about) 1 /* 2 for alipay 3 */ 4 package rsa2 5 6 import ( 7 "crypto" 8 "crypto/rand" 9 "crypto/rsa" 10 "crypto/x509" 11 "encoding/pem" 12 "errors" 13 "strings" 14 ) 15 16 const ( 17 privateKeyHead = "-----BEGIN RSA PRIVATE KEY-----" 18 privateKeyTail = "-----END RSA PRIVATE KEY-----" 19 publicKeyHead = "-----BEGIN PUBLIC KEY-----" 20 publicKeyTail = "-----END PUBLIC KEY-----" 21 interval = 64 22 ) 23 24 func FormatPrivateKey(src string) string { 25 if src == "" { 26 return "" 27 } 28 r := strings.Replace(strings.Replace(src, privateKeyHead, "", -1), privateKeyTail, "", -1) 29 r = strings.TrimSpace(r) 30 r = strings.Replace(r, "\n", "", -1) 31 a := make([]string, 0) 32 33 for index := 0; index < len(r); index = index + interval { 34 if index+interval < len(r) { 35 a = append(a, r[index:index+interval]) 36 } else { 37 a = append(a, r[index:]) 38 } 39 } 40 41 m := make([]string, 0) 42 m = append(m, privateKeyHead) 43 m = append(m, a[:]...) 44 m = append(m, privateKeyTail) 45 return strings.Join(m, "\n") 46 } 47 48 func FormatPublicKey(src string) string { 49 if src == "" { 50 return "" 51 } 52 r := strings.Replace(strings.Replace(src, publicKeyHead, "", -1), publicKeyTail, "", -1) 53 r = strings.TrimSpace(r) 54 r = strings.Replace(r, "\n", "", -1) 55 a := make([]string, 0) 56 57 for index := 0; index < len(r); index = index + interval { 58 if index+interval < len(r) { 59 a = append(a, r[index:index+interval]) 60 } else { 61 a = append(a, r[index:]) 62 } 63 } 64 65 m := make([]string, 0) 66 m = append(m, publicKeyHead) 67 m = append(m, a[:]...) 68 m = append(m, publicKeyTail) 69 return strings.Join(m, "\n") 70 } 71 72 func packageData(originalData []byte, packageSize int) (r [][]byte) { 73 var src = make([]byte, len(originalData)) 74 copy(src, originalData) 75 76 r = make([][]byte, 0) 77 if len(src) <= packageSize { 78 return append(r, src) 79 } 80 for len(src) > 0 { 81 var p = src[:packageSize] 82 r = append(r, p) 83 src = src[packageSize:] 84 if len(src) <= packageSize { 85 r = append(r, src) 86 break 87 } 88 } 89 return r 90 } 91 92 func RSAEncrypt(plaintext, key []byte) ([]byte, error) { 93 var err error 94 var block *pem.Block 95 block, _ = pem.Decode(key) 96 if block == nil { 97 return nil, errors.New("public key error") 98 } 99 100 var pubInterface interface{} 101 pubInterface, err = x509.ParsePKIXPublicKey(block.Bytes) 102 if err != nil { 103 return nil, err 104 } 105 var pub = pubInterface.(*rsa.PublicKey) 106 107 var data = packageData(plaintext, pub.N.BitLen()/8-11) 108 var cipherData []byte = make([]byte, 0, 0) 109 110 for _, d := range data { 111 var c, e = rsa.EncryptPKCS1v15(rand.Reader, pub, d) 112 if e != nil { 113 return nil, e 114 } 115 cipherData = append(cipherData, c...) 116 } 117 118 return cipherData, nil 119 } 120 121 func RSADecrypt(ciphertext, key []byte) ([]byte, error) { 122 var err error 123 var block *pem.Block 124 block, _ = pem.Decode(key) 125 if block == nil { 126 return nil, errors.New("private key error") 127 } 128 129 var pri *rsa.PrivateKey 130 pri, err = x509.ParsePKCS1PrivateKey(block.Bytes) 131 if err != nil { 132 prkI, err := x509.ParsePKCS8PrivateKey(block.Bytes) 133 if err != nil { 134 return nil, err 135 } 136 pri = prkI.(*rsa.PrivateKey) 137 } 138 139 var data = packageData(ciphertext, pri.PublicKey.N.BitLen()/8) 140 var plainData []byte = make([]byte, 0, 0) 141 142 for _, d := range data { 143 var p, e = rsa.DecryptPKCS1v15(rand.Reader, pri, d) 144 if e != nil { 145 return nil, e 146 } 147 plainData = append(plainData, p...) 148 } 149 return plainData, nil 150 } 151 152 func SignPKCS1v15(src, key []byte, hash crypto.Hash) ([]byte, error) { 153 var h = hash.New() 154 h.Write(src) 155 var hashed = h.Sum(nil) 156 157 var err error 158 var block *pem.Block 159 block, _ = pem.Decode(key) 160 if block == nil { 161 return nil, errors.New("private key error") 162 } 163 164 var pri *rsa.PrivateKey 165 pri, err = x509.ParsePKCS1PrivateKey(block.Bytes) 166 167 // for java 168 if err != nil { 169 prkI, err := x509.ParsePKCS8PrivateKey(block.Bytes) 170 if err != nil { 171 return nil, err 172 } 173 pri = prkI.(*rsa.PrivateKey) 174 } 175 return rsa.SignPKCS1v15(rand.Reader, pri, hash, hashed) 176 } 177 178 func VerifyPKCS1v15(src, sig, key []byte, hash crypto.Hash) error { 179 var h = hash.New() 180 h.Write(src) 181 var hashed = h.Sum(nil) 182 183 var err error 184 var block *pem.Block 185 block, _ = pem.Decode(key) 186 if block == nil { 187 return errors.New("publick key error") 188 } 189 190 var pubInterface interface{} 191 pubInterface, err = x509.ParsePKIXPublicKey(block.Bytes) 192 if err != nil { 193 return err 194 } 195 var pub = pubInterface.(*rsa.PublicKey) 196 197 return rsa.VerifyPKCS1v15(pub, hash, hashed, sig) 198 }