encryption - 更改私钥中的几个字符是否应该有意义地更改它?
问题描述
所以我们有一个用于签署请求的私钥,这些请求稍后会使用公钥解密。我在弄乱它并替换了其中的几个字符,例如将“wnoy”更改为“xxyy”
我怀疑这会从根本上改变密钥,从而导致解密失败,但事实并非如此。更改是否太小而无法对密钥进行有意义的更改?
谢谢!
解决方案
计算期间使用的模数、指数或 CRT 参数的任何更改都将导致算法无法生成正确的签名或解密期间失败(很可能会产生填充错误)。
但是,由于 RSA 私钥不仅仅是一个数字,它通常保存在 PKCS#1 定义的 ASN.1 / DER 编码结构中。现在,如果私钥损坏得足够多,这取决于您对该结构的更改。这种结构的编码(如果是 PEM 私钥)也可能起作用。
您很可能在计算中使用 RSA CRT 参数时更改了公共或私有指数(私有指数或 CRT 参数用于计算)。在这种情况下,计算将照常进行。您将有大约 256 个字节可以更改而不会导致 2048 位密钥出现问题。
较慢的“普通”RSA 计算使用私有指数,这意味着对 CRT 参数的任何更改都不会被注意到(除非结构不再解析)。对于 2048 位密钥,您很可能有超过 5 x 128 字节可以更改而不会造成问题!
从 PKCS#1:
RSAPrivateKey ::= SEQUENCE {
version Version,
modulus INTEGER, -- n
publicExponent INTEGER, -- e
privateExponent INTEGER, -- d
prime1 INTEGER, -- p
prime2 INTEGER, -- q
exponent1 INTEGER, -- d mod (p-1)
exponent2 INTEGER, -- d mod (q-1)
coefficient INTEGER, -- (inverse of q) mod p
otherPrimeInfos OtherPrimeInfos OPTIONAL
}
这里的CRT(中国剩余定理)参数是prime1,prime2,exponent1,exponent2,最后是系数参数。
推荐阅读
- python - 用于比较两个 NumPy 数组的元素广播?
- asp.net - 捆绑 asp 网络图像(在供应商中)404
- java - 如何使用带有 Spring JDBC 的 MERGE 语句插入/更新单个记录
- centos - /dev/mapper/centos_server2-root 已满
- logstash - Logstash 指纹过滤器不起作用
- javascript - JS。setInterval 不会增加外部范围内变量的值
- asp.net - 将实例的属性附加到 URL 路径 asp.net 的路由配置
- spring - Spring Jpa findBy 方法来获取最佳结果
- javascript - 手机上的签名板。从光标沿 X 和 Y 轴绘制几厘米的距离
- elasticsearch - 请求字符串和数字字段时的 Elasticsearch java.lang.NumberFormatExcepion