rsa加密必须使用encryptpkcs1v15或encryptoaep,禁用裸运算;前者兼容好但有bleichenbacher风险,仅限可信通道;后者为现代推荐,需指定哈希与label;明文长度受填充限制,长数据应采用rsa+aes混合加密;公钥须为pkix格式,私钥解密须严格匹配加密时的填充方式、哈希及label。

公钥加密必须用 rsa.EncryptPKCS1v15 或 rsa.EncryptOAEP
Go 标准库不提供“裸 RSA”(即直接 m^e mod n)的加密接口,这是刻意设计的安全限制。你不能把明文直接喂给私钥/公钥结构体去算——所有合法加密都必须走带填充的封装函数。
实际选哪个?
-
rsa.EncryptPKCS1v15兼容性最好,老系统、JS 前端(如 Web Crypto API)、PHP 都认它;但已被证明在某些主动攻击下存在风险(比如 Bleichenbacher 攻击),**仅限内部可信通道或短生命周期数据** -
rsa.EncryptOAEP是现代推荐方案,带随机盐、抗选择密文攻击;但要求你传入哈希算法(如sha256.New)和可选标签(label),稍啰嗦;新项目默认用它 - 别碰
rsa.EncryptPKCS1v15的“签名模式”变体(如SignPKCS1v15),那是给签名用的,加密会 panic
明文长度超限:不是 bug,是 RSA 数学硬约束
RSA 加密前会做填充,所以能塞进去的原始字节数远小于密钥长度。例如 2048 位密钥(256 字节),用 EncryptPKCS1v15 最多只能加密 214 字节;用 EncryptOAEP(SHA256)则只剩 190 字节左右。超过就报错:crypto/rsa: message too long for RSA public key size。
Go语言(Golang)1.26.0版本提供 Go 官方 Windows amd64 MSI 安装包下载入口,版本号 1.26.0,可用于旧项目维护、兼容性测试和指定版本开发环境配置。
- 这不是 Go 实现问题,是所有符合 PKCS#1 的 RSA 库共性
- 真要加密长数据(比如 JSON 配置、用户 token),**不要硬分段**——RSA 分段加解密极易出错且无标准做法
- 正确姿势:用 RSA 加密一个随机 AES 密钥,再用这个 AES 密钥加密实际数据(即混合加密)。Go 的
crypto/aes+crypto/cipher配合起来很轻量
公钥加载失败?大概率是 PEM 格式或 ASN.1 结构不对
Go 的 crypto/x509 要求公钥必须是 PEM 编码的 PKIXPublicKey(即 -----BEGIN PUBLIC KEY-----),而不是老式的 -----BEGIN RSA PUBLIC KEY-----(PKCS#1 格式)。后者常见于 OpenSSL 直接导出,但 Go x509.ParsePKIXPublicKey 会直接返回 asn1: structure error。
- 快速验证:用
openssl rsa -in rsa_public_key.pem -pubin -text -noout看输出里有没有 “RSA Public-Key” 字样 —— 有就是 PKCS#1,需转格式 - 转换命令:
openssl rsa -in rsa_private_key.pem -pubout -out public_key.pem(这会输出 PKIX 格式) - 代码里别用
ParsePKCS1PublicKey——它已 deprecated,且只接受 PKCS#1,兼容性差
私钥解密时 panic: crypto/rsa: decryption failed?检查填充方式是否严格匹配
加密用了 EncryptPKCS1v15,解密就必须用 DecryptPKCS1v15;用了 EncryptOAEP,解密就得配同一种哈希(比如 sha256.New)和 label。哪怕 label 是空字符串 "",也必须一致,否则直接 panic,错误信息就一句 decryption failed,没更多线索。
- 最常踩的坑:前端用 Web Crypto 的
encrypt({name: 'RSA-OAEP', hash: 'SHA-256'}, ...),后端 Go 却传了sha512.New()—— 解密必挂 - 私钥本身如果是 PKCS#8 格式(常见于 Java 生成),要用
x509.ParsePKCS8PrivateKey,而不是ParsePKCS1PrivateKey,否则解析成功但解密时 panic - 别在生产环境用
rand.Reader以外的随机源——DecryptOAEP内部依赖随机性防侧信道,自定义io.Reader可能引入漏洞
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










