Skip to content

Commit e5bd081

Browse files
authored
Merge pull request #17 from forgoer/develop
feat: add aes functions
2 parents dbfc31a + 57b03f1 commit e5bd081

File tree

3 files changed

+203
-0
lines changed

3 files changed

+203
-0
lines changed

README.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@
55

66
A functions wrapping of OpenSSL library for symmetric and asymmetric encryption and decryption
77

8+
- [AES](#AES)
9+
- [DES](#DES)
10+
- [3DES](#DES)
11+
- [RSA](#RSA)
12+
813
## Installation
914

1015
The only requirement is the [Go Programming Language](https://golang.org/dl/)
@@ -80,6 +85,19 @@ openssl.Des3CBCEncrypt(src, key, iv, openssl.PKCS7_PADDING)
8085
openssl.Des3CBCDecrypt(src, key, iv, openssl.PKCS7_PADDING)
8186
```
8287

88+
### RSA
89+
90+
```go
91+
openssl.RSAGenerateKey(bits int, out io.Writer)
92+
openssl.RSAGeneratePublicKey(priKey []byte, out io.Writer)
93+
94+
openssl.RSAEncrypt(src, pubKey []byte) ([]byte, error)
95+
openssl.RSADecrypt(src, priKey []byte) ([]byte, error)
96+
97+
openssl.RSASign(src []byte, priKey []byte) ([]byte, error)
98+
openssl.RSAVerify(src, sign, pubKey []byte) error
99+
```
100+
83101
## License
84102

85103
This project is licensed under the [Apache 2.0 license](LICENSE).

rsa.go

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
package openssl
2+
3+
import (
4+
"crypto"
5+
"crypto/rand"
6+
"crypto/rsa"
7+
"crypto/sha256"
8+
"crypto/x509"
9+
"encoding/pem"
10+
"errors"
11+
"io"
12+
)
13+
14+
// RSAGenerateKey generate RSA private key
15+
func RSAGenerateKey(bits int, out io.Writer) error {
16+
privateKey, err := rsa.GenerateKey(rand.Reader, bits)
17+
if err != nil {
18+
return err
19+
}
20+
21+
X509PrivateKey := x509.MarshalPKCS1PrivateKey(privateKey)
22+
23+
privateBlock := pem.Block{Type: "RSA PRIVATE KEY", Bytes: X509PrivateKey}
24+
25+
return pem.Encode(out, &privateBlock)
26+
}
27+
28+
// RSAGeneratePublicKey generate RSA public key
29+
func RSAGeneratePublicKey(priKey []byte, out io.Writer) error {
30+
block, _ := pem.Decode(priKey)
31+
// x509 parse
32+
privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
33+
if err != nil {
34+
return err
35+
}
36+
publicKey := privateKey.PublicKey
37+
X509PublicKey, err := x509.MarshalPKIXPublicKey(&publicKey)
38+
if err != nil {
39+
return err
40+
}
41+
42+
publicBlock := pem.Block{Type: "RSA PUBLIC KEY", Bytes: X509PublicKey}
43+
44+
return pem.Encode(out, &publicBlock)
45+
}
46+
47+
// RSAEncrypt RSA encrypt
48+
func RSAEncrypt(src, pubKey []byte) ([]byte, error) {
49+
block, _ := pem.Decode(pubKey)
50+
// x509 parse
51+
publicKeyInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
52+
if err != nil {
53+
return nil, err
54+
}
55+
56+
publicKey, ok := publicKeyInterface.(*rsa.PublicKey)
57+
if !ok {
58+
return nil, errors.New("the kind of key is not a rsa.PublicKey")
59+
}
60+
// encrypt
61+
dst, err := rsa.EncryptPKCS1v15(rand.Reader, publicKey, src)
62+
if err != nil {
63+
return nil, err
64+
}
65+
66+
return dst, nil
67+
}
68+
69+
// RSADecrypt RSA decrypt
70+
func RSADecrypt(src, priKey []byte) ([]byte, error) {
71+
block, _ := pem.Decode(priKey)
72+
// x509 parse
73+
privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
74+
if err != nil {
75+
return nil, err
76+
}
77+
78+
dst, err := rsa.DecryptPKCS1v15(rand.Reader, privateKey, src)
79+
if err != nil {
80+
return nil, err
81+
}
82+
83+
return dst, nil
84+
}
85+
86+
// RSASign RSA sign, use crypto.SHA256
87+
func RSASign(src []byte, priKey []byte) ([]byte, error) {
88+
block, _ := pem.Decode(priKey)
89+
// x509 parse
90+
privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
91+
if err != nil {
92+
return nil, err
93+
}
94+
95+
hash := sha256.New()
96+
_, err = hash.Write(src)
97+
if err != nil {
98+
return nil, err
99+
}
100+
101+
bytes := hash.Sum(nil)
102+
sign, err := rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA256, bytes)
103+
if err != nil {
104+
return nil, err
105+
}
106+
107+
return sign, nil
108+
}
109+
110+
// RSAVerify RSA Verify
111+
func RSAVerify(src, sign, pubKey []byte) error {
112+
block, _ := pem.Decode(pubKey)
113+
// x509 parse
114+
publicKeyInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
115+
if err != nil {
116+
return err
117+
}
118+
119+
publicKey, ok := publicKeyInterface.(*rsa.PublicKey)
120+
if !ok {
121+
return errors.New("the kind of key is not a rsa.PublicKey")
122+
}
123+
124+
hash := sha256.New()
125+
_, err = hash.Write(src)
126+
if err != nil {
127+
return err
128+
}
129+
130+
bytes := hash.Sum(nil)
131+
132+
return rsa.VerifyPKCS1v15(publicKey, crypto.SHA256, bytes, sign)
133+
}

rsa_test.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package openssl
2+
3+
import (
4+
"bytes"
5+
"encoding/base64"
6+
"github.com/stretchr/testify/assert"
7+
"testing"
8+
)
9+
10+
func TestRSAEncrypt(t *testing.T) {
11+
priBuf := bytes.NewBuffer(nil)
12+
err := RSAGenerateKey(2048, priBuf)
13+
assert.NoError(t, err)
14+
t.Logf("private key: %s\n", priBuf.Bytes())
15+
16+
pubBuf := bytes.NewBuffer(nil)
17+
err = RSAGeneratePublicKey(priBuf.Bytes(), pubBuf)
18+
assert.NoError(t, err)
19+
t.Logf("public key: %s\n", pubBuf.Bytes())
20+
21+
src := []byte("123456")
22+
dst, err := RSAEncrypt(src, pubBuf.Bytes())
23+
assert.NoError(t, err)
24+
t.Logf("encrypt out: %s\n", base64.RawStdEncoding.EncodeToString(dst))
25+
26+
dst, err = RSADecrypt(dst, priBuf.Bytes())
27+
assert.NoError(t, err)
28+
29+
assert.Equal(t, src, dst)
30+
31+
t.Logf("src: %s \ndst:%s", src, dst)
32+
}
33+
34+
func TestRSASign(t *testing.T) {
35+
priBuf := bytes.NewBuffer(nil)
36+
err := RSAGenerateKey(2048, priBuf)
37+
assert.NoError(t, err)
38+
t.Logf("private key: %s\n", priBuf.Bytes())
39+
40+
pubBuf := bytes.NewBuffer(nil)
41+
err = RSAGeneratePublicKey(priBuf.Bytes(), pubBuf)
42+
assert.NoError(t, err)
43+
t.Logf("public key: %s\n", pubBuf.Bytes())
44+
45+
src := []byte("123456")
46+
sign, err := RSASign(src, priBuf.Bytes())
47+
assert.NoError(t, err)
48+
t.Logf("sign out: %s\n", base64.RawStdEncoding.EncodeToString(sign))
49+
50+
err = RSAVerify(src, sign, pubBuf.Bytes())
51+
assert.NoError(t, err)
52+
}

0 commit comments

Comments
 (0)