프로젝트

일반

사용자정보

SEED 암호화 소스

송 경석이(가) 2달 전에 추가함

using System;
using System.Text;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Modes;
using Org.BouncyCastle.Crypto.Paddings;
using Org.BouncyCastle.Crypto.Parameters;

class Program
{
    static void Main()
    {
        string plaintext = "Hello, SEED CBC!";
        string key = "1234567890123456"; // 16바이트 키 (128비트)
        string iv = "abcdefghijklmnop";  // 16바이트 IV (초기화 벡터)

        byte[] encrypted = Encrypt(plaintext, key, iv);
        Console.WriteLine("Encrypted (Base64): " + Convert.ToBase64String(encrypted));

        string decrypted = Decrypt(encrypted, key, iv);
        Console.WriteLine("Decrypted: " + decrypted);
    }

    public static byte[] Encrypt(string plainText, string key, string iv)
    {
        byte[] keyBytes = Encoding.UTF8.GetBytes(key);
        byte[] ivBytes = Encoding.UTF8.GetBytes(iv);
        byte[] dataBytes = Encoding.UTF8.GetBytes(plainText);

        IBlockCipher engine = new CbcBlockCipher(new SeedEngine()); // CBC 모드 설정
        PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(engine, new Pkcs7Padding()); // PKCS7 패딩 추가
        cipher.Init(true, new ParametersWithIV(new KeyParameter(keyBytes), ivBytes));

        byte[] encrypted = new byte[cipher.GetOutputSize(dataBytes.Length)];
        int len = cipher.ProcessBytes(dataBytes, 0, dataBytes.Length, encrypted, 0);
        cipher.DoFinal(encrypted, len);

        return encrypted;
    }

    public static string Decrypt(byte[] cipherText, string key, string iv)
    {
        byte[] keyBytes = Encoding.UTF8.GetBytes(key);
        byte[] ivBytes = Encoding.UTF8.GetBytes(iv);

        IBlockCipher engine = new CbcBlockCipher(new SeedEngine());
        PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(engine, new Pkcs7Padding());
        cipher.Init(false, new ParametersWithIV(new KeyParameter(keyBytes), ivBytes));

        byte[] decrypted = new byte[cipher.GetOutputSize(cipherText.Length)];
        int len = cipher.ProcessBytes(cipherText, 0, cipherText.Length, decrypted, 0);
        cipher.DoFinal(decrypted, len);

        return Encoding.UTF8.GetString(decrypted).TrimEnd('\0');
    }
}