* 이 포스팅은 쿠팡 파트너스 활동의 일환으로 이에 따른 일정액의 수수료를 제공받습니다.
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
using System;
using System.Security.Cryptography;
using System.Text;
using System.IO;
class Program
{
static void Main()
{
using (RSA rsa = RSA.Create(2048))
{
// 공개 키 OpenSSH 포맷으로 변환
string sshPublicKey = ConvertToOpenSSH(rsa);
// 결과 출력
Console.WriteLine("OpenSSH Public Key:");
Console.WriteLine(sshPublicKey);
}
}
static string ConvertToOpenSSH(RSA rsa)
{
// OpenSSH RSA 공개 키는 특정 바이너리 형식을 사용해야 함.
byte[] rsaPublicKey = rsa.ExportRSAPublicKey();
using (MemoryStream ms = new MemoryStream())
using (BinaryWriter writer = new BinaryWriter(ms))
{
// "ssh-rsa" 접두사
WriteString(writer, "ssh-rsa");
// e (공개 지수, 65537일 가능성이 높음)
RSAParameters parameters = rsa.ExportParameters(false);
WriteMPInt(writer, parameters.Exponent);
// n (모듈러스)
WriteMPInt(writer, parameters.Modulus);
// 최종 Base64 인코딩
string keyBase64 = Convert.ToBase64String(ms.ToArray());
// OpenSSH 공개 키 포맷
return $"ssh-rsa {keyBase64} generated-key";
}
}
static void WriteString(BinaryWriter writer, string text)
{
byte[] data = Encoding.ASCII.GetBytes(text);
writer.Write(ConvertIntToBytes(data.Length));
writer.Write(data);
}
static void WriteMPInt(BinaryWriter writer, byte[] data)
{
if (data[0] > 127) // BigInt는 음수를 방지하기 위해 0x00을 앞에 추가할 수 있음.
{
byte[] padded = new byte[data.Length + 1];
Array.Copy(data, 0, padded, 1, data.Length);
data = padded;
}
writer.Write(ConvertIntToBytes(data.Length));
writer.Write(data);
}
static byte[] ConvertIntToBytes(int value)
{
return BitConverter.GetBytes(System.Net.IPAddress.HostToNetworkOrder(value));
}
}
728x90
댓글