SSH ED25519 Key Extract pk (32 bits)

1

Estoy jugando con las teclas ssh con ED25519. He visto un par de bibliotecas jugando con la generación del par de claves pública / privada. Otro análisis de la clave privada openssh para obtener la clave, pero el desafío al que me estoy enfrentando es obtener el valor pk de la clave pública.

Desde OpenSSH enlace

Encuentro esto:

  

pk es la clave pública Ed25519 codificada como se define por   draft-josefsson-eddsa-ed25519-03.

Así que estoy tratando de obtener el valor real de la clave pública (32 bits) de la clave pública, y luego codificarlos.

Mi (s) pregunta (s): \

  1. ¿Puede alguien explicar cómo extraer la clave pública real de la clave pública de la clave ssh (eliminando todas las cosas adicionales y dejando solo la clave)?

  2. ¿Podría alguien poner en lenguaje humano (o código) un ejemplo de codificación de la clave pública?

(Estoy haciendo esto en python, cryptography.hazmat todavía no lo admite. He revisado el código C para la firma openssh keygen, que necesita el pk, y no estoy lo suficientemente familiarizado con C para profundice en los punteros a los punteros, etc. para descubrir lo que está haciendo.

Feliz de hacer más investigación si es necesario, pero solo busco un lugar para buscar.

    
pregunta John 03.06.2017 - 07:46
fuente

1 respuesta

2
  

1- ¿Puede alguien explicar cómo extraer la clave pública real de la clave pública de la clave ssh (eliminando todas las cosas adicionales y dejando solo la clave)?

El formato de la clave pública se describe como parte de la sección known_hosts de la página del manual para sshd :

  

tipo de clave, clave codificada en base64, comentario.

Así que vamos a crear una clave para ver qué hay.

$ ssh-keygen -t ed25519 -f ed25519
$ cat ed25519.pub 
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIE8C+wgMJ89PV5cQZxfCpq+GB/gZ0zO7JQhnVBIh2gOj comment

Usando cut podemos seleccionar solo el blob de tecla, que es la estructura LV (valor de longitud), que contiene (una vez más) el nombre de la tecla y luego el valor PK real:

$ cat ed25519.pub | cut -d' ' -f2 | base64 -d | hexdump -C
00000000  00 00 00 0b 73 73 68 2d  65 64 32 35 35 31 39 00  |....ssh-ed25519.|
00000010  00 00 20 4f 02 fb 08 0c  27 cf 4f 57 97 10 67 17  |.. O....'.OW..g.|
00000020  c2 a6 af 86 07 f8 19 d3  33 bb 25 08 67 54 12 21  |........3.%.gT.!|
00000030  da 03 a3                                          |...|
00000033

Una vez más, podemos deshacernos del nombre de clave para obtener la cadena que representa la PK solamente. La Longitud se representa siempre utilizando 4 bytes: 00 00 00 0b (11) es la longitud de la cadena ssh-ed25519 (hex: 73 73 68 2d 65 64 32 35 35 31 39 ) y luego sigue la longitud PK 00 00 00 20 (siempre 32 bytes) y la clave en sí ( hexadecimal):

4f 02 fb 08 0c 27 cf 4f 57 97 10 67 17 c2 a6 af 86 07 f8 19 d3 33 bb 25 08 67 54 12 21 da 03 a3
  

2- ¿Podría alguien poner en lenguaje humano (o código) un ejemplo de codificación de la clave pública?

Lo anterior es una versión de bash y manual de extracción del valor PK de la clave pública de OpenSSH. Creo que podrás implementar eso en Python a partir de la descripción anterior.

    
respondido por el Jakuje 04.06.2017 - 10:58
fuente

Lea otras preguntas en las etiquetas