VisualStudio/C#

[C#] AES128 암호화

usingsystem 2024. 5. 7. 13:30
728x90

AES는 128 비트 블록 크기를 가지며, 128, 192 또는 256 비트의 키를 사용할 수 있습니다. AES는 라운드라는 여러 단계를 거쳐 데이터를 암호화하고 복호화합니다. 각 라운드에서는 다양한 변환 과정을 거쳐 데이터가 혼합되고 변환됩니다.

AES의 특징은 다음과 같습니다:

  1. 안전성: AES는 공격에 강한 구조를 갖고 있습니다. 충분한 키 크기와 충분한 라운드 수를 사용하여 안전한 암호화를 제공합니다.
  2. 효율성: AES는 효율적인 구현이 가능하며, 속도와 리소스 사용을 최적화하여 빠른 암호화 및 복호화를 제공합니다.
  3. 대칭 키 알고리즘: AES는 대칭 키 알고리즘입니다. 즉, 암호화 및 복호화에 동일한 키가 사용됩니다.
  4. 표준화: AES는 미국 국가 표준 기술 연구소(NIST)에 의해 표준으로 채택되었습니다.

AES는 데이터를 안전하게 보호하는 데 널리 사용되며, 인터넷 통신, 디스크 및 파일 시스템 암호화, 데이터베이스 보호 등 다양한 응용 분야에서 이용됩니다. 128 비트의 키 크기를 사용하는 AES-128은 여전히 매우 강력한 암호화 수준을 제공하면서도 처리 속도가 빠르기 때문에 많은 애플리케이션에서 선호됩니다.

 
 
public class AES128Manager
{
    string _secureKey = "123456789"; // LOGIN SECURE KEY -- 변동될 수 있습니다.

    public string GetEncrypt(string str)
    {
        return EncodeBase64(EncryptAES128(str));
    }
    public string GetDecrypt(string str)
    {
        return DecodeBase64(DecryptAES128(str));
    }
    string EncodeBase64(string plainText)
    {
        if (!string.IsNullOrEmpty(plainText))
            return Convert.ToBase64String(Encoding.UTF8.GetBytes(plainText));
        else
            return null;
    }

    string DecodeBase64(string encodedText)
    {
        if (!string.IsNullOrEmpty(encodedText))
            return Encoding.UTF8.GetString(Convert.FromBase64String(encodedText));
        else
            return null;
    }
    byte[] GenerateSaltBytes()
    {
        using (RandomNumberGenerator rng = RandomNumberGenerator.Create())
        {
            byte[] saltBytes = new byte[20];
            rng.GetBytes(saltBytes);
            return saltBytes;
        }
    }
    // AES128 암호화
    string EncryptAES128(string message)
    {
        byte[] saltBytes = GenerateSaltBytes();

        byte[] keyBytes = GenerateKeyBytes(_secureKey);

        using (var aesAlg = Aes.Create())
        {
            aesAlg.Key = keyBytes;
            aesAlg.Mode = CipherMode.CBC;
            aesAlg.Padding = PaddingMode.PKCS7;

            var iv = aesAlg.IV;
            using (var encryptor = aesAlg.CreateEncryptor(keyBytes, iv))
            {
                using (var msEncrypt = new System.IO.MemoryStream())
                {
                    using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                    {
                        using (var swEncrypt = new System.IO.StreamWriter(csEncrypt))
                        {
                            swEncrypt.Write(message);
                        }
                    }
                    byte[] encryptedBytes = msEncrypt.ToArray();
                    byte[] buffer = new byte[saltBytes.Length + iv.Length + encryptedBytes.Length];
                    Buffer.BlockCopy(saltBytes, 0, buffer, 0, saltBytes.Length);
                    Buffer.BlockCopy(iv, 0, buffer, saltBytes.Length, iv.Length);
                    Buffer.BlockCopy(encryptedBytes, 0, buffer, saltBytes.Length + iv.Length, encryptedBytes.Length);
                    return Convert.ToBase64String(buffer);
                }
            }
        }
    }
    byte[] GenerateKeyBytes(string key)
    {
        using (var md5 = MD5.Create())
        {
            return md5.ComputeHash(Encoding.UTF8.GetBytes(key));
        }
    }
    string DecryptAES128(string encryptedMessage)
    {
        byte[] allTheBytes = Convert.FromBase64String(encryptedMessage);

        byte[] saltBytes = new byte[20];
        Buffer.BlockCopy(allTheBytes, 0, saltBytes, 0, saltBytes.Length);

        byte[] ivBytes = new byte[16];
        Buffer.BlockCopy(allTheBytes, saltBytes.Length, ivBytes, 0, ivBytes.Length);

        byte[] encryptedTextBytes = new byte[allTheBytes.Length - saltBytes.Length - ivBytes.Length];
        Buffer.BlockCopy(allTheBytes, saltBytes.Length + ivBytes.Length, encryptedTextBytes, 0, encryptedTextBytes.Length);

        byte[] keyBytes = GenerateKeyBytes(_secureKey);

        using (var aesAlg = Aes.Create())
        {
            aesAlg.Key = keyBytes;
            aesAlg.IV = ivBytes;
            aesAlg.Mode = CipherMode.CBC;
            aesAlg.Padding = PaddingMode.PKCS7;

            using (var decryptor = aesAlg.CreateDecryptor(keyBytes, aesAlg.IV))
            {
                using (var msDecrypt = new System.IO.MemoryStream(encryptedTextBytes))
                {
                    using (var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                    {
                        using (var srDecrypt = new System.IO.StreamReader(csDecrypt))
                        {
                            return srDecrypt.ReadToEnd();
                        }
                    }
                }
            }
        }
    }
}
 

 

728x90