C# - Python과의 AES 암호화 연동
간단하게, Python으로는 이렇게 암호화/복호화를 할 수 있고,
# 패키지 2개 설치
# pip install pycryptodome
# pip install pycryptodomex
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad, pad
iv = "0123456789abcdef"
key = "abcdefghijklmnopabcdefghijklmnop"
cipher = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv.encode('utf-8'))
data = "test is good, not bad, so so.".encode('utf-8')
padded_data = pad(data, AES.block_size) # AES.block_size == 16
encrypted_data = cipher.encrypt(padded_data)
with open('encrypted.bin', 'wb') as f:
f.write(encrypted_data)
# 복호화
# cipher = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv.encode('utf-8'))
# decrypted_data = cipher.decrypt(encrypted_data)
# unpadded_data = unpad(decrypted_data, AES.block_size)
# print(bytes.decode(unpadded_data))
위의 코드로 저장한 encrypted.bin 파일을 C#에서 복호화 하려면 다음과 같이 코딩할 수 있습니다.
using System.Security.Cryptography;
using System.Text;
namespace ConsoleApp1;
internal class Program
{
static void Main(string[] args)
{
byte[] iv = Encoding.UTF8.GetBytes("0123456789abcdef"); // 파이썬에서 사용한 iv와 동일
byte[] key = Encoding.UTF8.GetBytes("abcdefghijklmnopabcdefghijklmnop"); // 파이썬에서 사용한 key와 동일
byte[] encrypted_data = File.ReadAllBytes("encrypted.bin");
using (Aes aesAlg = Aes.Create())
{
aesAlg.Key = key;
aesAlg.IV = iv;
Console.WriteLine($"BlockSize: {aesAlg.BlockSize}(bits) {aesAlg.BlockSize / 8}(bytes)"); // 기본값이 파이썬의 BlockSize와 동일
Console.WriteLine($"Mode: {aesAlg.Mode}"); // 기본값이 CBC
var decryptor = aesAlg.CreateDecryptor();
using (var ms = new MemoryStream(encrypted_data))
using (var decrypt = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
using (var plain = new MemoryStream())
{
decrypt.CopyTo(plain);
string text = Encoding.UTF8.GetString(plain.GetBuffer(), 0, (int)plain.Length);
Console.WriteLine(text); // 출력 결과: test is good, not bad, so so
}
}
}
}
마찬가지로, C#으로 Encrypt, 파이썬에서 Decrypt하는 것도 위의 옵션 그대로 사용해 과정만 역으로 하면 됩니다.
(
첨부 파일은 이 글의 예제 코드를 포함합니다.)
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]