Create private key dose not work by c#
Discussed in https://github.com/shellhub-io/shellhub/discussions/4120
Originally posted by bonnlee2024 August 29, 2024 Result like this: -----BEGIN OPENSSH PRIVATE KEY----- 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 dAAAAA== -----END OPENSSH PRIVATE KEY-----
Core code like this: private static string WriteOpenSshPrivateKey(RsaPrivateCrtKeyParameters privateKey, TextWriter writer1) { using (var ms = new MemoryStream()) { using (var writer = new BinaryWriter(ms)) { writer.Write(_encoding.GetBytes("openssh-key-v1\0")); writer.Write(_encoding.GetBytes("none")); writer.Write(_encoding.GetBytes("none")); writer.Write(new byte[] { 1 });
byte[] publicKey = GetRsaPublicKeyBlob(privateKey);
writer.Write(publicKey);
RsaPrivateCrtKeyParameters privateKeyParams = (RsaPrivateCrtKeyParameters)privateKey;
MemoryStream privateKeyStream = new MemoryStream();
using (BinaryWriter privateKeyWriter = new BinaryWriter(privateKeyStream))
{
var checkInt = new Random().Next();
privateKeyWriter.Write(BitConverter.GetBytes(checkInt));
privateKeyWriter.Write(BitConverter.GetBytes(checkInt));
privateKeyWriter.Write(_encoding.GetBytes("ssh-rsa"));
WriteMpInt(privateKeyWriter, privateKeyParams.Modulus);
WriteMpInt(privateKeyWriter, privateKeyParams.PublicExponent);
WriteMpInt(privateKeyWriter, privateKeyParams.Exponent);
WriteMpInt(privateKeyWriter, privateKeyParams.P);
WriteMpInt(privateKeyWriter, privateKeyParams.Q);
WriteMpInt(privateKeyWriter, privateKeyParams.DQ);
WriteMpInt(privateKeyWriter, privateKeyParams.QInv);
privateKeyWriter.Write(System.Text.Encoding.ASCII.GetBytes("no comment"));
//privateKeyWriter.Write(GetBytes(privateKeyParams.Modulus));
//privateKeyWriter.Write(GetBytes(privateKeyParams.PublicExponent));
//privateKeyWriter.Write(GetBytes(privateKeyParams.Exponent));
//privateKeyWriter.Write(GetBytes(privateKeyParams.QInv));
//privateKeyWriter.Write(GetBytes(privateKeyParams.P));
//privateKeyWriter.Write(GetBytes(privateKeyParams.Q));
privateKeyWriter.Write(new byte[ms.Length % 8 == 0 ? 0 : 8 - (ms.Length % 8)]); // padding
}
byte[] privateKeyBlob = privateKeyStream.ToArray();
writer.Write((uint)privateKeyBlob.Length);
writer.Write(privateKeyBlob);
}
byte[] finalBlob = ms.ToArray();
string base64Blob = Convert.ToBase64String(finalBlob);
StringBuilder builder = new StringBuilder();
builder.Append("-----BEGIN OPENSSH PRIVATE KEY-----\n");
for (int i = 0; i < base64Blob.Length; i += 64)
{
int chunkSize = Math.Min(64, base64Blob.Length - i);
builder.Append(base64Blob, i, chunkSize);
builder.Append('\n');
}
builder.Append("-----END OPENSSH PRIVATE KEY-----\n");
return builder.ToString();
}
}
private static byte[] GetRsaPublicKeyBlob(RsaPrivateCrtKeyParameters privateKeyParams) { using (MemoryStream ms = new MemoryStream()) { using (BinaryWriter writer = new BinaryWriter(ms)) { writer.Write(Encoding.UTF8.GetBytes("ssh-rsa")); writer.Write(GetBytes(privateKeyParams.Modulus)); writer.Write(GetBytes(privateKeyParams.PublicExponent));
}
return ms.ToArray();
}
}
private static void WriteMpInt(BinaryWriter writer, Org.BouncyCastle.Math.BigInteger value) { var bytes = value.ToByteArrayUnsigned(); writer.Write(BitConverter.GetBytes(bytes.Length + 1)); // length writer.Write((byte)(bytes[0] < 0 ? 0 : 0)); // leading zero for positive number writer.Write(bytes); // value }