본문 바로가기
카테고리 없음

c# openssh

by Knowledge Store In Hyunsoft 2025. 3. 10.
* 이 포스팅은 쿠팡 파트너스 활동의 일환으로 이에 따른 일정액의 수수료를 제공받습니다.

HP 2024 자비스 AI 노트북 15.6 코어 울트라 5-125H 인텔 14세대, NaturalSilver, 512GB, 16GB, Free DOS, 15-fd1030TU

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

 

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

댓글