Converting an RSA Public Key into a RFC 4716 Public Key with Bouncy Castle

后端 未结 3 712
伪装坚强ぢ
伪装坚强ぢ 2020-12-09 23:37

I am looking to convert an RSA public key into something that I could use as an SSH public key.

Currently I have Bouncy Castle producing me a public key that looks l

3条回答
  •  北海茫月
    2020-12-09 23:45

    Note: I work at Microsoft but this is not a Microsoft Answer, just Personal.

    Adding to Pavels Answer,

    I've found that for some reason when generating a 3072 Bit RSA key, PuttyGen would generate a different RSA public key than mine.

    After researching, I found that it seems in the source code of the Putty Gen Program it would do .Length + 1 to the Byte array, adding a leading 0.

    For the BouncyCastle, you would change this line.

                        ms.Write(ToBytes(n.Length), 0, 4);
                        ms.Write(n, 0, n.Length);
    

    to

                        ms.Write(ToBytes(n.Length+1), 0, 4);//Add +1 to Emulate PuttyGen
                        ms.Write(new byte[] { 0 }, 0, 1); //Add a 0 to Emulate PuttyGen
                        ms.Write(n, 0, n.Length);
    

    For Microsoft .net RSACryptoServiceProvider it would look like this

                RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(3072);
                byte[] sshrsa_bytes = Encoding.Default.GetBytes("ssh-rsa");
                byte[] n = RSA.ExportParameters(false).Modulus;
                byte[] e = RSA.ExportParameters(false).Exponent;
                string buffer64;
                using (MemoryStream ms = new MemoryStream())
                {
                    ms.Write(ToBytes(sshrsa_bytes.Length), 0, 4);
                    ms.Write(sshrsa_bytes, 0, sshrsa_bytes.Length);
                    ms.Write(ToBytes(e.Length), 0, 4);
                    ms.Write(e, 0, e.Length);
                    ms.Write(ToBytes(n.Length+1), 0, 4); //Remove the +1 if not Emulating Putty Gen
                    ms.Write(new byte[] { 0 }, 0, 1); //Add a 0 to Emulate PuttyGen
                    ms.Write(n, 0, n.Length);
                    ms.Flush();
                    buffer64 = Convert.ToBase64String(ms.ToArray());
                }
    
                string pubssh = string.Format("ssh-rsa {0} generated-key", buffer64);
    

    You can see my Private Key I used for testing & the putty gen source code link https://www.cameronmoten.com/2017/12/21/rsacryptoserviceprovider-create-a-ssh-rsa-public-key/

提交回复
热议问题