Número de bits de computação na chave pública

0

Eu estou trabalhando com DKIM e tentando calcular o tamanho da chave pública de algumas assinaturas DKIM. Eu sei de ferramentas que o Gmail é agora 2048, mas como eu poderia ter descoberto isso sozinho (ou seja, quais comandos exatos do Linux e por quê)?

user@host$ dig txt 20120113._domainkey.gmail.com

; <<>> DiG 9.8.3-P1 <<>> txt 20120113._domainkey.gmail.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52228
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;20120113._domainkey.gmail.com. IN  TXT

;; ANSWER SECTION:
20120113._domainkey.gmail.com. 300 IN   TXT "k=rsa\; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1Kd87/UeJjenpabgbFwh+eBCsSTrqmwIYYvywlbhbqoo2DymndFkbjOVIPIldNs/m40KF+yzMn1skyoxcTUGCQs8g3FgD2Ap3ZB5DekAo5wMmk4wimDO+U8QzI3SD0" "7y2+07wlNWwIt8svnxgdxGkVbbhzY8i+RQ9DpSVpPbF7ykQxtKXkv/ahW3KjViiAH+ghvvIhkx4xYSIc9oSwVmAl5OctMEeWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598HY+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB"

;; Query time: 262 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Mon Nov 19 10:52:06 2012
;; MSG SIZE  rcvd: 462
eb80
fonte
A chave pública pode ser encontrada codificada em base64 depois de "p =".
Robert

Respostas:

3

1) Recorte o objeto de chave pública codificado em base64:

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1Kd87 / UeJjenpabgbFwh + eBCsSTrqmwIYYvywlbhbqoo2DymndFkbjOVIPIldNs / m40KF + yzMn1skyoxcTUGCQs8g3FgD2Ap3ZB5DekAo5wMmk4wimDO + U8QzI3SD07y2 + 07wlNWwIt8svnxgdxGkVbbhzY8i + RQ9DpSVpPbF7ykQxtKXkv / ahW3KjViiAH + ghvvIhkx4xYSIc9oSwVmAl5OctMEeWUwg8Istjqz8BZeTWbf41fbNhte7Y + YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598HY + vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY / wIDAQAB

2) Base64 decodifica e ASN1 analisa:

$ cat base64-in.txt | base64 -d | openssl asn1parse -inform der
0: d = 0 hl = 4 l = 290 contras: SEQUENCE
4: d = 1 hl = 2 l = 13 contras: SEQUENCE
6: d = 2 hl = 2 l = 9 prim: OBJECT: rsaEncryption
17: d = 2 hl = 2 l = 0 prim: NULL
19: d = 1 hl = 4 l = 271 prim: BIT STRING

3) Observe que o BIT STRING é 4 + 2 + 13 + 9 = 28 bytes na estrutura.

4) Analise a cadeia de bits:

$ cat base64-in.txt | base64 -d | openssl asn1parse -informa der -offset 28
0: d = 0 hl = 4 l = 257 prim: INTEGER: D 4A77CEFF51E2637A7A5A6E06 ...
261: d = 0 hl = 2 l = 3 prim: INTEGER: 010001

5) Observe que a chave é 257 bytes. Mas começa com um D (alto bit set), então o byte inicial tem que ser um zero para mostrar que é positivo. Portanto, ele contém 256 bytes não assinados ou 2.048 bits.

David Schwartz
fonte