我有几个问题:
我们称RSA密钥的大小是多少?产品的大小pq? 1024位RSA密钥意味着二进制中n = pq的表示恰好需要1024位或至少1024位?
当我生成一个长度的密钥时,让我们说,1024位,其他参数的大小是多少,例如d和e私有和公共指数?
如何从DER或PEM格式中知道密钥的大小以及如何分隔每个参数?
什么是"版本"它有什么可能的价值?
答案 0 :(得分:3)
我们称RSA密钥的大小是多少?产品的大小pq? 1024位RSA密钥意味着二进制中n = pq的表示恰好需要1024位或至少1024位?
恰好1024位。如果我们使用默认网络顺序(即大端)表示,那么无符号数的第一位应该是1
。这也意味着当在ASN.1 / DER中编码时,模数总是多一个字节,因为ASN.1假定有符号数。
当我生成长度的密钥时,让我们说,1024位,其他参数的大小是多少,例如d和e - 私有和公共指数?
d
通常接近模数的大小,并且总是更小。但原则上任何数量的0
位都可以处于最重要的位置,因此它理论上可以是任何大小。 d
的较小值虽然不太可能,但如果将多个字节设置为零(因此在例如ASN.1中编号中丢失),则不会感到惊讶。 / DER)。
e
原则上与d
具有相同的属性,但在密钥对计算过程中通常设置为较小的值。这通常意味着它具有十六进制值010001
或65537,即第四个费马素数(OpenSSL中的F4)。这加速了加密和验证公钥操作。
如何从DER或PEM格式中知道密钥的大小以及如何分隔每个参数?
您必须阅读PKCS#1标准和ASN.1规范。数字在DER编码的ASN.1 INTEGER值中指定。 DER使用大端数字,因此它将是:
TT (LL LL ...) VV VV ...
现在标记TT
将设置为值02
,只是意味着INTEGER。
LL LL ...
用于表示长度。要么只是80
之前的单个字节,它直接指定VV VV ...
中存储的值的大小,或者设置为8x LL LL ...
,其中x
是<{1}}的数量接下来是em> length 字节。 8x LL LL ...
只是一个无符号的大端数字,表示VV VV ...
的大小。
VV VV ...
是签名的大端值。
所以02 03 01 00 01
通常是公共指数。 02 81 00 YY XX XX ...
是128个字节的模数,前面是00
个字节,使其成为无符号的两个补码数。 128字节显然意味着密钥大小为1024位。 YY
始终为80
或更高,否则密钥大小将小于1024位。
这些参数只是X509密钥或证书规范的一部分,这是一个更大的结构。 PEM基本上由一个标题行,底脚线64与基线64(线路尺寸有限)组成。这些基本64个字符是包含公钥的证书的BER或DER编码。
不幸的是我无法在这里解释X509证书格式,您必须阅读规范(RFC)。
什么是&#34;版本&#34;它的可能价值是什么?
通常是X509 证书&amp;证书请求版本,当前设置为3。
版本也可以指向RSA规范的版本。在这种情况下,旧签名/加密格式通常为v1.5,PSS / OAEP 填充方法为v2.1 。