Conversion of the RSA public key in the public key of RFC 4716 with the Bouncy Castle

I want to convert the RSA public key in something that I could use as a public SSH key.

At the moment I have a Bouncy Castle, which creates my public key, which looks like this:

-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAq1Y5300i8bN+cI2U3wJE Kh3xG/.........jbuz+WB0vvG P25UwCle2k5siVMwbImEYsr+Xt0dsMmGVB3/6MHAqrM3QQdQ8p2E5TyzL+JYa1FT gwIDAQAB -----END PUBLIC KEY----- 

I want it to have an RFC 4716 format similar to this:

ssh-rsa AAAAB3NzaC1yc2.......G1p2Ag3mZLFsks7RNHVLgMsGIAikQ==

My code so far using Bouncy Castle is as follows:

 var r = new Org.BouncyCastle.Crypto.Generators.RsaKeyPairGenerator(); r.Init(new KeyGenerationParameters(new SecureRandom(), 2048)); var keys = r.GenerateKeyPair(); var stringWriter = new StringWriter(); var pemWriter = new PemWriter(stringWriter); pemWriter.WriteObject(keys.Private); pemWriter.Writer.Flush(); stringWriter.Close(); PrivateKey = stringWriter.ToString(); stringWriter = new StringWriter(); pemWriter = new PemWriter(stringWriter); pemWriter.WriteObject(keys.Public); pemWriter.Writer.Flush(); stringWriter.Close(); PublicKey = stringWriter.ToString(); 

How to reformat and code key, so that he looked like?

Has anyone created a SSH public keys to the Bouncy Castle or similar?

+3
source share
3 answers

I did not find a ready-to-use function for this in BouncyCastle. So, in a roundabout way is to use PemReader , and then format the results. The result will be available as a property PublicSSH :

 using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Generators; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Math; using Org.BouncyCastle.OpenSsl; using Org.BouncyCastle.Security; using System; using System.IO; using System.Text; namespace Deploy4Me.Common.Utils { public class RSAKey { public string PublicPEM { get; set; } public string PrivatePEM { get; set; } public string PublicSSH { get; set; } } public static class RSA { public static RSAKey Generate() { try { RSAKey result = new RSAKey(); IAsymmetricCipherKeyPairGenerator gen; KeyGenerationParameters param; gen = new RsaKeyPairGenerator(); param = new RsaKeyGenerationParameters( BigInteger.ValueOf(3L), new SecureRandom(), 2048, 80 ); gen.Init(param); AsymmetricCipherKeyPair pair = gen.GenerateKeyPair(); using(TextWriter textWriter = new StringWriter()) { PemWriter wr = new PemWriter(textWriter); wr.WriteObject(pair.Private); wr.Writer.Flush(); result.PrivatePEM = textWriter.ToString(); } using (TextWriter textWriter = new StringWriter()) { PemWriter wr = new PemWriter(textWriter); wr.WriteObject(pair.Public); wr.Writer.Flush(); result.PublicPEM = textWriter.ToString(); } using (StringReader sr = new StringReader(result.PublicPEM)) { PemReader reader = new PemReader(sr); RsaKeyParameters r = (RsaKeyParameters)reader.ReadObject(); byte[] sshrsa_bytes = Encoding.Default.GetBytes("ssh-rsa"); byte[] n = r.Modulus.ToByteArray(); byte[] e = r.Exponent.ToByteArray(); 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), 0, 4); ms.Write(n, 0, n.Length); ms.Flush(); buffer64 = Convert.ToBase64String(ms.ToArray()); } result.PublicSSH = string.Format("ssh-rsa {0} generated-key", buffer64); } return result; } catch (Org.BouncyCastle.Crypto.CryptoException ex) { throw ex; } } private static byte[] ToBytes(int i) { byte[] bts = BitConverter.GetBytes(i); if (BitConverter.IsLittleEndian) { Array.Reverse(bts); } return bts; } } } )) using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Generators; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Math; using Org.BouncyCastle.OpenSsl; using Org.BouncyCastle.Security; using System; using System.IO; using System.Text; namespace Deploy4Me.Common.Utils { public class RSAKey { public string PublicPEM { get; set; } public string PrivatePEM { get; set; } public string PublicSSH { get; set; } } public static class RSA { public static RSAKey Generate() { try { RSAKey result = new RSAKey(); IAsymmetricCipherKeyPairGenerator gen; KeyGenerationParameters param; gen = new RsaKeyPairGenerator(); param = new RsaKeyGenerationParameters( BigInteger.ValueOf(3L), new SecureRandom(), 2048, 80 ); gen.Init(param); AsymmetricCipherKeyPair pair = gen.GenerateKeyPair(); using(TextWriter textWriter = new StringWriter()) { PemWriter wr = new PemWriter(textWriter); wr.WriteObject(pair.Private); wr.Writer.Flush(); result.PrivatePEM = textWriter.ToString(); } using (TextWriter textWriter = new StringWriter()) { PemWriter wr = new PemWriter(textWriter); wr.WriteObject(pair.Public); wr.Writer.Flush(); result.PublicPEM = textWriter.ToString(); } using (StringReader sr = new StringReader(result.PublicPEM)) { PemReader reader = new PemReader(sr); RsaKeyParameters r = (RsaKeyParameters)reader.ReadObject(); byte[] sshrsa_bytes = Encoding.Default.GetBytes("ssh-rsa"); byte[] n = r.Modulus.ToByteArray(); byte[] e = r.Exponent.ToByteArray(); 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), 0, 4); ms.Write(n, 0, n.Length); ms.Flush(); buffer64 = Convert.ToBase64String(ms.ToArray()); } result.PublicSSH = string.Format("ssh-rsa {0} generated-key", buffer64); } return result; } catch (Org.BouncyCastle.Crypto.CryptoException ex) { throw ex; } } private static byte[] ToBytes(int i) { byte[] bts = BitConverter.GetBytes(i); if (BitConverter.IsLittleEndian) { Array.Reverse(bts); } return bts; } } } ; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Generators; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Math; using Org.BouncyCastle.OpenSsl; using Org.BouncyCastle.Security; using System; using System.IO; using System.Text; namespace Deploy4Me.Common.Utils { public class RSAKey { public string PublicPEM { get; set; } public string PrivatePEM { get; set; } public string PublicSSH { get; set; } } public static class RSA { public static RSAKey Generate() { try { RSAKey result = new RSAKey(); IAsymmetricCipherKeyPairGenerator gen; KeyGenerationParameters param; gen = new RsaKeyPairGenerator(); param = new RsaKeyGenerationParameters( BigInteger.ValueOf(3L), new SecureRandom(), 2048, 80 ); gen.Init(param); AsymmetricCipherKeyPair pair = gen.GenerateKeyPair(); using(TextWriter textWriter = new StringWriter()) { PemWriter wr = new PemWriter(textWriter); wr.WriteObject(pair.Private); wr.Writer.Flush(); result.PrivatePEM = textWriter.ToString(); } using (TextWriter textWriter = new StringWriter()) { PemWriter wr = new PemWriter(textWriter); wr.WriteObject(pair.Public); wr.Writer.Flush(); result.PublicPEM = textWriter.ToString(); } using (StringReader sr = new StringReader(result.PublicPEM)) { PemReader reader = new PemReader(sr); RsaKeyParameters r = (RsaKeyParameters)reader.ReadObject(); byte[] sshrsa_bytes = Encoding.Default.GetBytes("ssh-rsa"); byte[] n = r.Modulus.ToByteArray(); byte[] e = r.Exponent.ToByteArray(); 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), 0, 4); ms.Write(n, 0, n.Length); ms.Flush(); buffer64 = Convert.ToBase64String(ms.ToArray()); } result.PublicSSH = string.Format("ssh-rsa {0} generated-key", buffer64); } return result; } catch (Org.BouncyCastle.Crypto.CryptoException ex) { throw ex; } } private static byte[] ToBytes(int i) { byte[] bts = BitConverter.GetBytes(i); if (BitConverter.IsLittleEndian) { Array.Reverse(bts); } return bts; } } } )) using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Generators; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Math; using Org.BouncyCastle.OpenSsl; using Org.BouncyCastle.Security; using System; using System.IO; using System.Text; namespace Deploy4Me.Common.Utils { public class RSAKey { public string PublicPEM { get; set; } public string PrivatePEM { get; set; } public string PublicSSH { get; set; } } public static class RSA { public static RSAKey Generate() { try { RSAKey result = new RSAKey(); IAsymmetricCipherKeyPairGenerator gen; KeyGenerationParameters param; gen = new RsaKeyPairGenerator(); param = new RsaKeyGenerationParameters( BigInteger.ValueOf(3L), new SecureRandom(), 2048, 80 ); gen.Init(param); AsymmetricCipherKeyPair pair = gen.GenerateKeyPair(); using(TextWriter textWriter = new StringWriter()) { PemWriter wr = new PemWriter(textWriter); wr.WriteObject(pair.Private); wr.Writer.Flush(); result.PrivatePEM = textWriter.ToString(); } using (TextWriter textWriter = new StringWriter()) { PemWriter wr = new PemWriter(textWriter); wr.WriteObject(pair.Public); wr.Writer.Flush(); result.PublicPEM = textWriter.ToString(); } using (StringReader sr = new StringReader(result.PublicPEM)) { PemReader reader = new PemReader(sr); RsaKeyParameters r = (RsaKeyParameters)reader.ReadObject(); byte[] sshrsa_bytes = Encoding.Default.GetBytes("ssh-rsa"); byte[] n = r.Modulus.ToByteArray(); byte[] e = r.Exponent.ToByteArray(); 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), 0, 4); ms.Write(n, 0, n.Length); ms.Flush(); buffer64 = Convert.ToBase64String(ms.ToArray()); } result.PublicSSH = string.Format("ssh-rsa {0} generated-key", buffer64); } return result; } catch (Org.BouncyCastle.Crypto.CryptoException ex) { throw ex; } } private static byte[] ToBytes(int i) { byte[] bts = BitConverter.GetBytes(i); if (BitConverter.IsLittleEndian) { Array.Reverse(bts); } return bts; } } } ); using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Generators; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Math; using Org.BouncyCastle.OpenSsl; using Org.BouncyCastle.Security; using System; using System.IO; using System.Text; namespace Deploy4Me.Common.Utils { public class RSAKey { public string PublicPEM { get; set; } public string PrivatePEM { get; set; } public string PublicSSH { get; set; } } public static class RSA { public static RSAKey Generate() { try { RSAKey result = new RSAKey(); IAsymmetricCipherKeyPairGenerator gen; KeyGenerationParameters param; gen = new RsaKeyPairGenerator(); param = new RsaKeyGenerationParameters( BigInteger.ValueOf(3L), new SecureRandom(), 2048, 80 ); gen.Init(param); AsymmetricCipherKeyPair pair = gen.GenerateKeyPair(); using(TextWriter textWriter = new StringWriter()) { PemWriter wr = new PemWriter(textWriter); wr.WriteObject(pair.Private); wr.Writer.Flush(); result.PrivatePEM = textWriter.ToString(); } using (TextWriter textWriter = new StringWriter()) { PemWriter wr = new PemWriter(textWriter); wr.WriteObject(pair.Public); wr.Writer.Flush(); result.PublicPEM = textWriter.ToString(); } using (StringReader sr = new StringReader(result.PublicPEM)) { PemReader reader = new PemReader(sr); RsaKeyParameters r = (RsaKeyParameters)reader.ReadObject(); byte[] sshrsa_bytes = Encoding.Default.GetBytes("ssh-rsa"); byte[] n = r.Modulus.ToByteArray(); byte[] e = r.Exponent.ToByteArray(); 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), 0, 4); ms.Write(n, 0, n.Length); ms.Flush(); buffer64 = Convert.ToBase64String(ms.ToArray()); } result.PublicSSH = string.Format("ssh-rsa {0} generated-key", buffer64); } return result; } catch (Org.BouncyCastle.Crypto.CryptoException ex) { throw ex; } } private static byte[] ToBytes(int i) { byte[] bts = BitConverter.GetBytes(i); if (BitConverter.IsLittleEndian) { Array.Reverse(bts); } return bts; } } } ; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Generators; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Math; using Org.BouncyCastle.OpenSsl; using Org.BouncyCastle.Security; using System; using System.IO; using System.Text; namespace Deploy4Me.Common.Utils { public class RSAKey { public string PublicPEM { get; set; } public string PrivatePEM { get; set; } public string PublicSSH { get; set; } } public static class RSA { public static RSAKey Generate() { try { RSAKey result = new RSAKey(); IAsymmetricCipherKeyPairGenerator gen; KeyGenerationParameters param; gen = new RsaKeyPairGenerator(); param = new RsaKeyGenerationParameters( BigInteger.ValueOf(3L), new SecureRandom(), 2048, 80 ); gen.Init(param); AsymmetricCipherKeyPair pair = gen.GenerateKeyPair(); using(TextWriter textWriter = new StringWriter()) { PemWriter wr = new PemWriter(textWriter); wr.WriteObject(pair.Private); wr.Writer.Flush(); result.PrivatePEM = textWriter.ToString(); } using (TextWriter textWriter = new StringWriter()) { PemWriter wr = new PemWriter(textWriter); wr.WriteObject(pair.Public); wr.Writer.Flush(); result.PublicPEM = textWriter.ToString(); } using (StringReader sr = new StringReader(result.PublicPEM)) { PemReader reader = new PemReader(sr); RsaKeyParameters r = (RsaKeyParameters)reader.ReadObject(); byte[] sshrsa_bytes = Encoding.Default.GetBytes("ssh-rsa"); byte[] n = r.Modulus.ToByteArray(); byte[] e = r.Exponent.ToByteArray(); 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), 0, 4); ms.Write(n, 0, n.Length); ms.Flush(); buffer64 = Convert.ToBase64String(ms.ToArray()); } result.PublicSSH = string.Format("ssh-rsa {0} generated-key", buffer64); } return result; } catch (Org.BouncyCastle.Crypto.CryptoException ex) { throw ex; } } private static byte[] ToBytes(int i) { byte[] bts = BitConverter.GetBytes(i); if (BitConverter.IsLittleEndian) { Array.Reverse(bts); } return bts; } } } ; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Generators; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Math; using Org.BouncyCastle.OpenSsl; using Org.BouncyCastle.Security; using System; using System.IO; using System.Text; namespace Deploy4Me.Common.Utils { public class RSAKey { public string PublicPEM { get; set; } public string PrivatePEM { get; set; } public string PublicSSH { get; set; } } public static class RSA { public static RSAKey Generate() { try { RSAKey result = new RSAKey(); IAsymmetricCipherKeyPairGenerator gen; KeyGenerationParameters param; gen = new RsaKeyPairGenerator(); param = new RsaKeyGenerationParameters( BigInteger.ValueOf(3L), new SecureRandom(), 2048, 80 ); gen.Init(param); AsymmetricCipherKeyPair pair = gen.GenerateKeyPair(); using(TextWriter textWriter = new StringWriter()) { PemWriter wr = new PemWriter(textWriter); wr.WriteObject(pair.Private); wr.Writer.Flush(); result.PrivatePEM = textWriter.ToString(); } using (TextWriter textWriter = new StringWriter()) { PemWriter wr = new PemWriter(textWriter); wr.WriteObject(pair.Public); wr.Writer.Flush(); result.PublicPEM = textWriter.ToString(); } using (StringReader sr = new StringReader(result.PublicPEM)) { PemReader reader = new PemReader(sr); RsaKeyParameters r = (RsaKeyParameters)reader.ReadObject(); byte[] sshrsa_bytes = Encoding.Default.GetBytes("ssh-rsa"); byte[] n = r.Modulus.ToByteArray(); byte[] e = r.Exponent.ToByteArray(); 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), 0, 4); ms.Write(n, 0, n.Length); ms.Flush(); buffer64 = Convert.ToBase64String(ms.ToArray()); } result.PublicSSH = string.Format("ssh-rsa {0} generated-key", buffer64); } return result; } catch (Org.BouncyCastle.Crypto.CryptoException ex) { throw ex; } } private static byte[] ToBytes(int i) { byte[] bts = BitConverter.GetBytes(i); if (BitConverter.IsLittleEndian) { Array.Reverse(bts); } return bts; } } } )) { using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Generators; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Math; using Org.BouncyCastle.OpenSsl; using Org.BouncyCastle.Security; using System; using System.IO; using System.Text; namespace Deploy4Me.Common.Utils { public class RSAKey { public string PublicPEM { get; set; } public string PrivatePEM { get; set; } public string PublicSSH { get; set; } } public static class RSA { public static RSAKey Generate() { try { RSAKey result = new RSAKey(); IAsymmetricCipherKeyPairGenerator gen; KeyGenerationParameters param; gen = new RsaKeyPairGenerator(); param = new RsaKeyGenerationParameters( BigInteger.ValueOf(3L), new SecureRandom(), 2048, 80 ); gen.Init(param); AsymmetricCipherKeyPair pair = gen.GenerateKeyPair(); using(TextWriter textWriter = new StringWriter()) { PemWriter wr = new PemWriter(textWriter); wr.WriteObject(pair.Private); wr.Writer.Flush(); result.PrivatePEM = textWriter.ToString(); } using (TextWriter textWriter = new StringWriter()) { PemWriter wr = new PemWriter(textWriter); wr.WriteObject(pair.Public); wr.Writer.Flush(); result.PublicPEM = textWriter.ToString(); } using (StringReader sr = new StringReader(result.PublicPEM)) { PemReader reader = new PemReader(sr); RsaKeyParameters r = (RsaKeyParameters)reader.ReadObject(); byte[] sshrsa_bytes = Encoding.Default.GetBytes("ssh-rsa"); byte[] n = r.Modulus.ToByteArray(); byte[] e = r.Exponent.ToByteArray(); 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), 0, 4); ms.Write(n, 0, n.Length); ms.Flush(); buffer64 = Convert.ToBase64String(ms.ToArray()); } result.PublicSSH = string.Format("ssh-rsa {0} generated-key", buffer64); } return result; } catch (Org.BouncyCastle.Crypto.CryptoException ex) { throw ex; } } private static byte[] ToBytes(int i) { byte[] bts = BitConverter.GetBytes(i); if (BitConverter.IsLittleEndian) { Array.Reverse(bts); } return bts; } } } i) using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Generators; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Math; using Org.BouncyCastle.OpenSsl; using Org.BouncyCastle.Security; using System; using System.IO; using System.Text; namespace Deploy4Me.Common.Utils { public class RSAKey { public string PublicPEM { get; set; } public string PrivatePEM { get; set; } public string PublicSSH { get; set; } } public static class RSA { public static RSAKey Generate() { try { RSAKey result = new RSAKey(); IAsymmetricCipherKeyPairGenerator gen; KeyGenerationParameters param; gen = new RsaKeyPairGenerator(); param = new RsaKeyGenerationParameters( BigInteger.ValueOf(3L), new SecureRandom(), 2048, 80 ); gen.Init(param); AsymmetricCipherKeyPair pair = gen.GenerateKeyPair(); using(TextWriter textWriter = new StringWriter()) { PemWriter wr = new PemWriter(textWriter); wr.WriteObject(pair.Private); wr.Writer.Flush(); result.PrivatePEM = textWriter.ToString(); } using (TextWriter textWriter = new StringWriter()) { PemWriter wr = new PemWriter(textWriter); wr.WriteObject(pair.Public); wr.Writer.Flush(); result.PublicPEM = textWriter.ToString(); } using (StringReader sr = new StringReader(result.PublicPEM)) { PemReader reader = new PemReader(sr); RsaKeyParameters r = (RsaKeyParameters)reader.ReadObject(); byte[] sshrsa_bytes = Encoding.Default.GetBytes("ssh-rsa"); byte[] n = r.Modulus.ToByteArray(); byte[] e = r.Exponent.ToByteArray(); 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), 0, 4); ms.Write(n, 0, n.Length); ms.Flush(); buffer64 = Convert.ToBase64String(ms.ToArray()); } result.PublicSSH = string.Format("ssh-rsa {0} generated-key", buffer64); } return result; } catch (Org.BouncyCastle.Crypto.CryptoException ex) { throw ex; } } private static byte[] ToBytes(int i) { byte[] bts = BitConverter.GetBytes(i); if (BitConverter.IsLittleEndian) { Array.Reverse(bts); } return bts; } } } ); using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Generators; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Math; using Org.BouncyCastle.OpenSsl; using Org.BouncyCastle.Security; using System; using System.IO; using System.Text; namespace Deploy4Me.Common.Utils { public class RSAKey { public string PublicPEM { get; set; } public string PrivatePEM { get; set; } public string PublicSSH { get; set; } } public static class RSA { public static RSAKey Generate() { try { RSAKey result = new RSAKey(); IAsymmetricCipherKeyPairGenerator gen; KeyGenerationParameters param; gen = new RsaKeyPairGenerator(); param = new RsaKeyGenerationParameters( BigInteger.ValueOf(3L), new SecureRandom(), 2048, 80 ); gen.Init(param); AsymmetricCipherKeyPair pair = gen.GenerateKeyPair(); using(TextWriter textWriter = new StringWriter()) { PemWriter wr = new PemWriter(textWriter); wr.WriteObject(pair.Private); wr.Writer.Flush(); result.PrivatePEM = textWriter.ToString(); } using (TextWriter textWriter = new StringWriter()) { PemWriter wr = new PemWriter(textWriter); wr.WriteObject(pair.Public); wr.Writer.Flush(); result.PublicPEM = textWriter.ToString(); } using (StringReader sr = new StringReader(result.PublicPEM)) { PemReader reader = new PemReader(sr); RsaKeyParameters r = (RsaKeyParameters)reader.ReadObject(); byte[] sshrsa_bytes = Encoding.Default.GetBytes("ssh-rsa"); byte[] n = r.Modulus.ToByteArray(); byte[] e = r.Exponent.ToByteArray(); 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), 0, 4); ms.Write(n, 0, n.Length); ms.Flush(); buffer64 = Convert.ToBase64String(ms.ToArray()); } result.PublicSSH = string.Format("ssh-rsa {0} generated-key", buffer64); } return result; } catch (Org.BouncyCastle.Crypto.CryptoException ex) { throw ex; } } private static byte[] ToBytes(int i) { byte[] bts = BitConverter.GetBytes(i); if (BitConverter.IsLittleEndian) { Array.Reverse(bts); } return bts; } } } 
+8
source

Implement his post for a few months, but if you're still looking for the code snippet below, inspired gotoalberto on the use of public key from authorized_keys with Java defense ...

 public static String getPublicOpenSSHKey(String pem, String userComment) throws IOException, EWAException { // Read the PEM supplied using Bouncy Castle PEMReader ... PEMReader r = new PEMReader(new StringReader(pem)); try { keyPair = (KeyPair) r.readObject(); } catch (IOException ioe) { ioe.printStackTrace(); } finally { try { r.close(); } catch (Throwable ignore) { } } PublicKey publicKey = keyPair.getPublic(); if (publicKey.getAlgorithm().equals("RSA")) { RSAPublicKey rsaPublicKey = (RSAPublicKey) publicKey; ByteArrayOutputStream byteOs = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(byteOs); dos.writeInt("ssh-rsa".getBytes().length); dos.write("ssh-rsa".getBytes()); dos.writeInt(rsaPublicKey.getPublicExponent().toByteArray().length); dos.write(rsaPublicKey.getPublicExponent().toByteArray()); dos.writeInt(rsaPublicKey.getModulus().toByteArray().length); dos.write(rsaPublicKey.getModulus().toByteArray()); String enc = Base64.encode(byteOs.toByteArray()); return("ssh-rsa " + enc + " " + userComment); } else throw new IllegalArgumentException("Unknown public key encoding: " + publicKey.getAlgorithm()); } (); public static String getPublicOpenSSHKey(String pem, String userComment) throws IOException, EWAException { // Read the PEM supplied using Bouncy Castle PEMReader ... PEMReader r = new PEMReader(new StringReader(pem)); try { keyPair = (KeyPair) r.readObject(); } catch (IOException ioe) { ioe.printStackTrace(); } finally { try { r.close(); } catch (Throwable ignore) { } } PublicKey publicKey = keyPair.getPublic(); if (publicKey.getAlgorithm().equals("RSA")) { RSAPublicKey rsaPublicKey = (RSAPublicKey) publicKey; ByteArrayOutputStream byteOs = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(byteOs); dos.writeInt("ssh-rsa".getBytes().length); dos.write("ssh-rsa".getBytes()); dos.writeInt(rsaPublicKey.getPublicExponent().toByteArray().length); dos.write(rsaPublicKey.getPublicExponent().toByteArray()); dos.writeInt(rsaPublicKey.getModulus().toByteArray().length); dos.write(rsaPublicKey.getModulus().toByteArray()); String enc = Base64.encode(byteOs.toByteArray()); return("ssh-rsa " + enc + " " + userComment); } else throw new IllegalArgumentException("Unknown public key encoding: " + publicKey.getAlgorithm()); } } public static String getPublicOpenSSHKey(String pem, String userComment) throws IOException, EWAException { // Read the PEM supplied using Bouncy Castle PEMReader ... PEMReader r = new PEMReader(new StringReader(pem)); try { keyPair = (KeyPair) r.readObject(); } catch (IOException ioe) { ioe.printStackTrace(); } finally { try { r.close(); } catch (Throwable ignore) { } } PublicKey publicKey = keyPair.getPublic(); if (publicKey.getAlgorithm().equals("RSA")) { RSAPublicKey rsaPublicKey = (RSAPublicKey) publicKey; ByteArrayOutputStream byteOs = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(byteOs); dos.writeInt("ssh-rsa".getBytes().length); dos.write("ssh-rsa".getBytes()); dos.writeInt(rsaPublicKey.getPublicExponent().toByteArray().length); dos.write(rsaPublicKey.getPublicExponent().toByteArray()); dos.writeInt(rsaPublicKey.getModulus().toByteArray().length); dos.write(rsaPublicKey.getModulus().toByteArray()); String enc = Base64.encode(byteOs.toByteArray()); return("ssh-rsa " + enc + " " + userComment); } else throw new IllegalArgumentException("Unknown public key encoding: " + publicKey.getAlgorithm()); } ; public static String getPublicOpenSSHKey(String pem, String userComment) throws IOException, EWAException { // Read the PEM supplied using Bouncy Castle PEMReader ... PEMReader r = new PEMReader(new StringReader(pem)); try { keyPair = (KeyPair) r.readObject(); } catch (IOException ioe) { ioe.printStackTrace(); } finally { try { r.close(); } catch (Throwable ignore) { } } PublicKey publicKey = keyPair.getPublic(); if (publicKey.getAlgorithm().equals("RSA")) { RSAPublicKey rsaPublicKey = (RSAPublicKey) publicKey; ByteArrayOutputStream byteOs = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(byteOs); dos.writeInt("ssh-rsa".getBytes().length); dos.write("ssh-rsa".getBytes()); dos.writeInt(rsaPublicKey.getPublicExponent().toByteArray().length); dos.write(rsaPublicKey.getPublicExponent().toByteArray()); dos.writeInt(rsaPublicKey.getModulus().toByteArray().length); dos.write(rsaPublicKey.getModulus().toByteArray()); String enc = Base64.encode(byteOs.toByteArray()); return("ssh-rsa " + enc + " " + userComment); } else throw new IllegalArgumentException("Unknown public key encoding: " + publicKey.getAlgorithm()); } () length.); public static String getPublicOpenSSHKey(String pem, String userComment) throws IOException, EWAException { // Read the PEM supplied using Bouncy Castle PEMReader ... PEMReader r = new PEMReader(new StringReader(pem)); try { keyPair = (KeyPair) r.readObject(); } catch (IOException ioe) { ioe.printStackTrace(); } finally { try { r.close(); } catch (Throwable ignore) { } } PublicKey publicKey = keyPair.getPublic(); if (publicKey.getAlgorithm().equals("RSA")) { RSAPublicKey rsaPublicKey = (RSAPublicKey) publicKey; ByteArrayOutputStream byteOs = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(byteOs); dos.writeInt("ssh-rsa".getBytes().length); dos.write("ssh-rsa".getBytes()); dos.writeInt(rsaPublicKey.getPublicExponent().toByteArray().length); dos.write(rsaPublicKey.getPublicExponent().toByteArray()); dos.writeInt(rsaPublicKey.getModulus().toByteArray().length); dos.write(rsaPublicKey.getModulus().toByteArray()); String enc = Base64.encode(byteOs.toByteArray()); return("ssh-rsa " + enc + " " + userComment); } else throw new IllegalArgumentException("Unknown public key encoding: " + publicKey.getAlgorithm()); } ()); public static String getPublicOpenSSHKey(String pem, String userComment) throws IOException, EWAException { // Read the PEM supplied using Bouncy Castle PEMReader ... PEMReader r = new PEMReader(new StringReader(pem)); try { keyPair = (KeyPair) r.readObject(); } catch (IOException ioe) { ioe.printStackTrace(); } finally { try { r.close(); } catch (Throwable ignore) { } } PublicKey publicKey = keyPair.getPublic(); if (publicKey.getAlgorithm().equals("RSA")) { RSAPublicKey rsaPublicKey = (RSAPublicKey) publicKey; ByteArrayOutputStream byteOs = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(byteOs); dos.writeInt("ssh-rsa".getBytes().length); dos.write("ssh-rsa".getBytes()); dos.writeInt(rsaPublicKey.getPublicExponent().toByteArray().length); dos.write(rsaPublicKey.getPublicExponent().toByteArray()); dos.writeInt(rsaPublicKey.getModulus().toByteArray().length); dos.write(rsaPublicKey.getModulus().toByteArray()); String enc = Base64.encode(byteOs.toByteArray()); return("ssh-rsa " + enc + " " + userComment); } else throw new IllegalArgumentException("Unknown public key encoding: " + publicKey.getAlgorithm()); } length..); public static String getPublicOpenSSHKey(String pem, String userComment) throws IOException, EWAException { // Read the PEM supplied using Bouncy Castle PEMReader ... PEMReader r = new PEMReader(new StringReader(pem)); try { keyPair = (KeyPair) r.readObject(); } catch (IOException ioe) { ioe.printStackTrace(); } finally { try { r.close(); } catch (Throwable ignore) { } } PublicKey publicKey = keyPair.getPublic(); if (publicKey.getAlgorithm().equals("RSA")) { RSAPublicKey rsaPublicKey = (RSAPublicKey) publicKey; ByteArrayOutputStream byteOs = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(byteOs); dos.writeInt("ssh-rsa".getBytes().length); dos.write("ssh-rsa".getBytes()); dos.writeInt(rsaPublicKey.getPublicExponent().toByteArray().length); dos.write(rsaPublicKey.getPublicExponent().toByteArray()); dos.writeInt(rsaPublicKey.getModulus().toByteArray().length); dos.write(rsaPublicKey.getModulus().toByteArray()); String enc = Base64.encode(byteOs.toByteArray()); return("ssh-rsa " + enc + " " + userComment); } else throw new IllegalArgumentException("Unknown public key encoding: " + publicKey.getAlgorithm()); } .); public static String getPublicOpenSSHKey(String pem, String userComment) throws IOException, EWAException { // Read the PEM supplied using Bouncy Castle PEMReader ... PEMReader r = new PEMReader(new StringReader(pem)); try { keyPair = (KeyPair) r.readObject(); } catch (IOException ioe) { ioe.printStackTrace(); } finally { try { r.close(); } catch (Throwable ignore) { } } PublicKey publicKey = keyPair.getPublic(); if (publicKey.getAlgorithm().equals("RSA")) { RSAPublicKey rsaPublicKey = (RSAPublicKey) publicKey; ByteArrayOutputStream byteOs = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(byteOs); dos.writeInt("ssh-rsa".getBytes().length); dos.write("ssh-rsa".getBytes()); dos.writeInt(rsaPublicKey.getPublicExponent().toByteArray().length); dos.write(rsaPublicKey.getPublicExponent().toByteArray()); dos.writeInt(rsaPublicKey.getModulus().toByteArray().length); dos.write(rsaPublicKey.getModulus().toByteArray()); String enc = Base64.encode(byteOs.toByteArray()); return("ssh-rsa " + enc + " " + userComment); } else throw new IllegalArgumentException("Unknown public key encoding: " + publicKey.getAlgorithm()); } encoding:" + publicKey.getAlgorithm ()); public static String getPublicOpenSSHKey(String pem, String userComment) throws IOException, EWAException { // Read the PEM supplied using Bouncy Castle PEMReader ... PEMReader r = new PEMReader(new StringReader(pem)); try { keyPair = (KeyPair) r.readObject(); } catch (IOException ioe) { ioe.printStackTrace(); } finally { try { r.close(); } catch (Throwable ignore) { } } PublicKey publicKey = keyPair.getPublic(); if (publicKey.getAlgorithm().equals("RSA")) { RSAPublicKey rsaPublicKey = (RSAPublicKey) publicKey; ByteArrayOutputStream byteOs = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(byteOs); dos.writeInt("ssh-rsa".getBytes().length); dos.write("ssh-rsa".getBytes()); dos.writeInt(rsaPublicKey.getPublicExponent().toByteArray().length); dos.write(rsaPublicKey.getPublicExponent().toByteArray()); dos.writeInt(rsaPublicKey.getModulus().toByteArray().length); dos.write(rsaPublicKey.getModulus().toByteArray()); String enc = Base64.encode(byteOs.toByteArray()); return("ssh-rsa " + enc + " " + userComment); } else throw new IllegalArgumentException("Unknown public key encoding: " + publicKey.getAlgorithm()); } 
0
source

Note. I work at Microsoft, but Microsoft is not the answer, and only Personal.

Addendum to Paul Answer,

I have found that for some reason, when generating RSA keys with 3072 bits, PuTTYgen will generate another RSA public key than mine.

After researching, I found that in the source code of Putty Gen, it looks like this: Length + 1 in an array of bytes, adding a leading 0.

For BouncyCastle you 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 will look like

  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 secret key, which I used for testing, and the link to the source code putty gen https://www.cameronmoten.com/2017/12/21/rsacryptoserviceprovider-create-a-ssh-rsa-public-key/

0
source

All Articles