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');
}
}