DES 암호화는 암호화와 복호화를 같은 키로 하는 대칭키 방식의 방법이다.
인터넷에 나오는 코드들을 보니 거의 파일스트림을 이용해서 파일에 바로 쓰는 방법의 예제밖에 없어서
바로 string으로 변환하는 방법이 없을까 찾아보다가 마소공식 문서보고 따라하게 되었다.
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 32 33 34 35 36 37 38 39 40 | using System.Security; using System.Security.Cryptography; using System.Text; private string password = "goldapple"; //암호화 키. private string key = "20484096"; private void Start() { DESCryptoServiceProvider des = new DESCryptoServiceProvider(); // 대칭키 배치 des.Key = ASCIIEncoding.ASCII.GetBytes(key); des.IV = ASCIIEncoding.ASCII.GetBytes(key); string EncStr = DESEncrypt(des, password); string DecStr = DESDecrypt(des, EncStr); print(password); print(EncStr); print(DecStr); } private string DESEncrypt(DESCryptoServiceProvider des, string password) { byte[] inBlock = UnicodeEncoding.Unicode.GetBytes(password); ICryptoTransform Encrypt = des.CreateEncryptor(); byte[] outBlock = Encrypt.TransformFinalBlock(inBlock, 0, inBlock.Length); return System.Convert.ToBase64String(outBlock); } private string DESDecrypt(DESCryptoServiceProvider des, string encodedPassword) { byte[] inBlock = System.Convert.FromBase64String(encodedPassword); ICryptoTransform Decrypt = des.CreateDecryptor(); byte[] outBlock = Decrypt.TransformFinalBlock(inBlock, 0, inBlock.Length); return UnicodeEncoding.Unicode.GetString(outBlock); } | cs |
주의할 점은 내부 동작로직이 유니코드로 변환해야만 제대로 작동되는것 같다.
TransformFinalBlock에 inputBuffer는 UnicodeEncoding.Unicode.GetBytes()로만 변환해야 제대로 작동하더라.
그래서 Encrypt의 inBlock도 유니코드로 인코딩하였고. (26번째줄)
Decrypt의 최종결과도 다시 유니코드로 변환하여 리턴하였다. (39번째줄)
Encrypt의 리턴값과 Decrypt의 입력값에 System.Convert를 사용한 이유는 (30, 35번째줄)
유니코드로 변환하니 string 상으로는 제대로 들어가있어 암호화 복호화 로직 자체는 문제없는데
유니티상에서 출력할 수 없는 값으로 들어가는것 같더라.
그래서 System.Convert.ToBase64String으로 리턴하여 에디터상에서 확인할 수 있게하였고
같은 방법으로 다시 byte배열로 변환하여 기존 암호화의 outBlock을 그대로 inBlock으로 가져올수있게 하였다.
잘나옴
아까 위에 적어놓은대로 유니코드로 변환할시.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | private string DESEncrypt(DESCryptoServiceProvider des, string password) { byte[] inBlock = UnicodeEncoding.Unicode.GetBytes(password); ICryptoTransform Encrypt = des.CreateEncryptor(); byte[] outBlock = Encrypt.TransformFinalBlock(inBlock, 0, inBlock.Length); //return System.Convert.ToBase64String(outBlock); return UnicodeEncoding.Unicode.GetString(outBlock); } private string DESDecrypt(DESCryptoServiceProvider des, string encodedPassword) { //byte[] inBlock = System.Convert.FromBase64String(encodedPassword); byte[] inBlock = UnicodeEncoding.Unicode.GetBytes(encodedPassword); ICryptoTransform Decrypt = des.CreateDecryptor(); byte[] outBlock = Decrypt.TransformFinalBlock(inBlock, 0, inBlock.Length); return UnicodeEncoding.Unicode.GetString(outBlock); } | cs |
이번에는 원본, 복호화, 암호화순으로 출력했다. (에러때문에)
암호화는 잘되어 복호화도 문제없이 잘 작동. 제대로 출력되지만 암호화된 값은 utf-16 변환 문제 때문에 에러가 발생.
'프로그래밍 공부 > WPF' 카테고리의 다른 글
스크린 캡쳐하기 (0) | 2018.11.26 |
---|---|
GoogleCloudVision API 사용하기 (이미지분석 텍스트 추출) (0) | 2018.11.26 |
C# RSA 암호화 (비대칭키 - 공개키 개인키) (1) | 2018.10.12 |
웹소켓 사용하기 - 2. 클라이언트 설정 (0) | 2018.06.05 |
웹소켓 사용하기 - 1.서버 설정 (0) | 2018.06.05 |