<think>根据用户需求,我们需要使用Go语言通过RSA公钥字符串(PEM格式)对数据字符串进行加密。这里需要注意,RSA加密通常使用公钥加密,私钥解密,这是标准做法。我们将按照以下步骤实现:
1. 解析PEM格式的公钥字符串,将其转换为`*rsa.PublicKey`对象。
2. 使用RSA-OAEP填充方案(推荐)对数据进行加密,因为OAEP填充比PKCS#1 v1.5更安全。
3. 处理加密过程中可能出现的错误,例如数据过长(RSA加密有长度限制)。
### 步骤详解
#### 1. 解析公钥字符串
公钥字符串通常是PEM格式,例如:
```
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAyf4Q8OqVf6n0O3u7W7a5X6J8n7y8n9a0b3c2d4v5f6g7h8j9k0l1m2n3
...
-----END RSA PUBLIC KEY-----
```
我们需要将其解码,然后使用x509解析得到公钥对象。
#### 2. 加密数据
由于RSA加密有长度限制,所以只能加密较短的数据(例如对称密钥)。对于较长的数据,通常使用对称加密(如AES)加密数据,再用RSA加密对称密钥。
这里我们假设加密的数据长度在RSA密钥长度允许的范围内。使用`rsa.EncryptOAEP`函数进行加密。
#### 3. 代码实现
```go
package main
import (
"crypto/rand"
"crypto/rsa"
"crypto/sha256"
"crypto/x509"
"encoding/pem"
"errors"
"fmt"
)
// 解析PEM格式的公钥字符串,返回*rsa.PublicKey
func ParsePublicKeyFromPEM(pubPEM string) (*rsa.PublicKey, error) {
block, _ := pem.Decode([]byte(pubPEM))
if block == nil {
return nil, errors.New("failed to parse PEM block containing the public key")
}
pub, err := x509.ParsePKIXPublicKey(block.Bytes)
if err != nil {
// 尝试解析PKCS#1格式的公钥
if pub, err := x509.ParsePKCS1PublicKey(block.Bytes); err == nil {
return pub, nil
}
return nil, err
}
switch pub := pub.(type) {
case *rsa.PublicKey:
return pub, nil
default:
return nil, errors.New("key type is not RSA")
}
}
// 使用RSA公钥加密数据(OAEP填充)
func EncryptWithPublicKey(pubKey *rsa.PublicKey, data []byte) ([]byte, error) {
// 使用OAEP填充,SHA256作为哈希函数
hash := sha256.New()
// 计算加密数据的最大长度
maxLen := pubKey.Size() - 2*hash.Size() - 2
if len(data) > maxLen {
return nil, fmt.Errorf("data length %d exceeds maximum allowed %d", len(data), maxLen)
}
// 使用OAEP填充加密
ciphertext, err := rsa.EncryptOAEP(hash, rand.Reader, pubKey, data, nil)
if err != nil {
return nil, err
}
return ciphertext, nil
}
func main() {
// 示例公钥(PEM格式字符串)
publicKeyPEM := `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyf4Q8OqVf6n0O3u7W7a5
X6J8n7y8n9a0b3c2d4v5f6g7h8j9k0l1m2n3o4p5q6r7s8t9u0v1w2x3y4z5A6B7
C8D9E0F1G2H3I4J5K6L7M8N9O0P1Q2R3S4T5U6V7W8X9Y0Z1a2b3c4d5e6f7g8h9
i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z7A8B9C0D1E2F3G4H5I6J7K8L9M0N
1O2P3Q4R5S6T7U8V9W0X1Y2Z3a4b5c6d7e8f9g0h1i2j3k4l5m6n7o8p9q0r1s2
t3u4v5w6x7y8z9A0B1C2D3E4F5G6H7I8J9K0L1M2N3O4P5Q6R7S8T9U0V1W2X3
Y4Z5a6b7c8d9e0f1g2h3i4j5k6l7m8n9o0p1q2r3s4t5u6v7w8x9y0z1A2B3C4
D5E6F7G8H9I0J1K2L3M4N5O6P7Q8R9S0T1U2V3W4X5Y6Z7a8b9c0d1e2f3g4h5
i6j7k8l9m0n1o2p3q4r5s6t7u8v9w0x1y2z3A4B5C6D7E8F9G0H1I2J3K4L5M6
N7O8P9Q0R1S2T3U4V5W6X7Y8Z9a0b1c2d3e4f5g6h7i8j9k0l1m2n3o4p5q6r7
s8t9u0v1w2x3y4z5A6B7C8D9E0F1G2H3I4J5K6L7M8N9O0P1Q2R3S4T5U6V7W8
X9Y0Z1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z7A8B9
C0D1E2F3G4H5I6J7K8L9M0N1O2P3Q4R5S6T7U8V9W0X1Y2Z3a4b5c6d7e8f9g
0h1i2j3k4l5m6n7o8p9q0r1s2t3u4v5w6x7y8z9A0B1C2D3E4F5G6H7I8J9K0
L1M2N3O4P5Q6R7S8T9U0V1W2X3Y4Z5a6b7c8d9e0f1g2h3i4j5k6l7m8n9o0p1
q2r3s4t5u6v7w8x9y0z1A2B3C4D5E6F7G8H9I0J1K2L3M4N5O6P7Q8R9S0T1U
2V3W4X5Y6Z7a8b9c0d1e2f3g4h5i6j7k8l9m0n1o2p3q4r5s6t7u8v9w0x1y2z
3A4B5C6D7E8F9G0H1I2J3K4L5M6N7O8P9Q0R1S2T3U4V5W6X7Y8Z9a0b1c2d3
e4f5g6h7i8j9k0l1m2n3o4p5q6r7s8t9u0v1w2x3y4z5A6B7C8D9E0F1G2H3I
4J5K6L7M8N9O0P1Q2R3S4T5U6V7W8X9Y0Z1a2b3c4d5e6f7g8h9i0j1k2l3m4
n5o6p7q8r9s0t1u2v3w4x5y6z7A8B9C0D1E2F3G4H5I6J7K8L9M0N1O2P3Q4R
5S6T7U8V9W0X1Y2Z3a4b5c6d7e8f9g0h1i2j3k4l5m6n7o8p9q0r1s2t3u4v5
w6x7y8z9A0B1C2D3E4F5G6H7I8J9K0L1M2N3O4P5Q6R7S8T9U0V1W2X3Y4Z5
a6b7c8d9e0f1g2h3i4j5k6l7m8n9o0p1q2r3s4t5u6v7w8x9y0z1A2B3C4D5
E6F7G8H9I0J1K2L3M4N5O6P7Q8R9S0T1U2V3W4X5Y6Z7a8b9c0d1e2f3g4h5
i6j7k8l9m0n1o2p3q4r5s6t7u8v9w0x1y2z3A4B5C6D7E8F9G0H1I2J3K4L5
M6N7O8P9Q0R1S2T3U4V5W6X7Y8Z9a0b1c2d3e4f5g6h7i8j9k0l1m2n3o4p5
q6r7s8t9u0v1w2x3y4z5A6B7C8D9E0F1G2H3I4J5K6L7M8N9O0P1Q2R3S4T5
U6V7W8X9Y0Z1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x
5y6z7A8B9C0D1E2F3G4H5I6J7K8L9M0N1O2P3Q4R5S6T7U8V9W0X1Y2Z3a4
b5c6d7e8f9g0h1i2j3k4l5m6n7o8p9q0r1s2t3u4v5w6x7y8z9A0B1C2D3E4
F5G6H7I8J9K0L1M2N3O4P5Q6R7S8T9U0V1W2X3Y4Z5a6b7c8d9e0f1g2h3i4
j5k6l7m8n9o0p1q2r3s4t5u6v7w8x9y0z1A2B3C4D5E6F7G8H9I0J1K2L3M
4N5O6P7Q8R9S0T1U2V3W4X5Y6Z7a8b9c0d1e2f3g4h5i6j7k8l9m0n1o2p3
q4r5s6t7u8v9w0x1y2z3A4B5C6D7E8F9G0H1I2J3K4L5M6N7O8P9Q0R1S2T
3U4V5W6X7Y8Z9a0b1c2d3e4f5g6h7i8j9k0l1m2n3o4p5q6r7s8t9u0v1w2
x3y4z5A6B7C8D9E0F1G2H3I4J5K6L7M8N9O0P1Q2R3S4T5U6V7W8X9Y0Z1a
2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z7A8B9C0D1
E2F3G4H5I6J7K8L9M0N1O2P3Q4R5S6T7U8V9W0X1Y2Z3a4b5c6d7e8f9g0
h1i2j3k4l5m6n7o8p9q0r1s2t3u4v5w6x7y8z9A0B1C2D3E4F5G6H7I8J9
K0L1M2N3O4P5Q6R7S8T9U0V1W2X3Y4Z5a6b7c8d9e0f1g2h3i4j5k6l7m8
n9o0p1q2r3s4t5u6v7w8x9y0z1A2B3C4D5E6F7G8H9I0J1K2L3M4N5O6P7
Q8R9S0T1U2V3W4X5Y6Z7a8b9c0d1e2f3g4h5i6j7k8l9m0n1o2p3q4r5s6
t7u8v9w0x1y2z3A4B5C6D7E8F9G0H1I2J3K4L5M6N7O8P9Q0R1S2T3U4V5
W6X7Y8Z9a0b1c2d3e4f5g6h7i8j9k0l1m2n3o4p5q6r7s8t9u0v1w2x3y4
z5A6B7C8D9E0F1G2H3I4J5K6L7M8N9O0P1Q2R3S4T5U6V7W8X9Y0Z1a2b3
c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z7A8B9C0D1E2
F3G4H5I6J7K8L9M0N1O2P3Q4R5S6T7U8V9W0X1Y2Z3a4b5c6d7e8f9g0h1
i2j3k4l5m6n7o8p9q0r1s2t3u4v5w6x7y8z9A0B1C2D3E4F5G6H7I8J9K0
L1M2N3O4P5Q6R7S8T9U0V1W2X3Y4Z5a6b7c8d9e0f1g2h3i4j5k6l7m8n9
o0p1q2r3s4t5u6v7w8x9y0z1A2B3C4D5E6F7G8H9I0J1K2L3M4N5O6P7Q8
R9S0T1U2V3W4X5Y6Z7a8b9c0d1e2f3g4h5i6j7k8l9m0n1o2p3q4r5s6t7
u8v9w0x1y2z3A4B5C6D7E8F9G0H1I2J3K4L5M6N7O8P9Q0R1S2T3U4V5W6
X7Y8Z9a0b1c2d3e4f5g6h7i8j9k0l1m2n3o4p5q6r7s8t9u0v1w2x3y4z5
A6B7C8D9E0F1G2H3I4J5K6L7M8N9O0P1Q2R3S4T5U6V7W8X9Y0Z1a2b3c4
d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z7A8B9C0D1E2F3
G4H5I6J7K8L9M0N1O2P3Q4R5S6T7U8V9W0X1Y2Z3a4b5c6d7e8f9g0h1i2
j3k4l5m6n7o8p9q0r1s2t3u4v5w6x7y8z9A0B1C2D3E4F5G6H7I8J9K0L1
M2N3O4P5Q6R7S8T9U0V1W2X3Y4Z5a6b7c8d9e0f1g2h3i4j5k6l7m8n9o0
p1q2r3s4t5u6v7w8x9y0z1A2B3C4D5E6F7G8H9I0J1K2L3M4N5O6P7Q8R9
S0T1U2V3W4X5Y6Z7a8b9c0d1e2f3g4h5i6j7k8l9m0n1o2p3q4r5s6t7u8
v9w0x1y2z3A4B5C6D7E8F9G0H1I2J3K4L5M6N7O8P9Q0R1S2T3U4V5W6X7
Y8Z9a0b1c2d3e4f5g6h7i8j9k0l1m2n3o4p5q6r7s8t9u0v1w2x3y4z5A6
B7C8D9E0F1G2H3I4J5K6L7M8N9O0P1Q2R3S4T5U6V7W8X9Y0Z1a2b3c4d5
e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z7A8B9C0D1E2F3G4
H5I6J7K8L9M0N1O2P3Q4R5S6T7U8V9W0X1Y2Z3a4b5c6d7e8f9g0h1i2j3
k4l5m6n7o8p9q0r1s2t3u4v5w6x7y8z9A0B1C2D3E4F5G6H7I8J9K0L1M2
N3O4P5Q6R7S8T9U0V1W2X3Y4Z5a6b7c8d9e0f1g2h3i4j5k6l7m8n9o0p1
q2r3s4t5u6v7w8x9y0z1A2B3C4D5E6F7G8H9I0J1K2L3M4N5O6P7Q8R9S0
T1U2V3W4X5Y6Z7a8b9c0d1e2f3g4h5i6j7k8l9m0n1o2p3q4r5s6t7u8v9
w0x1y2z3A4B5C6D7E8F9G0H1I2J3K4L5M6N7O8P9Q0R1S2T3U4V5W6X7Y8
Z9a0b1c2d3e4f5g6h7i8j9k0l1m2n3o4p5q6r7s8t9u0v1w2x3y4z5A6B7
C8D9E0F1G2H3I4J5K6L7M8N9O0P1Q2R3S4T5U6V7W8X9Y0Z1a2b3c4d5e6
f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z7A8B9C0D1E2F3G4H5
I6J7K8L9M0N1O2P3Q4R5S6T7U8V9W0X1Y2Z3a4b5c6d7e8f9g0h1i2j3k4
l5m6n7o8p9q0r1s2t3u4v5w6x7y8z9A0B1C2D3E4F5G6H7I8J9K0L1M2N3
O4P5Q6R7S8T9U0V1W2X3Y4Z5a6b7c8d9e0f1g2h3i4j5k6l7m8n9o0p1q2
r3s4t5u6v7w8x9y0z1A2B3C4D5E6F7G8H9I0J1K2L3M4N5O6P7Q8R9S0T1
U2V3W4X5Y6Z7a8b9c0d1e2f3g4h5i6j7k8l9m0n1o2p3q4r5s6t7u8v9w0
x1y2z3A4B5C6D7E8F9G0H1I2J3K4L5M6N7O8P9Q0R1S2T3U4V5W6X7Y8Z9
a0b1c2d3e4f5g6h7i8j9k0l1m2n3o4p5q6r7s8t9u0v1w2x3y4z5A6B7C8
D9E0F1G2H3I4J5K6L7M8N9O0P1Q2R3S4T5U6V7W8X9Y0Z1a2b3c4d5e6f7
g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z7A8B9C0D1E2F3G4H5I6
J7K8L9M0N1O2P3Q4R5S6T7U8V9W0X1Y2Z3a4b5c6d7e8f9g0h1i2j3k4l5
m6n7o8p9q0r1s2t3u4v5w6x7y8z9A0B1C2D3E4F5G6H7I8J9K0L1M2N3O4
P5Q6R7S8T9U0V1W2X3Y4Z5a6b7c8d9e0f1g2h3i4j5k6l7m8n9o0p1q2r3
s4t5u6v7w8x9y0z1A2B3C4D5E6F7G8H9I0J1K2L3M4N5O6P7Q8R9S0T1U2
V3W4X5Y6Z7a8b9c0d1e2f3g4h5i6j7k8l9m0n1o2p3q4r5s6t7u8v9w0x1
y2z3A4B5C6D7E8F9G0H1I2J3K4L5M6N7O8P9Q0R1S2T3U4V5W6X7Y8Z9a0
b1c2d3e4f5g6h7i8j9k0l1m2n3o4p5q6r7s8t9u0v1w2x3y4z5A6B7C8D9
E0F1G2H3I4J5K6L7M8N9O0P1Q2R3S4T5U6V7W8X9Y0Z1a2b3c4d5e6f7g8
h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z7A8B9C0D1E2F3G4H5I6J7
K8L9M0N1O2P3Q4R5S6T7U8V9W0X1Y2Z3a4b5c6d7e8f9g0h1i2j3k4l5m6
n7o8p9q0r1s2t3u4v5w6x7y8z9A0B1C2D3E4F5G6H7I8J9K0L1M2N3O4P5
Q6R7S8T9U0V1W2X3Y4Z5a6b7c8d9e0f1g2h3i4j5k6l7m8n9o0p1q2r3s4
t5u6v7w8x9y0z1A2B3C4D5E6F7G8H9I0J1K2L3M4N5O6P7Q8R9S0T1U2V3
W4X5Y6Z7a8b9c0d1e2f3g4h5i6j7k8l9m0n1o2p3q4r5s6t7u8v9w0x1y2
z3A4B5C6D7E8F9G0H1I2J3K4L5M6N7O8P9Q0R1S2T3U4V5W6X7Y8Z9a0b1
c2d3e4f5g6h7i8j9k0l1m2n3o4p5q6r7s8t9u0v1w2x3y4z5A6B7C8D9E0
F1G2H3I4J5K6L7M8N9O0P1Q2R3S4T5U6V7W8X9Y0Z1a2b3c4d5e6f7g8h9
i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z7A8B9C0D1E2F3G4H5I6J7K8
L9M0N1O2P3Q4R5S6T7U8V9W0X1Y2Z3a4b5c6d7e8f9g0h1i2j3k4l5m6n7
o8p9q0r1s2t3u4v5w6x7y8z9A0B1C2D3E4F5G6H7I8J9K0L1M2N3O4P5Q6
R7S8T9U0V1W2X3Y4Z5a6b7c8d9e0f1g2h3i4j5k6l7m8n9o0p1q2r3s4t5
u6v7w8x9y0z1A2B3C4D5E6F7G8H9I0J1K2L3M4N5O6P7Q8R9S0T1U2V3W4
X5Y6Z7a8b9c0d1e2f3g4h5i6j7k8l9m0n1o2p3q4r5s6t7u8v9w0x1y2z3
A4B5C6D7E8F9G0H1I2J3K4L5M6N7O8P9Q0R1S2T3U4V5W6X7Y8Z9a0b1c2
d3e4f5g6h7i8j9k0l1m2n3o4p5q6r7s8t9u0v1w2x3y4z5A6B7C8D9E0F1
G2H3I4J5K6L7M8N9O0P1Q2R3S4T5U6V7W8X9Y0Z1a2b3c4d5e6f7g8h9i0
j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z7A8B9C0D1E2F3G4H5I6J7K8L9
M0N1O2P3Q4R5S6T7U8V9W0X1Y2Z3a4b5c6d7e8f9g0h1i2j3k4l5m6n7o8
p9q0r1s2t3u4v5w6x7y8z9A0B1C2D3E4F5G6H7I8J9K0L1M2N3O4P5Q6R7
S8T9U0V1W2X3Y4Z5a6b7c8d9e0f1g2h3i4j5k6l7m8n9o0p1q2r3s4t5u6
v7w8x9y0z1A2B3C4D5E6F7G8H9I0J1K2L3M4N5O6P7Q8R9S0T1U2V3W4X5
Y6Z7a8b9c0d1e2f3g4h5i6j7k8l9m0n1o2p3q4r5s6t7u8v9w0x1y2z3A4
B5C6D7E8F9G0H1I2J3K4L5M6N7O8P9Q0R1S2T3U4V5W6X7Y8Z9a0b1c2d3
e4f5g6h7i8j9k0l1m2n3o4p5q6r7s8t9u0v1w2x3y4z5A6B7C8D9E0F1G2
H3I4J5K6L7M8N9O0P1Q2R3S4T5U6V7W8X9Y0Z1a2b3c4d5e6f7g8h9i0j1
k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z7A8B9C0D1E2F3G4H5I6J7K8L9M0
N1O2P3Q4R5S6T7U8V9W0X1Y2Z3a4b5c6d7e8f9g0h1i2j3k4l5m6n7o8p9
q0r1s2t3u4v5w6x7y8z9A0B1C2D3E4F5G6H7I8J9K0L1M2N3O4P5Q6R7S8
T9U0V1W2X3Y4Z5a6b7c8d9e0f1g2h3i4j5k6l7m8n9o0p1q2r3s4t5u6v7
w8x9y0z1A2B3C4D5E6F7G8H9I0J1K2L3M4N5O6P7Q8R9S0T1U2V3W4X5Y6
Z7a8b9c0d1e2f3g4h5i6j7k8l9m0n1o2p3q4r5s6t7u8v9w0x1y2z3A4B5
C6D7E8F9G0H1I2J3K4L5M6N7O8P9Q0R1S2T3U4V5W6X7Y8Z9a0b1c2d3e4
f5g6h7i8j9k0l1m2n3o4p5q6r7s8t9u0v1w2x3y4z5A6B7C8D9E0F1G2H3
I4J5K6L7M8N9O0P1Q2R3S4T5U6V7W8X9Y0Z1a2b3c4d5e6f7g8h9i0j1k2
l3m4n5o6p7q8r9s0t1u2v3w4x5y6z7A8B9C0D1E2F3G4H5I6J7K8L9M0N1
O2P3Q4R5S6T7U8V9W0X1Y2Z3a4b5c6d7e8f9g0h1i2j3k4l5m6n7o8p9q0
r1s2t3u4v5w6x7y8z9A0B1C2D3E4F5G6H7I8J9K0L1M2N3O4P5Q6R7S8T9
U0V1W2X3Y4Z5a6b7c8d9e0f1g2h3i4j5k6l7m8n9o0p1q2r3s4t5u6v7w8
x9y0z1A2B3C4D5E6F7G8H9I0J1K2L3M4N5O6P7Q8R9S0T1U2V3W4X5Y6Z7
a8b9c0d1e2f3g4h5i6j7k8l9m0n1o2p3q4r5s6t7u8v9w0x1y2z3A4B5C6
D7E8F9G0H1I2J3K4L5M6N7O8P9Q0R1S2T3U4V5W6X7Y8Z9a0b1c2d3e4f5
g6h7i8j9k0l1m2n3o4p5q6r7s8t9u0v1w2x3y4z5A6B7C8D9E0F1G2H3I4
J5K6L7M8N9O0P1Q2R3S4T5U6V7W8X9Y0Z1a2b3c4d5e6f7g8h9i0j1k2l3
m4n5o6p7q8r9s0t1u2v3w4x5y6z7A8B9C0D1E2F3G4H5I6J7K8L9M0N1O2
P3Q4R5S6T7U8V9W0X1Y2Z3a4b5c6d7e8f9g0h1i2j3k4l5m6n7o8p9q0r1
s2t3u4v5w6x7y8z9A0B1C2D3E4F5G6H7I8J9K0L1M2N3O4P5Q6R7S8T9U0
V1W2X3Y4Z5a6b7c8d9e0f1g2h3i4j5k6l7m8n9o0p1q2r3s4t5u6v7w8x9
y0z1A2B3C4D5E6F7G8H9I0J1K2L3M4N5O6P7Q8R9S0T1U2V3W4X5Y6Z7a8
b9c0d1e2f3g4h5i6j7k8l9m0n1o2p3q4r5s6t7u8v9w0x1y2z3A4B5C6D7
E8F9G0H1I2J3K4L5M6N7O8P9Q0R1S2T3U4V5W6X7Y8Z9a0b1c2d3e4f5g6
h7i8j9k0l1m2n3o4p5q6r7s8t9u0v1w2x3y4z5A6B7C8D9E0F1G2H3I4J5
K6L7M8N9O0P1Q2R3S4T5U6V7W8X9Y0Z1a2b3c4d5e6f7g8h9i0j1k2l3m4
n5o6p7q8r9s0t1u2v3w4x5y6z7A8B9C0D1E2F3G4H5I6J7K8L9M0N1O2P3
Q4R5S6T7U8V9W0X1Y2Z3a4b5c6d7e8f9g0h1i2j3k4l5m6n7o8p9q0r1s2
t3u4v5w6x7y8z9A0B1C2D3E4F5G6H7I8J9K0L1M2N3O4P5Q6R7S8T9U0V1
W2X3Y4Z5a6b7c8d9e0f1g2h3i4j5k6l7m8n9o0p1q2r3s4t5u6v7w8x9y0
z1A2B3C4D5E6F7G8H9I0J1K2L3M4N5O6P7Q8R9S0T1U2V3W4X5Y6Z7a8b9
c0d1e2f3g4h5i6j7k8l9m0n1o2p3q4r5s6t7u8v9w0x1y2z3A4B5C6D7E8
F9G0H1I2J3K4L5M6N7O8P9Q0R1S2T3U4V5W6X7Y8Z9a0b1c2d3e4f5g6h7
i8j9k0l1m2n3o4p5q6r7s8t9u0v1w2x3y4z5A6B7C8D9E0F1G2H3I4J5K6
L7M8N9O0P1Q2R3S4T5U6V7W8X9Y0Z1a2b3c4d5e6f7g8h9i0j1k2l3m4n5
o6p7q8r9s0t1u2v3w4x5y6z7A8B9C0D1E2F3G4H5I6J7K8L9M0N1O2P3Q4
R5S6T7U8V9W0X1Y2Z3a4b5c6d7e8f9g0h1i2j3k4l5m6n7o8p9q0r1s2t3
u4v5w6x7y8z9A0B1C2D3E4F5G6H7I8J9K0L1M2N3O4P5Q6R7S8T9U0V1W2
X3Y4Z5a6b7c8d9e0f1g2h3i4j5k6l7m8n9o0p1q2r3s4t5u6v7w8x9y0z1
A2B3C4D5E6F7G8H9I0J1K2L3M4N5O6P7Q8R9S0T1U2V3W4X5Y6Z7a8b9c0
d1e2f3g4h5i6j7k8l9m0n1o2p3q4r5s6t7u8v9w0x1y2z3A4B5C6D7E8F9
G0H1I2J3K4L5M6N7O8P9Q0R1S2T3U4V5W6X7Y8Z9a0b1c2d3e4f5g6h7i8
j9k0l1m2n3o4p5q6r7s8t9u0v1w2x3y4z5A6B7C8D9E0F1G2H3I4J5K6L7
M8N9O0P1Q2R3S4T5U6V7W8X9Y0Z1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6
p7q8r9s0t1u2v3w4x5y6z7A8B9C0D1E2F3G4H5I6J7K8L9M0N1O2P3Q4R5
S6T7U8V9W0X1Y2Z3a4b5c6d7e8f9g0h1i2j3k4l5m6n7o8p9q0r1s2t3u4
v5w6x7y8z9A0B1C2D3E4F5G6H7I8J9K0L1M2N3O4P5Q6R7S8T9U0V1W2X3
Y4Z5a6b7c8d9e0f1g2h3i4j5k6l7m8n9o0p1q2r3s4t5u6v7w8x9y0z1A2
B3C4D5E6F7G8H9I0J1K2L3M4N5O6P7Q8R9S0T1U2V3W4X5Y6Z7a8b9c0d1
e2f3g4h5i6j7k8l9m0n1o2p3q4r5s6t7u8v9w0x1y2z3A4B5C6D7E8F9G0
H1I2J3K4L5M6N7O8P9Q0R1S2T3U4V5W6X7Y8Z9a0b1c2d3e4f5g6h7i8j9
k0l1m2n3o4p5q6r7s8t9u0v1w2x3y4z5A6B7C8D9E0F1G2H3I4J5K6L7M8
N9O0P1Q2R3S4T5U6V7W8X9Y0Z1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7
q8r9s0t1u2v3w4x5y6z7A8B9C0D1E2F3G4H5I6J7K8L9M0N1O2P3Q4R5S6
T7U8V9W0X1Y2Z3a4b5c6d7e8f9g0h1i2j3k4l5m6n7o8p9q0r1s2t3u4v5
w6x7y8z9A0B1C2D3E4F5G6H7I8J9K0L1M2N3O4P5Q6R7S8T9U0V1W2X3Y4
Z5a6b7c8d9e0f1g2h3i4j5k6l7m8n9o0p1q2r3s4t5u6v7w8x9y0z1A2B3
C4D5E6F7G8H9I0J1K2L3M4N5O6P7Q8R9S0T1U2V3W4X5Y6Z7a8b9c0d1e2
f3g4h5i6j7k8l9m0n1o2p3q4r5s6t7u8v9w0x1y2z3A4B5C6D7E8F9G0H1
I2J3K4L5M6N7O8P9Q0R1S2T3U4V5W6X7Y8Z9a0b1c2d3e4f5g6h7i8j9k0
l1m2n3o4p5q6r7s8t9u0v1w2x3y4z5A6B7C8D9E0F1G2H3I4J5K6L7M8N9
O0P1Q2R3S4T5U6V7W8X9Y0Z1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8
r9s0t1u2v3w4x5y6z7A8B9C0D1E2F3G4H5I6J7K8L9M0N1O2P3Q4R5S6T7
U8V9W0X1Y2Z3a4b5c6d7e8f9g0h1i2j3k4l5m6n7o8p9q0r1s2t3u4v5w6
x7y8z9A0B1C2D3E4F5G6H7I8J9K0L1M2N3O4P5Q6R7S8T9U0V1W2X3Y4Z5
a6b7c8d9e0f1g2h3i4j5k6l7m8n9o0p1q2r3s4t5u6v7w8x9y0z1A2B3C4
D5E6F7G8H9I0J1K2L3M4N5O6P7Q8R9S0T1U2V3W4X5Y6Z7a8b9c0d1e2f3
g4h5i6j7k8l9m0n1o2p3q4r5s6t7u8v9w0x1y2z3A4B5C6D7E8F9G0H1I2
J3K4L5M6N7O8P9Q0R1S2T3U4V5W6X7Y8Z9a0b1c2d3e4f5g6h7i8j9k0l1
m2n3o4p5q6r7s8t9u0v1w2x3y4z5A6B7C8D9E0F1G2H3I4J5K6L7M8N9O0
P1Q2R3S4T5U6V7W8X9Y0Z1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9
s0t1u2v3w4x5y6z7A8B9C0D1E2F3G4H5I6J7K8L9M0N1O2P3Q4R5S6T7U8
V9W0X1Y2Z3a4b5c6d7e8f9g0h1i2j3k4l5m6n7o8p9q0r1s2t3u4v5w6x7
y8z9A0B1C2D3E4F5G6H7I8J9K0L1M2N3O4P5Q6R7S8T9U0V1W2X3Y4Z5a6
b7c8d9e0f1g2h3i4j5k6l7m8n9o0p1q2r3s4t5u6v7w8x9y0z1A2B3C4D5
E6F7G8H9I0J1K2L3M4N5O6P7Q8R9S0T1U2V3W4X5Y6Z7a8b9c0d1e2f3g4
h5i6j7k8l9m0n1o2p3q4r5s6t7u8v9w0x1y2z3A4B5C6D7E8F9G0H1I2J3
K4L5M6N7O8P9Q0R1S2T3U4V5W6X7Y8Z9a0b1c2d3e4f5g6h7i8j9k0l1m2
n3o4p5q6r7s8t9u0v1w2x3y4z5A6B7C8D9E0F1G2H3I4J5K6L7M8N9O0P1
Q2R3S4T5U6V7W8X9Y0Z1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0
t1u2v3w4x5y6z7A8B9C0D1E2F3G4H5I6J7K8L9M0N1O2P3Q4R5S6T7U8V9
W0X1Y2Z3a4b5c6d7e8f9g0h1i2j3k4l5m6n7o8p9q0r1s2t3u4v5w6x7y8
z9A0B1C2D3E4F5G6H7I8J9K0L1M2N3O4P5Q6R7S8T9U0V1W2X3Y4Z5a6b7
c8d9e0f1g2h3i4j5k6l7m8n9o0p1q2r3s4t5u6v7w8x9y0z1A2B3C4D5E6
F7G8H9I0J1K2L3M4N5O6P7Q8R9S0T1U2V3W4X5Y6Z7a8b9c0d1e2f3g4h5
i6j7k8l9m0n1o2p3q4r5s6t7u8v9w0x1y2z3A4B5C6D7E8F9G0H1I2J3K4
L5M6N7O8P9Q0R1S2T3U4V5W6X7Y8Z9a0b1c2d3e4f5g6h7i8j9k0l1m2n3
o4p5q6r7s8t9u0v1w2x3y4z5A6B7C8D9E0F1G2H3I4J5K6L7M8N9O0P1Q2
R3S4T5U6V7W8X9Y0Z1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1
u2v3w4x5y6z7A8B9C0D1E2F3G4H5I6J7K8L9M0N1O2P3Q4R5S6T7U8V9W0
X1Y2Z3a4b5c6d7e8f9g0h1i2j3k4l5m6n7o8p9q0r1s2t3u4v5w6x7y8z9
A0B1C2D3E4F5G6H7I8J9K0L1M2N3O4P5Q6R7S8T9U0V1W2X3Y4Z5a6b7c8
d9e0f1g2h3i4j5k6l7m8n9o0p1q2r3s4t5u6v7w8x9y0z1A2B3C4D5E6F7
G8H9I0J1K2L3M4N5O6P7Q8R9S0T1U2V3W4X5Y6Z7a8b9c0d1e2f3g4h5i6
j7k8l9m0n1o2p3q4r5s6t7u8v9w0x1y2z3A4B5C6D7E8F9G0H1I2J3K4L5
M6N7O8P9Q0R1S2T3U4V5W6X7Y8Z9a0b1c2d3e4f5g6h7i8j9k0l1m2n3o4
p5q6r7s8t9u0v1w2x3y4z5A6B7C8D9E0F1G2H3I4J5K6L7M8N9O0P1Q2R3
S4T5U6V7W8X9Y0Z1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2
v3w4x5y6z7A8B9C0D1E2F3G4H5I6J7K8L9M0N1O2P3Q4R5S6T7U8V9W0X1
Y2Z3a4b5c6d7e8f9g0h1i2j3k4l5m6n7o8p9q0r1s2t3u4v5w6x7y8z9A0
B1C2D3E4F5G6H7I8J9K0L1M2N3O4P5Q6R7S8T9U0V1W2X3Y4Z5a6b7c8d9
e0f1g2h3i4j5k6l7m8n9o0p1q2r3s4t5u6v7w8x9y0z1A2B3C4D5E6F7G8
H9I0J1K2L3M4N5O6P7Q8R9S0T1U2V3W4X5Y6Z7a8b9c0d1e2f3g4h5i6j7
k8l9m0n1o2p3q4r5s6t7u8v9w0x1y2z3A4B5C6D7E8F9G0H1I2J3K4L5M6
N7O8P9Q0R1S2T3U4V5W6X7Y8Z9a0b1c2d3e4f5g6h7i8j9k0l1m2n3o4p5
q6r7s8t9u0v1w2x3y4z5A6B7C8D9E0F1G2H3I4J5K6L7M8N9O0P1Q2R3S4
T5U6V7W8X9Y0Z1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3
w4x5y6极
-----END PUBLIC KEY-----`
// 解析公钥字符串
publicKey, err := ParsePublicKeyFromPEM(publicKeyPEM)
if err != nil {
fmt.Printf("解析公钥失败: %v\n", err)
return
}
// 待加密的数据
data := []byte("Hello, RSA加密!")
// 使用公钥加密
ciphertext, err := EncryptWithPublicKey(publicKey, data)
if err != nil {
fmt.Printf("加密失败: %v\n", err)
return
}
fmt.Printf("加密结果: %x\n", ciphertext)
}
```
### 关键点说明
1. **公钥解析**:
- 我们首先将PEM格式的公钥字符串解码,然后尝试解析为PKIX格式的公钥(这是x509标准格式)。如果失败,再尝试解析为PKCS#1格式的公钥。
- 解析后,我们断言公钥类型为`*rsa.PublicKey`。
2. **加密过程**:
- 使用`rsa.EncryptOAEP`函数进行加密,使用SHA256作为哈希函数。
- 在加密前,我们检查数据长度是否超过允许的最大长度(由公钥大小和OAEP填充决定)。如果数据过长,则返回错误。
3. **注意事项**:
- RSA公钥加密通常用于加密对称密钥(如AES密钥),而不是直接加密大量数据,因为RSA加密有长度限制且性能较低。
- 在实际应用中,如果数据较大,应使用对称加密加密数据,再用RSA加密对称密钥。
### 引用说明
- 公钥解析和加密过程参考了Golang标准库的RSA操作[^1]。
- 关于RSA加密的长度限制和填充方案,参考了RSA加密的最佳实践[^3]。
§§相关问题§§
1. 如何用Go实现RSA私钥解密?
2. 如何结合AES和RSA实现大数据加密?
3. 如何处理RSA加密中的填充错误?</think>### Go语言使用RSA公钥字符串加密数据的最佳实践
在Go中使用RSA公钥字符串(PEM格式)加密数据需要经过三个关键步骤:解析公钥字符串、应用OAEP填充方案、执行加密操作。以下是完整实现和最佳实践:
```go
package main
import (
"crypto/rand"
"crypto/rsa"
"crypto/sha256"
"crypto/x509"
"encoding/base64"
"encoding/pem"
"errors"
"fmt"
)
// ParsePublicKeyFromPEM 解析PEM格式的公钥字符串
func ParsePublicKeyFromPEM(pubPEM string) (*rsa.PublicKey, error) {
block, _ := pem.Decode([]byte(pubPEM))
if block == nil {
return nil, errors.New("无法解析PEM块")
}
pub, err := x509.ParsePKIXPublicKey(block.Bytes)
if err != nil {
return nil, fmt.Errorf("解析公钥失败: %w", err)
}
rsaPub, ok := pub.(*rsa.PublicKey)
if !ok {
return nil, errors.New("非RSA公钥类型")
}
return rsaPub, nil
}
// EncryptWithPublicKey 使用RSA公钥加密数据(OAEP填充)
func EncryptWithPublicKey(pubKey *rsa.PublicKey, data []byte) ([]byte, error) {
hash := sha256.New()
maxLen := (pubKey.N.BitLen() + 7) / 8 - 2*hash.Size() - 2
if len(data) > maxLen {
return nil, fmt.Errorf("数据过长(%d > %d),请分段或使用混合加密", len(data), maxLen)
}
return rsa.EncryptOAEP(
hash,
rand.Reader,
pubKey,
data,
nil, // 可选标签
)
}
func main() {
// PEM格式的公钥字符串(示例)
publicKeyPEM := `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu+JY4R5L5z5c5e5W5U5X
5Z5b5d5f5h5j5l5n5p5r5t5v5x5z5A5C5E5G5I5K5M5O5Q5S5U5W5Y5a5c5e5g
5i5k5m5o5q5s5u5w5y5B5D5F5H5J5L5N5P5R5T5V5X5Z5b5d5f5h5j5l5n5p5r
5t5v5x5z5A5C5E5G5I5K5M5O5Q5S5U5W5Y5a5c5e5g5i5k5m5o5q5s5u5w5y5B
5D5F5H5J5L5N5P5R5T5V5X5Z5b5d5f5h5j5l5n5p5r5t5v5x5z5A5C5E5G5I5K
5M5O5Q5S5U5W5Y5a5c5e5g5i5k5m5o5q5s5u5w5y5B5D5F5H5J5L5N5P5R5T5V
5X5Z5b5d5f5h5j5l5n5p5r5t5v5x5z5A5C5E5G5I5K5M5O5Q5S5U5W5Y5a5c5e
5g5i5k5m5o5q5s5u5w5y5B5D5F5H5J5L5N5P5R5T5V5X5Z5b5d5f5h5j5l5n5p
5r5t5v5x5z5A5C5E5G5I5K5M5O5Q5S5U5W5Y5a5c5e5g5i5k5m5o5q5s5u5w5y
5B5D5F5H5J5L5N5P5R5T5V5X5Z5b5d5f5h5j5l5n5p5r5t5v5x5z5A5C5E5G5I
5K5M5O5Q5S5U5W5Y5a5c5e5g5i5k5m5o5q5s5u5w5y5B5D5F5H5J5L5N5P5R5T
5V5X5Z5b5d5f5h5j5l5n5p5r5t5v5x5z5A5C5E5G5I5K5M5O5Q5S5U5W5Y5a5c
5e5g5i5k5m5o5q5s5u5w5y5B5D5F5H5J5L5N5P5R5T5V5X5Z5b5d5f5h5j5l5n
5p5r5t5v5x5z5A5C5E5G5I5K5M5O5Q5S5U5W5Y5a5c5e5g5i5k5m5o5q5s5u5w
5y5B5D5F5H5J5L5N5P5R5T5V5X5Z5b5d5f5h5j5l5n5p5r5t5v5x5z5A5C5E5G
5I5K5M5O5Q5S5U5W5Y5a5c5e5g5i5k5m5o5q5s5u5w5y5B5D5F5H5J5L5N5P5R
5T5V5X5Z5b5d5f5h5j5l5n5p5r5t5v5x5z5A5C5E5G5I5K5M5O5Q5S5U5W5Y5a
5c5e5g5i5k5m5o5q5s5u5w5y5B5D5F5H5J5L5N5P5R5T5V5X5Z5b5d5f5h5j5l
5n5p5r5t5v5x5z5A5C5E5G5I5K5M5O5Q5S5U5W5Y5a5c5e5g5i5k5m5o5q5s5u
5w5y5B5D5F5H5J5L5N5P5R5T5V5X5Z5b5d5f5h5j5l5n5p5r5t5v5x5z5A5C5E
5G5I5K5M5O5Q5S5U5W5Y5a5c5e5g5i5k5m5o5q5s5u5w5y5B5D5F5H5J5L5N5P
5R5T5V5X5Z5b5d5f5h5j5l5n5p5r5t5v5x5z5A5C5E5G5I5K5M5O5Q5S5U5W5Y
5a5c5e5g5i5k5m5o5q5s5u5w5y5B5D5F5H5J5L5N5P5R5T5V5X5Z5b5d5f5h5j
5l5n5p5r5t5v5x5z5A5C5E5G5I5K5M5O5Q5S5U5W5Y5a5c5e5g5i5k5m5o5q5s
5u5w5y5B5D5F5H5J5L5N5P5R5T5V5X5Z5b5d5f5h5j5l5n5p5r5t5v5x5z5A5C
5E5G5I5K5M5O5Q5S5U5W5Y5a5c5e5g5i5k5m5o5q5s5u5w5y5B5D5F5H5J5L5N
5P5R5T5V5X5Z5b5d5f5h5j5l5n5p5r5t5v5x5z5A5C5E5G5I5K5M5O5Q5S5U5W
5Y5a5c5e5g5i5k5m5o5q5s5u5w5y5B5D5F5H5J5L5N5P5R5T5V5X5Z5b5d5f5h
5j5l5n5p5r5t5v5x5z5A5C5E5G5I5K5M5O5Q5S5U5W5Y5a5c5e5g5i5k5m5o5q
5s5u5w5y5B5D5F5H5J5L5N5P5R5T5V5X5Z5b5d5f5h5j5l5n5p5r5t5v5x5z5A
5C5E5G5I5K5M5O5Q5S5U5W5Y5a5c5e5g5i5k5m5o5q5s5u5w5y5B5D5F5H5J5L
5N5P5R5T5V5X5Z5b5d5f5h5j5l5n5p5r5t5v5x5z5A5C5E5G5I5K5M5O5Q5S5U
5W5Y5a5c5e5g5i5k5m5o5q5s5u5w5y5B5D5F5H5J5L5N5P5R5T5V5X5Z5b5d5f
5h5j5l5n5p5r5t5v5x5z5A5C5E5G5I5K5M5O5Q5S5U5W5Y5a5c5e5g5i5k5m5o
5q5s5u5w5y5B5D5F5H5J5L5N5P5R5T5V5X5Z5b5d5f5h5j5l5n5p5r5t5v5x5z
5A5C5E5G5I5K5M5O5Q5S5U5W5Y5a5c5e5g5i5k5m5o5q5s5u5w5y5B5D5F5H5J
5L5N5P5R5T5V5X5Z5b5d5f5h5j5l5n5p5r5t5v5x5z5A5C5E5G5I5K5M5O5Q5S
5U5W5Y5a5c5e5g5i5k5m5o5q5s5u5w5y5B5D5F5H5J5L5N5P5R5T5V5X5Z5b5d
5f5h5j5l5n5p5r5t5v5x5z5A5C5E5G5I5K5M5O5Q5S5U5W5Y5a5c5e5g5i5k5m
5o5q5s5u5w5y5B5D5F5H5J5L5N5P5R5T5V5X5Z5b5d5f5h5j5l5n5p5r5t5v5x
5z5A5C5E5G5I5K5M5O5Q5S5U5W5Y5a5c5e5g5i5k5m5o5q5s5u5w5y5B5D5F5H
5J5L5N5P5R5T5V5X5Z5b5d5f5h5j5l5n5p5r5t5v5x5z5A5C5E5G5I5K5M5O5Q
5S5U5W5Y5a5c5e5g5i5k5m5o5q5s5u5w5y5B5D5F5H5J5L5N5P5R5T5V5X5Z5b
5d5f5h5j5l5n5p5r5t5v5x5z5A5C5E5G5I5K5M5O5Q5S5U5W5Y5a5c5e5g5i5k
5m5o5q5s5u5w5y5B5D5F5H5J5L5N5P5R5T5V5X5Z5b5d5f5h5j5l5n5p5r5t5v
5x5z5A5C5E5G5I5K5M5O5Q5S5U5W5Y5a5c5e5g5i5k5m5o5q5s5u5w5y5B5D5F
5H5J5L5N5P5R5T5V5X5Z5b5d5f5h5j5l5n5p5r5t5v5x5z5A5C5E5G5I5K5M5O
5Q5S5U5W5Y5a5c5e5g5i5k5m5o5q5s5u5w5y5B5D5F5H5J5L5N5P5R5T5V5X5Z
5b5d5f5h5j5l5n5p5r5t5v5x5z5A5C5E5G5I5K5M5O5Q5S5U5W5Y5a5c5e5g5i
5k5m5o5q5s5u5w5y5B5D5F5H5J5L5N5P5R5T5V5X5Z5b5d5f5h5j5l5n5p5r5t
5v5x5z5A5C5E5G5I5K5M5O5Q5S5U5W5Y5a5c5e5g5i5k5m5o5q5s5u5w5y5B5D
5F5H5J5L5N5P5R5T5V5X5Z5b5d5f5h5j5l5n5p5r5t5v5x5z5A5C5E5G5I5K5M
5O5Q5S5U5W5Y5a5c5e5g5i5k5m5o5q5s5u5w5y5B5D5F5H5J5L5N5P5R5T5V5X
5Z5b5d5f5h5j5l5n5p5r5t5v5x5z5A5C5E5G5I5K5M5O5Q5S5U5W5Y5a5c5e5g
5i5k5m5o5q5s5u5w5y5B5D5F5H5J5L5N5P5R5T5V5X5Z5b5d5f5h5j5l5n5p5r
5t5v5x5z5A5C5E5G5I5K5M5O5Q5S5U5W5Y5a5c5e5g5i5k5m5o5q5s5u5w5y5B
5D5F5H5J5L5N5P5R5T5V5X5Z5b5d5f5h5j5l5n5p5r5t5v5x5z5A5C5E5G5I5K
5M5O5Q5S5U5W5Y5a5c5e5g5i5k5m5o5q5s5u5w5y5B5D5F5H5J5L5N5P5R5T5V
5X5Z5b5d5f5h5j5l5n5p5r5t5v5x5z5A5C5E5G5I5K5M5O5Q5S5U5W5Y5a5c5e
5g5i5k5m5o5q5s5u5w5y5B5D5F5H5J5L5N5P5R5T5V5X5Z5b5d5f5h5j5l5n5p
5r5t5v5x5z5A5C5E5G5I5K5M5O5Q5S5U5W5Y5a5c5e5g5i5k5m5o5q5s5u5w5y
5B5D5F5H5J5L5N5P5R5T5V5X5Z5b5d5f5h5j5l5n5p5r5t5v5x5z5A5C5E5G5I
5K5M5O5Q5S5U5W5Y5a5c5e5g5i5k5m5o5q5s5u5w5y5B5D5F5H5J5L5N5P5R5T
5V5X5Z5b5d5f5h5j5l5n5p5r5t5v5x5z5A5C5E5G5I5K5M5O5Q5S5U5W5Y5a5c
5e5g5i5k5m5o5q5s5u5w5y5B5D5F5H5J5L5N5P5R5T5V5X5Z5b5d5f5h5j5l5n
5p5r5t5v5x5z5A5C5E5G5I5K5M5O5Q5S5U5W5Y5a5c5e5g5i5k5m5o5q5s5u5w
5y5B5D5F5H5J5L5N5P5R5T5V5X5Z5b5d5f5h5j5l5n5p5r5t5v5x5z5A5C5E5G
5I5K5M5O5Q5S5U5W5Y5a5c5e5g5i5k5m5o5q5s5u5w5y5B5D5F5H5J5L5极
-----END PUBLIC KEY-----`
// 1. 解析公钥字符串
publicKey, err := ParsePublicKeyFromPEM(publicKeyPEM)
if err != nil {
panic(fmt.Sprintf("解析公钥失败: %v", err))
}
// 2. 准备加密数据
data := []byte("敏感数据@123! 需要安全传输")
// 3. 使用公钥加密
ciphertext, err := EncryptWithPublicKey(publicKey, data)
if err != nil {
panic(fmt.Sprintf("加密失败: %v", err))
}
// 输出Base64编码结果(便于传输)
fmt.Printf("加密结果: %s\n", base64.StdEncoding.EncodeToString(ciphertext))
}
```
---
### 关键安全实践
1. **填充方案选择**:
- 必须使用OAEP填充(`rsa.EncryptOAEP`)而非PKCS#1 v1.5,因为OAEP提供更强的安全性[^1]
- OAEP的数学安全性:
$$ \text{OAEP}(m) = (m \oplus G(r) \parallel H(m \oplus G(r)) \oplus r) $$
其中$G$和$H$为哈希函数,$r$为随机数
2. **数据长度限制**:
- RSA加密有严格长度限制:`maxLen = (keySize/8) - 2*hashLen - 2`
- 对于2048位密钥和SHA-256,最大加密数据为:
$$ \frac{2048}{8} - 2 \times 32 - 2 = 256 - 64 - 2 = 190\text{字节} $$
3. **大文件加密方案**:
```mermaid
graph LR
A[原始数据] --> B[AES加密]
C[AES密钥] --> D[RSA加密]
D --> E[传输加密数据]
B --> E
```
4. **密钥管理安全**:
- 公钥应通过HTTPS分发
- 使用证书固定(Certificate Pinning)防止中间人攻击
- 定期轮换密钥(推荐每1-2年)
---
### 处理超长数据的混合加密方案
当数据超过RSA加密限制时,应使用AES+RSA混合加密:
```go
func HybridEncrypt(pubKey *rsa.PublicKey, data []byte) ([]byte, error) {
// 1. 生成随机AES密钥
aesKey := make([]byte, 32) // AES-256
if _, err := rand.Read(aesKey); err != nil {
return nil, err
}
// 2. 用AES加密数据
ciphertext, err := aesGCMEncrypt(aesKey, data)
if err != nil {
return nil, err
}
// 3. 用RSA加密AES密钥
encryptedKey, err := EncryptWithPublicKey(pubKey, aesKey)
if err != nil {
return nil, err
}
// 4. 组合结果: RSA加密密钥 + AES加密数据
result := append(encryptedKey, ciphertext...)
return result, nil
}
```
---
### 常见问题解决
1. **`crypto/rsa: message too long`错误**:
- 原因:数据超过OAEP最大长度
- 解决方案:
- 使用混合加密方案
- 分段加密(不推荐,性能差)
2. **密钥格式错误**:
- PEM格式必须包含正确的头尾标记
- 支持两种公钥格式:
- PKCS#1: `-----BEGIN RSA PUBLIC KEY-----`
- PKIX: `-----BEGIN PUBLIC KEY-----`
3. **线程安全性**:
- Go的`crypto/rsa`是线程安全的
- 避免全局重用`rsa.PublicKey`实例(定期刷新)
---
### 性能优化建议
$$ \text{加密时间} \propto \frac{\text{密钥长度}^2}{\text{CPU频率}} $$
| 操作 | 2048位密钥 | 4096位密钥 |
|---------------|------------|------------|
| 加密小数据 | ~0.5ms | ~2ms |
| 解密操作 | ~5ms | ~20ms |
- 推荐密钥长度:2048位(安全与性能平衡)
- 大数据场景:始终使用混合加密
> **最佳实践**:对于微服务通信,优先使用TLS传输层加密,而非应用层RSA加密[^3]。