软件发布包签名
独立开发者凌晨发布客户端 2.0 更新包,用本工具生成 2048 位 RSA 密钥对,对安装包哈希值签名。用户下载后,用公钥验签确认包未被篡改或植入后门。之前有竞品安装包被劫持替换,用户安装后报毒,开发者背锅。现在签名后,验证通过即证明来源可信,减少因渠道污染引发的信任危机。
BEGIN PUBLIC KEY),私钥 PEM 用 PKCS#8(BEGIN PRIVATE KEY)。对方发来一段密文和公钥,想确认身份,但手边没有 OpenSSL。这个工具直接在浏览器里完成 RSA 公钥加密、私钥解密、签名与验签——密钥对可粘贴或生成,签名结果附带原文哈希。所有运算在本地执行,不上传私钥或明文,适合开发调试、接口联调时快速验证加解密逻辑。
独立开发者凌晨发布客户端 2.0 更新包,用本工具生成 2048 位 RSA 密钥对,对安装包哈希值签名。用户下载后,用公钥验签确认包未被篡改或植入后门。之前有竞品安装包被劫持替换,用户安装后报毒,开发者背锅。现在签名后,验证通过即证明来源可信,减少因渠道污染引发的信任危机。
后端工程师给第三方支付回调接口加签名校验:回调参数拼接后,用私钥签名生成签名字段。第三方收到回调后,用公钥验签,只有签名通过才执行发货逻辑。之前没签名,被黑产重放请求刷了 300 单虚拟商品。现在每次回调签名不同,重放请求验签失败,直接拦截。
运维工程师需要将数据库连接串(含密码)发给新入职的同事。直接明文发微信有泄露风险。用本工具的公钥加密配置文件,只有持有对应私钥的同事能解密。即使聊天记录被截获,攻击者没有私钥也无法还原密码。之前有人截图发群里,密码被离职员工看到,数据库被删表勒索。
三人创业团队用微信群沟通产品规划,但群里混进了一个竞品卧底。他们约定:每次发核心需求前,用本工具将文字加密成密文发群里,只有持有私钥的两人能解密。卧底看到密文无法还原内容。之前有次功能排期被对手提前上线,损失两周窗口期。现在加密后,核心信息不再裸奔。
| 输入 | 输出 | 说明 |
|---|---|---|
| 公钥加密:明文 = "hello", 公钥 = 2048-bit RSA 公钥(PEM格式) | 密文(Base64编码):"gH7...(64字符)..." | 常规:验证基本加密流程,输出为Base64编码的密文字节 |
| 私钥解密:密文 = 上一步输出的Base64字符串, 私钥 = 对应私钥(PEM格式) | 明文:"hello" | 常规:验证加解密闭环,输出与原始明文一致 |
| 签名:消息 = "message", 私钥 = 2048-bit RSA 私钥(PEM格式) | 签名(Base64编码):"aB3...(86字符)..." | 常规:验证签名生成,输出为Base64编码的签名值 |
| 验签:消息 = "message", 签名 = 上一步输出的Base64字符串, 公钥 = 对应公钥(PEM格式) | 验证通过:true | 常规:验证签名验签闭环,输出布尔值表示签名是否有效 |
| 公钥加密:明文 = ""(空字符串), 公钥 = 2048-bit RSA 公钥 | 密文(Base64编码):"..."(非空,长度约86字符) | 边界:空字符串作为输入,RSA加密仍会输出非空密文(因填充机制) |
| 私钥解密:密文 = 一个无效的Base64字符串 "invalid!!", 私钥 = 合法私钥 | 错误:"Base64解码失败:输入不是有效的Base64字符串" | 边界:非法密文格式导致解密失败,暴露工具对输入格式的校验 |
| 公钥加密:明文 = "A" × 246 字符(超过2048-bit RSA单次加密最大长度245字节) | 错误:"明文长度超过最大限制(245字节),请分段加密或使用更长的密钥" | 易错:RSA单次加密有明文长度限制(密钥位数/8 - 填充开销),用户常忽略此限制 |
| 验签:消息 = "message", 签名 = 上一步合法签名但消息改为 "message2", 公钥 = 对应公钥 | 验证通过:false | 易错:签名与消息不匹配时验签失败,验证签名对消息完整性的保护作用 |
1.公钥加密时混入私钥格式的 PEM 头尾
-----BEGIN RSA PRIVATE KEY-----
MIICWw...
-----END RSA PRIVATE KEY----------BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQ...
-----END PUBLIC KEY-----加密操作只接受公钥(PUBLIC KEY 或 RSA PUBLIC KEY),传入私钥会导致解析失败,因为 OpenSSL 的 EVP_PKEY 类型不匹配。
2.签名结果未做 Base64 编码直接输出二进制
原始签名字节流(如 \x30\x45\x02\x21...)Base64 编码后的字符串,如 MEUCIQCo5Y...RSA 签名输出是 DER 编码的二进制,直接显示或传输会乱码。标准做法是 Base64 编码(RFC 4648),验签时再解码。
3.私钥解密时用了公钥
解密输入框里粘贴公钥(-----BEGIN PUBLIC KEY-----)解密输入框里粘贴对应的私钥(-----BEGIN RSA PRIVATE KEY-----)RSA 非对称性决定:公钥加密只能用私钥解密。用公钥解密会报 padding 错误或返回乱码,因为私钥才持有 d 参数。
4.明文长度超过密钥模长(未分段加密)
用 1024 位密钥加密 200 字节的明文用 2048 位密钥加密,或分段加密(每段 ≤ 117 字节)RSA 一次加密的明文上限 = 密钥位数/8 - 11(PKCS#1 v1.5 padding)。1024 位最多 117 字节,超长会报 'data too large for key size'。
5.签名时使用相同的密钥对做加解密而非签名验签
用加密函数(RSA_public_encrypt)代替签名函数(RSA_sign)调用专门的签名接口(如 OpenSSL 的 RSA_sign 或 sign 方法)加密和签名虽然都用私钥操作,但内部填充方式不同:加密用 PKCS#1 OAEP 或 v1.5 加密填充,签名用 PKCS#1 v1.5 签名填充或 PSS。混用会导致验签失败。
6.PKCS#1 格式密钥与 SPKI 格式混淆
将 -----BEGIN RSA PRIVATE KEY----- 的密钥直接用于需要 -----BEGIN PRIVATE KEY----- 的接口确认工具要求的格式:传统格式(RSA PRIVATE KEY)或 PKCS#8 格式(PRIVATE KEY)前者是 OpenSSL 传统格式(仅含 RSA 参数),后者是 PKCS#8 标准格式(含算法标识)。不匹配时解析会报 'no start line' 或 'bad decrypt'。
7.验签时未指定与签名相同的哈希算法
签名时用 SHA-256,验签时默认 SHA-1验签时明确选择 SHA-256(与签名算法一致)RSA 签名本质是对明文的哈希值做签名。哈希算法不一致时,验签会失败(signature mismatch),即使密钥对正确。
8.复制密钥时遗漏了换行或多余空格
-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQ...-----END PUBLIC KEY-----保持原始 PEM 格式,每行 64 字符,头尾各占一行PEM 格式依赖换行符分割头尾和内容体。连成一行会被解析器视为无效 Base64,报 'unable to load key'。
c = m^e mod n
m明文,整数且小于 ne公钥指数,通常为 65537n模数,两个大素数乘积c密文,整数结果取 p=61, q=53, n=61×53=3233, e=17, 明文 m=1234。加密:c = 1234^17 mod 3233。计算 1234^2=1522756, 1522756 mod 3233=1522756-3233×471=1522756-1522743=13,反复平方模乘得 c=855。密文 855 对应明文 1234。
所有计算都在浏览器本地完成,密钥和明文不会离开当前设备。页面实现方式标注为 FE(前端),意味着加解密逻辑是用 JavaScript 直接在浏览器里执行的,没有向服务器发送任何数据。断网刷新后页面仍然可用,也印证了这一点。如果担心隐私,可以生成密钥对后先加密一段敏感文本,再断开网络试试解密是否正常。
本工具不内置密钥生成功能,需要自己准备一对 RSA 密钥。常见做法:用 OpenSSL 命令行(`openssl genrsa -out private.pem 2048` 生成私钥,`openssl rsa -in private.pem -pubout -out public.pem` 提取公钥),或用 PuTTYgen、在线密钥生成器(注意安全)获取。拿到 PEM 格式的密钥文本后,直接粘贴到对应输入框即可使用。
最常见的原因是密钥包含多余的换行或空格,尤其是从网页或邮件复制时。RSA 私钥的 PEM 格式要求以 `-----BEGIN RSA PRIVATE KEY-----` 开头,以 `-----END RSA PRIVATE KEY-----` 结尾,中间每行 64 个字符。检查开头结尾是否有不可见字符;如果密钥是从 Windows 记事本复制,可能换行符是 CRLF,尝试用文本编辑器转为 LF 再粘贴。另外,确认密钥是 PKCS#1 格式,本工具暂不支持 PKCS#8。
不能。RSA 的核心原理是公钥加密、私钥解密,两者是数学上配对的。用公钥加密的数据,只有对应的私钥才能解开,即使攻击者知道公钥也毫无办法。这也是 RSA 用于安全通信的基础——把公钥公开给任何人,对方用公钥加密消息后,只有持有私钥的人能读取。如果发现解密失败,请确认使用的私钥与加密所用的公钥是同一对。
加密是保护数据机密性:用公钥加密,只有私钥能看。签名是验证数据完整性和身份:用私钥签名,任何人用公钥验签。举例:给同事发机密文件用加密;发布软件更新包用签名,用户下载后用公钥验签确认包没有被篡改且确实来自开发者。本工具两个功能都有,加密/解密用左侧选项卡,签名/验签用右侧选项卡,注意不要混淆密钥的使用方向。
RSA 有明文长度限制,取决于密钥位数和填充方式。以常用的 2048 位密钥配合 PKCS#1 v1.5 填充为例,一次最多加密 190 字节(2048/8 - 11 = 245 - 11 = 234,实际上 PKCS#1 v1.5 最多 245 字节减去 11 字节填充,但部分实现有差异,安全起见建议不超过 190 字节)。如果文本超出限制,需要分段加密,或者改用 AES 等对称加密算法。本工具对超长输入会直接报错,不会静默截断。
签名结果是二进制数据,直接显示为乱码是正常的。本工具默认以 Base64 编码输出签名,方便复制和传输。验签时,需要把 Base64 字符串完整粘贴到验签输入框,并确保选择了相同的哈希算法(如 SHA-256)。如果签名方和验签方用的哈希算法不一致,验签会失败。另外,验签时输入的原文必须与签名时完全一致,包括空格和换行。
只要私钥文件没有丢失就可以。RSA 密钥对是独立于设备的,私钥就是一个文本文件(PEM 格式),复制到新电脑上,用同样的私钥就能解密。建议将私钥保存在安全的地方,比如加密的 U 盘或密码管理器。如果私钥丢失,用任何手段都无法恢复加密数据,这是 RSA 的设计特性,也是它安全的原因。
隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。