2017-04-03 2 views
1

Je génère une clé RSA avec 4096 bits selon RFC4716 (ou du moins je le pensais) en utilisant C# et la bibliothèque de cryptographie standard, mais git hub dit que j'ai un clé avec la mauvaise taille, renvoyant l'erreur suivante lorsque je tente de l'ajouter aux clés associées à mon compte.Erreur de clé faible sur Github, avec 4096 RSAkey généré avec C#

Key is weak. GitHub recommends using ssh-keygen to generate a RSA key of at least 2048 bits.

Ceci est le code pour générer la clé:

public static void GenerateKeys() 
    { 
     // Create the CspParameters object and set the key container 
     // name used to store the RSA key pair. 
     CspParameters cp = new CspParameters(); 
     //cp.KeyContainerName = ContainerName; 

     CspKeyContainerInfo info = new CspKeyContainerInfo(cp); 
     //string filename = info.UniqueKeyContainerName; 

     // Create a new instance of RSACryptoServiceProvider that accesses 
     // the key container MyKeyContainerName. 
     RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(4096, cp); 
     var test = rsa.KeySize; 

     using (StreamWriter privateKeyWriter = new StreamWriter(GitStandard.PrivateSSHKeyPath)) 
     { 
      ExportPrivateKey(rsa, privateKeyWriter); 
     } 

     using (StreamWriter publicKeyWriter = new StreamWriter(GitStandard.PublicSSHKeyPath)) 
     { 

      ExportPublicKeyOpenSSH(rsa, publicKeyWriter); 
     } 
    } 

La méthode ExportPublicKeyOpenSSH est une petite modification du code trouvé dans this thread with answers on how to convert the key to RFC4716, la seule chose que je fais différemment est d'ajouter un zéro (0) avant que le module ne soit converti.

private static void ExportPublicKeyOpenSSH(RSACryptoServiceProvider csp, TextWriter outputStream) 
     { 
      var parameters = csp.ExportParameters(false); 


      byte[] sshrsa_bytes = Encoding.Default.GetBytes("ssh-rsa"); 
      //initializing modulus array 
      byte[] n = new Byte[parameters.Modulus.Length + 1]; 
      //adding initial zero before modulus to conform with OpenSSH 
      n[0] = 0; 
      System.Buffer.BlockCopy(parameters.Modulus, 0, n, 1, parameters.Modulus.Length); 
      //byte[] n = parameters.Modulus; 
      byte[] e = parameters.Exponent; 
      System.Array.Resize<Byte>(ref n, n.Length + 1); 
      string base64; 
      using (var stream = new MemoryStream()) 
      { 
       stream.Write(ToBytes(sshrsa_bytes.Length), 0, 4); 
       stream.Write(sshrsa_bytes, 0, sshrsa_bytes.Length); 
       stream.Write(ToBytes(e.Length), 0, 4); 
       stream.Write(e, 0, e.Length); 
       stream.Write(ToBytes(n.Length), 0, 4); 
       stream.Write(n, 0, n.Length); 
       stream.Flush(); 
       base64 = Convert.ToBase64String(stream.ToArray()); 
      } 
      var result = string.Format("ssh-rsa {0}", base64); 
      outputStream.Write(result); 
     } 

Qu'est-ce que la clé générée ressemble

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAgD171Y9VeinRALRfU8adS2K0vYHGfKkQwqs8SOQbhURFNtazupsocmpW96dYF346UVVCiKQCYrCW6t0QpGE3ch7onqTvXBszA9mfcuLX9hlhesJqFyUTHxDUopCc2tc5fWYuZ4MeySKuOetBEmPfN3Eu + SWC8j3VS9YzIDjwhkBPcJoxOnv3l7pSxEzGBGQXwdGmL8TFxxsBhue1ajralYPXgJo1nra70ChHcr8PfJvIXigBYCkwnb0KuofbPyhHETo4fNJqCPa1rLjnKoz5iTpyak2SWnhD5FX0/t4juaL/OKNE4YSaAqpWwA9VS1i + y7doeSRc22tm5LHgSLmlxg6h5lPKm5emB840eMLOPvZLS/4uODzFPMo4NFC2ZwNwdlXhcQE9EVtz9EZox1isKpJgShqJPh0sHVH9RnCuBSxW5N79KtsvcXI2zAiLBczKukqU2rTkvYdV1Wkx4zHSvLe42PQuJvSwhwW1tlgyFemd2aRwGDltQyGT PNOZ28E6SGgvxYtB4nvcu8gLyxob4Hz3ysohDB0Z9ZEismSK/8eSeMrBPosTBO77tsjUk1L8v2lHXQ + p1raLpd3ETeae7vZjt6zMFCIhNKDvdJL9b0mIKLB26PMhWG4DzSTJGeIANjiNryWK7y0gdgdPs5953H1EJVRQ0wd2ceFFg2 + kpqlrQA =

En utilisant la commande ssh-keygen -l -f custom_rsa.pub pour tester la validité de la clé.

$ ssh-keygen -l -f custom_rsa.pub 
4104 SHA256:uGO4sHOXXuX1waf+8jrdsWr3/57npF5AuUKUgYVWbCI no comment (RSA) 
+2

Vous redimensionnez 'n' fois pour ajouter un 0 à gauche (en copiant manuellement en elle à partir de l'index 1) et d'ajouter un 0 à droite (Array.Resize). Ce dernier vous a probablement causé des ennuis. En outre, ne pas utiliser Encoding.Default, mais tout ce que vous encodage intend.'Encoding.ASCII', probablement. – bartonjs

+0

@bartonjs Vous étiez tout à fait raison. J'aurais dû le remarquer avant, merci. Pourriez-vous poster comme réponse? – Anika

Répondre

1

vous redimensionnez n à la fois pour ajouter un 0 à gauche (en copiant manuellement en elle à partir de l'index 1) et d'ajouter un 0 à droite (via Array.Resize). Ce dernier vous a probablement causé des ennuis.

En outre, (sans lien) vous ne devriez probablement pas utiliser Encoding.Default, mais plutôt ce que vous avez l'intention de codage. , probablement.