El formato PuTTY para un blob de clave privada RSA SSH2 es dlen||d||plen||p||qlen||q||ulen||iqmp
. Los valores dlen
, plen
, qlen
y ulen
son la longitud en bytes de d
, p
, q
y iqmp
, respectivamente; la longitud se expresa como int
, por lo que cada uno de los cuatro marcadores de longitud ocupa 4 bytes. Los cuatro elementos clave almacenados son, respectivamente, la clave de descifrado d
, los factores primos p
y q
, y el valor de q^(-1) mod p
; los últimos 3 no son técnicamente necesarios, pero aceleran significativamente las operaciones RSA.
En su clave, d
es de 256 bits (32 bytes), p
y q
son cada uno de 17 bytes, y iqmp
también es de 17 bytes. Las longitudes de 17 bytes de p
, q
y iqmp
son artefactos del método de redondeo un tanto extraño utilizado; para calcular bitlen(p)/8
redondeado al byte más cercano, la fuente PuTTY calcula (bitlen(p)+8)/8
. Si p
tiene exactamente una longitud de 128 bits, entonces (128+8)/8=17
es el valor de plen
, aunque p
se ajusta perfectamente a 16 bytes. Del mismo modo, para q
y iqmp
, los valores son en realidad exactamente 128 bits, pero el redondeo impar los convierte en valores de 17 bytes. No hay ninguna consecuencia de seguridad de ninguna manera, que yo sepa; habría tenido más sentido agregar 7 bits y la división de enteros entre 8, pero lo hicieron de la forma en que lo hicieron, y no pueden cambiarlo ahora.
De todos modos, esos son los componentes del blob: 4 bytes para dlen
, 32 para d
, 4 para plen
, 17 para p
, 4 para qlen
, 17 para q
, 4 para ulen
, 17 para iqmp
. Súmalos, obtienes 99 bytes, o 792 bits. Para mayor comodidad, esto se codifica con Base64, que utiliza un subconjunto de 64 caracteres que son particularmente "seguros": "seguro" aquí, lo que significa que pueden procesarse utilizando sistemas diseñados para procesar texto (en particular, correo electrónico) sin mayores problemas. - no hay problemas con los caracteres especiales, no hay problemas con los programas que solo admiten caracteres ASCII y no conservan el octavo bit del byte, etc. Así es como el mensaje pasa de 792 bits a 132 caracteres.