字符串前加r、f、u、l 的区别

本文深入讲解了Python 3.6及以上版本中f-strings的使用方法,包括基本的值替换功能,如何防止字符串转义,以及如何处理unicode字符串。通过实例展示了f-strings的灵活性和强大功能。
部署运行你感兴趣的模型镜像

f-strings 是指以 f 或 F 开头的字符串,其中以 {} 包含的表达式会进行值替换。(目前支持python3.6版本)

下面看下 f-strings 的使用方法

基本使用(作用:替换值)

>>>name = 'hoxis'
>>> age = 18
>>> f"hi, {name}, are you {age}"
#结果如下
'hi, hoxis, are you 18'
>>> F"hi, {name}, are you {age}"
'hi, hoxis, are you 18'

在字符串前加r可防止字符串转义

        作用:没有转义特殊或不能打印的字符。


>>> s='abc\nabc'
>>> s
'abc\nabc'
>>> print s
abc
abc
>>> s=r'abc\nabc'
>>> s
'abc\\nabc'
>>> print s
abc\nabc

u/U:表示unicode字符串 
不是仅仅是针对中文, 可以针对任何的字符串,代表是对字符串进行unicode编码。 
一般英文字符在使用各种编码下, 基本都可以正常解析, 所以一般不带u;但是中文, 必须表明所需编码, 否则一旦编码转换就会出现乱码。 建议所有编码方式采用utf8

字符串前加 “l”

表示宽字符,unicode字符( unicode字符集是两个字节组成的。L告示编译器使用两个字节的 unicode 字符集) 如  L"我的字符串"    表示将ANSI字符串转换成unicode的字符串,就是每个字符占用两个字节。
 

不加时占用字节
strlen("asd")   =   3;   


加之后占用字节
strlen(L"asd")   =   6;

 

您可能感兴趣的与本文相关的镜像

EmotiVoice

EmotiVoice

AI应用

EmotiVoice是由网易有道AI算法团队开源的一块国产TTS语音合成引擎,支持中英文双语,包含2000多种不同的音色,以及特色的情感合成功能,支持合成包含快乐、兴奋、悲伤、愤怒等广泛情感的语音。

<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]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值