Private Function SymmetricEncryption( _ ByVal str As String, _ ByVal key As Byte(), _ ByVal IV As Byte()) As String Dim memStream As New IO.MemoryStream Try "--- RijndaelManaged 클래스의 새 인스턴스 생성 --- Dim RMCrypto As New RijndaelManaged "--- CryptoStream 클래스의 새 인스턴스 생성 --- Dim CryptStream As New CryptoStream(memStream, _ RMCrypto.CreateEncryptor(key, IV), _ CryptoStreamMode.Write) Dim SWriter As New StreamWriter(CryptStream) "--- 문자열 암호화 --- SWriter.Write(str) SWriter.Close() CryptStream.Close() "--- 암호화된 데이터를 문자열로 반환 --- Return System.Convert.ToBase64String(memStream.ToArray) Catch err As Exception Console.WriteLine(err.ToString) Return (String.Empty) End Try End Function이전에 알아본 함수에서는 암호화된 문자열이 Base64 형식으로 인코딩된 문자열로 반환된다. 주의할 것은 RijndaelManaged 클래스에서 허용가능한 키의 크기이다. 여러분은 다음의 코드를 이용하여 허용가능한 키의 크기를 확인해 볼 수 있다:
Dim ks() As KeySizes Dim RMCrypto As New RijndaelManaged ks = RMCrypto.LegalKeySizes "--- 여러가지 키의 크기를 출력 --- Console.WriteLine(ks(0).MaxSize) " 256 Console.WriteLine(ks(0).MinSize) " 128 Console.WriteLine(ks(0).SkipSize) " 64유효한 키의 크기는 다음과 같다: 16 바이트(128비트), 24바이트(128비트 + 64비트), 32바이트(256비트)
"--- 키 생성 --- RMCrypto.GenerateKey() Dim key As Byte() = RMCrypto.Key Console.WriteLine("Key : " & System.Convert.ToBase64String(key)) "---IV 생성 --- RMCrypto.GenerateIV() Dim IV As Byte() = RMCrypto.IV Console.WriteLine("IV : " & System.Convert.ToBase64String(IV))만약 IV가 사용될 때 null이면 자동적으로 GenerateIV()가 호출된다. 유효한 IV의 크기는 16 바이트이다.
Private Function SymmetricDecryption( _ ByVal str As String, _ ByVal key As Byte(), _ ByVal IV As Byte()) _ As String Try Dim s As String "--- 암호화된 문자열을 바이트 배열로 변환 --- Dim b As Byte() = System.Convert.FromBase64String(str) "--- 복호화하기 위해 바이트 배열을 메모리 스트림으로 변환 --- Dim memStream As New MemoryStream(b) Dim RMCrypto As New RijndaelManaged Dim CryptStream As New CryptoStream(memStream, _ RMCrypto.CreateDecryptor(key, IV), _ CryptoStreamMode.Read) "--- 스트림을 복호화 --- Dim SReader As New StreamReader(CryptStream) s = SReader.ReadToEnd "--- 복호화된 스트림을 문자열로 변환 --- s.ToString() SReader.Close() Return s Catch err As Exception Console.WriteLine(err.ToString) Return String.Empty End Try End Function다음의 코드는 문자열을 암호화하고 복호화하기 위해 SymmetricEncryption() 함수와 SymmetricDecryption() 함수를 어떻게 사용하는지 보여준다.
"--- 문자열 암호화 --- Dim cipherText As String = _ SymmetricEncryption("This is a string", key, IV) Console.WriteLine("Ciphertext: " & cipherText) "--- 문자열 복호화 --- Console.WriteLine("Original string: " & _ SymmetricDecryption(cipherText, key, IV))[그림 2]는 출력 결과를 보여준다.
Private Function AsymmetricEncryption( _ ByVal str As String, _ ByVal publicKey As String) _ As String "--- RSACryptoServiceProvider의 인스턴스 생성 --- Try Dim RSA As New RSACryptoServiceProvider "--- 공개키를 불러옴 --- RSA.FromXmlString(publicKey) Dim EncryptedStr() As Byte "--- 문자열을 암호화 --- EncryptedStr = RSA.Encrypt(ASCII.GetBytes(str), _ False) "--- 암호화된 바이트 배열을 문자열로 변환 --- Return System.Convert.ToBase64String(EncryptedStr) Catch err As Exception Console.WriteLine(err.ToString) Return String.Empty End Try End Function암호화된 문자열은 Base64 인코딩으로 반환된다. 공개키를 사용하여 암호화된 문자열을 복호화하기 위해 다음의 AsymmetricDecryption() 함수를 정의하였다. 이 함수는 암호화된 문자열과 비밀키로 사용할 문자열의 두 파라미터를 받아들이며 복호화된 문자열을 반환한다.
Private Function AsymmetricDecryption( _ ByVal str As String, _ ByVal privateKey As String) As String Try "--- RSACryptoServiceProvider의 인스턴스 생성 --- Dim RSA As New RSACryptoServiceProvider "--- 비밀키를 불러옴 --- RSA.FromXmlString(privateKey) "--- 문자열을 복호화 --- Dim DecryptedStr As Byte() = _ RSA.Decrypt(System.Convert.FromBase64String(str), False) "--- 복호화된 바이트 배열을 문자열로 변환 --- Return ASCII.GetString(DecryptedStr) Catch err As Exception Console.WriteLine(err.ToString) Return String.Empty End Try End Function다음의 코드는 문자열을 암호화하고 복호화하기 위해 AsymmetricEncryption() 함수와 AsymmetricDecryption() 함수를 어떻게 사용하는지 보여준다:
Dim publicKey, privateKey As String Dim RSA As New RSACryptoServiceProvider() "--- 공개키를 획득 --- publicKey = RSA.ToXmlString(False) Console.WriteLine("Public key: " & publicKey) Console.WriteLine() "--- 비밀키와 공개키를 획득 --- privateKey = RSA.ToXmlString(True) Console.WriteLine("Private key: " & privateKey) Console.WriteLine() "--- 문자열을 암호화 --- Dim cipherText As String = _ AsymmetricEncryption("This is a string", publicKey) Console.WriteLine("Ciphertext: " & cipherText) Console.WriteLine() "--- 문자열을 복호화 --- Console.WriteLine("Original string: " & _ AsymmetricDecryption(cipherText, privateKey)) Console.WriteLine()여러분은 RSACryptoServiceProvider 클래스에서 ToXmlString() 메서드를 이용하여 RSA 알고리즘에 의해 만들어진 공개키와 비밀키를 획득할 수 있다. 이 메서드는 Boolean 변수를 인자로 취하며 변수의 값으로 False가 전달될 경우 공개키를 반환한다. 만약 변수의 값으로 True가 주어지면 비밀키와 공개키 모두를 반환한다.
이전 글 : .NET의 암호화 API 사용하기(1)
다음 글 : .NET 애플리케이션에서의 인쇄 기능 관리(1)
최신 콘텐츠