달력

082010  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  
  •  
  •  
  •  

ASP.NET에서 파라미터 값을 암호화해서 실버라이트로 넘길려고 했습니다.
그리서 C#에서 많이 사용하는 RijndaelManaged 클래스를 사용할려고 하니 이런.. 헉!!~~
아니 실버라이트에서 지원을 안하네요.. ㅋㅋㅋ
그래서 실버라이트에서도 지원하는 AesManaged 클래스를 사용하여 암복호화를 하였습니다.

그럼 암복호화하는 클래스를 생성하고 사용방법을 알아보도록 하겠습니다.


1. 암복호화 클래스 작성

암복호화 클래스는 실버라이트와 ASP.NET에서 별도로 하나씩 만들어 줘야 합니다.
물론 같은 소스로 그대로.. ^^ 이유는 아실거라 생각합니다..

클래스를 하나 생성합니다. 저는 MyAesManaged 라는 이름으로 클래스를 생성했습니다.
일단 상단에 필요한 네임스페이지를 추가합니다.

using System.Security.Cryptography;
using System.Text;
using System.IO;

클래스 내용을 아래와 같이 작성해줍니다.
저는 static 클래스에 static 함수로 작성을 했습니다. 일반 함수로 작성 후 생성하여 사용하셔도 상관없습니다.

아래 파란색으로 된 PasswordKey, PasswordSalt 값은 원하는 값으로 설정을 하면됩니다.

public static class MyAesManaged
{
    private const string PasswordKey = "키 파생에 사용되는 암호입니다.";
    private const string PasswordSalt = "키 파생에 사용되는 키 솔트입니다.";

    /// <summary>
    /// 암호화
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    public static string Encrypt(string input)
    {
        return Convert.ToBase64String(Encrypt(Encoding.UTF8.GetBytes(input)));
    }

    /// <summary>
    /// 암호화
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    public static byte[] Encrypt(byte[] input)
    {
        byte[] retValue = null;

        using (Aes aes = new AesManaged())
        {
            Rfc2898DeriveBytes deriveBytes = new Rfc2898DeriveBytes(PasswordKey, Encoding.UTF8.GetBytes(PasswordSalt));
            MemoryStream ms = new MemoryStream();

            aes.Key = deriveBytes.GetBytes(aes.KeySize / 8);
            aes.IV = deriveBytes.GetBytes(aes.BlockSize / 8);


            using (CryptoStream cs = new CryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write))
            {
                cs.Write(input, 0, input.Length);
                cs.FlushFinalBlock();
            }

            retValue = ms.ToArray();
        }

        return retValue;
    }

    /// <summary>
    /// 복호화
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    public static string Decrypt(string input)
    {
        byte[] ret = Decrypt(Convert.FromBase64String(input));
        return Encoding.UTF8.GetString(ret, 0, ret.Length);

    }

    /// <summary>
    /// 복호화
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    public static byte[] Decrypt(byte[] input)
    {
        byte[] retValue = null;

        using (Aes aes = new AesManaged())
        {
            Rfc2898DeriveBytes deriveBytes = new Rfc2898DeriveBytes(PasswordKey, Encoding.UTF8.GetBytes(PasswordSalt));
            MemoryStream ms = new MemoryStream();

            aes.Key = deriveBytes.GetBytes(aes.KeySize / 8);
            aes.IV = deriveBytes.GetBytes(aes.BlockSize / 8);

            using (CryptoStream cs = new CryptoStream(ms, aes.CreateDecryptor(), CryptoStreamMode.Write))
            {
                cs.Write(input, 0, input.Length);
                cs.FlushFinalBlock();
            }

            retValue = ms.ToArray();
        }

        return retValue;
    }
}


2. ASP.NET 페이지에서 실버라이트로 넘길 데이터 암호화

저는 파라미터를 암호화해서 넘길려고 해당 클래스를 작성했습니다. 파라미터가 아닌 데이터 연동시 사용해도 좋을거 같습니다. 웹서비스를 이용해서 데이터를 가져올때 암호화해서 실버라이트로 넘기면 좋겠죠^^

아래 코드는 실버라이트로 넘기는 파라미터를 암호화해서 설정하는 코드입니다.
실버라이트의 컨트롤 이름이 slPlayer 입니다^^

string initParam = MyAesManaged.Encrypt("style=blue,code=120");
slPlayer.InitParameters = string.Format("ip={0}", initParam);


3. 실버라이트에서 ASP.NET에서 넘긴 데이터를 받아 복호화

ASP.NET에서 넘긴 파라미터를 받아 복호화한 후 일반 파라미터처럼 사용하도록 설정을 하도록 하겠습니다.
파라미터는 App.xaml.cs 파일에서 받아서 초기화를 하는 방법을 선택했습니다.

private void Application_Startup(object sender, StartupEventArgs e)
{
    if (e.InitParams.Keys.Contains("ip"))
    {
        string[] paramList = MyAesManaged.Decrypt(e.InitParams["ip"]).Split(',');

        foreach (string param in paramList)
        {
            string[] paramValue = param.Split('=');
            this.Resources.Add(paramValue[0], paramValue[1]);
        }

        this.RootVisual = new Page();
    }
    else
    {
        this.RootVisual = new Error();
    }
}


이상으로 실버라이트와 ASP.NET에서 공통으로 사용할 수 있는 암복호화 클래스를 작성해보고 사용하는 방법까지 알아보았습니다. 프로젝트 하시는데 도움이 되었으면 좋겠네요^^
Posted by 상현넘™

댓글을 달아 주세요