'Rijndael'에 해당되는 글 1건

  1. 2006.03.28 [HowTo]Rijndael(AES) 암/복호화 코드(C#) (5)
C# & VB.NET2006. 3. 28. 15:31

AES는 미국 정부에서 민감한 정보들을 암호화하는 데 사용되는 표준 암/복호화 알고리즘이다. 현재 업계 표준이고, 아직까지는 알려진 약점이 없는 가장 안전한 암/복호화 알고리즘이다. 최근에 일부 SI 프로젝트에서는 이 방식을 꼭 쓸 것을 요구하기도 한다.

1. 암호화

private static string EncryptString(string InputText, string Password)
{

  // Rihndael class를 선언하고, 초기화
  RijndaelManaged RijndaelCipher = new RijndaelManaged();

  // 입력받은 문자열을 바이트 배열로 변환
  byte[] PlainText = System.Text.Encoding.Unicode.GetBytes(InputText);

  // 딕셔너리 공격을 대비해서 키를 더 풀기 어렵게 만들기 위해서
  // Salt를 사용한다.
  byte[] Salt = Encoding.ASCII.GetBytes(Password.Length.ToString());

  // PasswordDeriveBytes 클래스를 사용해서 SecretKey를 얻는다.
  PasswordDeriveBytes SecretKey = new PasswordDeriveBytes(Password, Salt);

  // Create a encryptor from the existing SecretKey bytes.
  // encryptor 객체를 SecretKey로부터 만든다.
  // Secret Key에는 32바이트
  // (Rijndael의 디폴트인 256bit가 바로 32바이트입니다)를 사용하고,
  // Initialization Vector로 16바이트
  // (역시 디폴트인 128비트가 바로 16바이트입니다)를 사용한다.
  ICryptoTransform Encryptor = RijndaelCipher.CreateEncryptor(SecretKey.GetBytes(32), SecretKey.GetBytes(16));

  // 메모리스트림 객체를 선언,초기화
  MemoryStream memoryStream = new MemoryStream();

  // CryptoStream객체를 암호화된 데이터를 쓰기 위한 용도로 선언
  CryptoStream cryptoStream = new CryptoStream(memoryStream, Encryptor, CryptoStreamMode.Write);

  // 암호화 프로세스가 진행된다.
  cryptoStream.Write(PlainText, 0, PlainText.Length);
 
  // 암호화 종료
  cryptoStream.FlushFinalBlock();

  // 암호화된 데이터를 바이트 배열로 담는다.
  byte[] CipherBytes = memoryStream.ToArray();

  // 스트림 해제
  memoryStream.Close();
  cryptoStream.Close();       

  // 암호화된 데이터를 Base64 인코딩된 문자열로 변환한다.
  string EncryptedData = Convert.ToBase64String(CipherBytes);

  // 최종 결과를 리턴
  return EncryptedData;
}

2. 복호화

private static string DecryptString(string InputText, string Password)
{
  RijndaelManaged  RijndaelCipher = new RijndaelManaged();

  byte[] EncryptedData = Convert.FromBase64String(InputText);
  byte[] Salt = Encoding.ASCII.GetBytes(Password.Length.ToString());       

  PasswordDeriveBytes SecretKey = new PasswordDeriveBytes(Password, Salt);

  // Decryptor 객체를 만든다.
  ICryptoTransform Decryptor = RijndaelCipher.CreateDecryptor(SecretKey.GetBytes(32), SecretKey.GetBytes(16));

  MemoryStream  memoryStream = new MemoryStream(EncryptedData);           

  // 데이터 읽기(복호화이므로) 용도로 cryptoStream객체를 선언, 초기화
  CryptoStream  cryptoStream = new CryptoStream(memoryStream, Decryptor, CryptoStreamMode.Read);

  // 복호화된 데이터를 담을 바이트 배열을 선언한다.
  // 길이는 알 수 없지만, 일단 복호화되기 전의 데이터의 길이보다는
  // 길지 않을 것이기 때문에 그 길이로 선언한다.
  byte[] PlainText = new byte[EncryptedData.Length];       

  // 복호화 시작
  int DecryptedCount = cryptoStream.Read(PlainText, 0, PlainText.Length);               

  memoryStream.Close();
  cryptoStream.Close();

  // 복호화된 데이터를 문자열로 바꾼다.
  string DecryptedData = Encoding.Unicode.GetString(PlainText, 0, DecryptedCount);

  // 최종 결과 리턴
  return DecryptedData;
}


참고: http://dotnet.org.za/deon/articles/2998.aspx
Posted by kkongchi

댓글을 달아 주세요

  1. 처음에는 input text, pwd하고 뭔지 몰랐어요...
    한차보니 왜 쌍인지 알겠네요.
    pwd가 키값이네요 ^^

    좋은정보 감사합니다.

    2009.05.19 21:44 [ ADDR : EDIT/ DEL : REPLY ]
    • 그런 부분에서 설명이 조금 부족했네요. 암튼 방문 감사드립니다. ^^

      2009.05.21 22:41 신고 [ ADDR : EDIT/ DEL ]
  2. 저기요

    실례지만요 제가 지금 이암호화를 써야되는데요... 질문하나만 여쭙겠습니다.

    중간에 Salt로 한번더 처리하시는등이 보이는데 이게 표준은 아니죠? 동일한 aes암호화가 vb로도 필요해서 찾았는데 vb로 생긴 값하고 틀려서요...

    표준 aes 코드로 만들려면 어느부분을 생략하면 될까요? 쫌 알려주세요~ 지금 오랫동안 찾아보고있습니다요~ (_._)

    2009.05.30 10:55 [ ADDR : EDIT/ DEL : REPLY ]
    • Salt를 쓰는 것은 한 번 더 꼬은 것입니다. ^^; 그 부분 빼시면 됩니다.

      2009.06.15 22:35 신고 [ ADDR : EDIT/ DEL ]
  3. 그건일

    Unity3D 에서도 되네요
    잘쓰겠습니다~

    2012.10.31 20:53 [ ADDR : EDIT/ DEL : REPLY ]