성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Roll A Lisp In C - Reading ; https...
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<span> <br /> 이번 글은, 순전히 다음 블로그 글의 내용을 가져온 것에 불과합니다. (원래 이쪽 "아티클"란에는 가능한 제가 직접 쓴 내용을 다루고 싶은데... 많은 분들이 "외부 자원" 게시판을 상대적으로 덜 이용하기 때문에 여기에 실었습니다.)<br /> <br /> <pre class='code'> 1. New Crypto Algorithms in Orcas ; <a target='_tab' href='https://docs.microsoft.com/en-us/archive/blogs/shawnfa/new-crypto-algorithms-in-orcas'>https://docs.microsoft.com/en-us/archive/blogs/shawnfa/new-crypto-algorithms-in-orcas</a> 2. Elliptic Curve DSA ; <a target='_tab' href='https://docs.microsoft.com/en-us/archive/blogs/shawnfa/elliptic-curve-dsa'>https://docs.microsoft.com/en-us/archive/blogs/shawnfa/elliptic-curve-dsa</a> 3. Elliptic Curve Diffie-Hellman ; <a target='_tab' href='https://docs.microsoft.com/en-us/archive/blogs/shawnfa/elliptic-curve-diffie-hellman'>https://docs.microsoft.com/en-us/archive/blogs/shawnfa/elliptic-curve-diffie-hellman</a> </pre> <br /> <span class='subLastTitle'>"1. New Crypto Algorithms in Orcas"</span> <br /> 먼저, "<a target='_tab' href='https://docs.microsoft.com/en-us/archive/blogs/shawnfa/new-crypto-algorithms-in-orcas'>1. New Crypto Algorithms in Orcas</a>" 내용에서는 Orcas에서 소개되는 새로운 암호화 관련 클래스들을 소개해 주고 있습니다. 특히나 주의깊게 봐야 할 것은 "CNG" 접미사가 붙은 클래스들인데요. 이런 종류의 클래스들은 모두 "Vista", "Longhorn"에서만 동작되는 것임을 주의하십시오.<br /> <br /> 여기서는 Orcas를 기준으로 설명을 하겠지만, 만약 C/C++ 개발자라면 다음과 같은 툴킷을 설치함으로써 VS.NET 2005에서도 컴파일을 할 수가 있습니다. (Windows SDK에도 포함되어 있는 것으로 알고 있습니다.)<br /> <br /> <pre class='code'> Microsoft® Windows® Cryptographic Next Generation Software Development Kit for Windows Vista - English ; <a target='_tab' href='http://www.microsoft.com/downloads/details.aspx?FamilyID=1EF399E9-B018-49DB-A98B-0CED7CB8FF6F&displaylang=en'>http://www.microsoft.com/downloads/details.aspx?FamilyID=1EF399E9-B018-49DB-A98B-0CED7CB8FF6F&displaylang=en</a> </pre> <br /> "<a target='_tab' href='https://docs.microsoft.com/en-us/archive/blogs/shawnfa/new-crypto-algorithms-in-orcas'>1. New Crypto Algorithms in Orcas</a>"에서 소개된 "Hash / Symmetric / Asymmetric" 관련 클래스 중에서 오늘 소개해 드릴 것은 마지막 부분의 "Asymmetric Algorithms"에 추가된 "Elliptic Curve DSA", "Elliptic Curve Diffie-Hellman"입니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> <span class='subLastTitle'>2. Elliptic Curve DSA</span> <br /> 이미 이전 버전의 .NET 버전에서도 DSACryptoServiceProvider라는 이름의 해시 클래스를 제공하고 있는데, .NET 3.5에서는 이보다 더 진화된 알고리즘을 적용시킨 "ECDsaCng" 클래스를 추가시켰습니다. 아래에 보시는 것처럼, 사용법도 상당히 간단합니다.<br /> <br /> <pre class='code'> using System.Security.Cryptography; // System.Core.dll 참조 추가 <b>ECDsaCng</b> dsa = new <b>ECDsaCng</b>(); // 생성자에서 random-key 키가 생성됨. dsa.HashAlgorithm = CngAlgorithm.Sha256; byte[] data = new byte[] { 21, 5, 8, 12, 2007 }; byte[] signature = dsa.<b>SignData</b>(data); if (dsa.<b>VerifyData</b>(data, signature)) Console.WriteLine("Verified"); else Console.WriteLine("Not verified"); </pre> <br /> 뭐... 별다른 설명의 여지가 필요 없겠지요. ^^<br /> <br /> <hr style='width: 50%' /><br /> <br /> <span class='subLastTitle'>3. Elliptic Curve Diffie-Hellman</span> <br /> 직접적인 암호화 클래스는 아니지만, "키 교환"을 위한 알고리즘으로 ECDiffieHellmanCng 클래스도 추가되었습니다. 사용 코드는 다음과 같습니다.<br /> <br /> <pre class='code'> ==== alice의 컴퓨터에 있는 A 프로그램 ==== <b>ECDiffieHellmanCng</b> alice = new <b>ECDiffieHellmanCng</b>(); alice.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash; alice.HashAlgorithm = CngAlgorithm.Sha256; SendAliceKeyToBob(alice.PublicKey); // Bob에게 전달 ECDiffieHellmanPublicKey bob = GetKeyFromBob(); // Bob의 공개키를 수신 byte[] bobKey = alice.DeriveKeyMaterial(bob); // Bob의 공개키로부터 암호화 키를 생성 ==== Bob의 컴퓨터에 있는 B 프로그램 ==== <b>ECDiffieHellmanCng</b> bob = new <b>ECDiffieHellmanCng</b>(); bob.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash; bob.HashAlgorithm = CngAlgorithm.Sha256; SendBobKeyToAlice(bob.PublicKey); // Alice에게 전달 ECDiffieHellmanPublicKey aliceKey = GetKeyFromAlice(); // Alice의 공개키를 수신 byte[] aliceKey = bob.DeriveKeyMaterial(aliceKey); </pre> <br /> 위와 같이 서로에게 임의로 생성된 공개키를 전달해준 다음 아래와 같이 각자 상대방의 키로부터 실제 "암호화"에 사용될 키를 생성해서 사용합니다.<br /> <br /> <pre class='code'> ==== alice의 컴퓨터에 있는 A 프로그램 ==== AesCryptoServiceProvider aes = new AesCryptoServiceProvider(); aes.Key = bobKey; ==== Bob의 컴퓨터에 있는 B 프로그램 ==== AesCryptoServiceProvider aes = new AesCryptoServiceProvider(); aes.Key = aliceKey; </pre> <br /> 여기서 한 가지 주의할 점이 있는데요. 보시는 것처럼, 위와 같은 "Diffie-Hellman" 암호화 알고리즘으로 적용되어 공개키를 서로 교환해 봤자 "man-in-the-middle 공격"을 피할 수는 없습니다. 바로 이런 단점을 보완하기 위해서 PKI를 사용해야 한다고 언급이 되어져 있는데요. 이렇게 되면 결국, 위의 "Diffie-Hellman" 알고리즘을 사용한다고 해도 기존처럼 인증서 등을 사용해야 한다는 점에는 변함이 없게 됩니다.<br /> <br /> <br /> <br /><br /><hr /><span style='color: Maroon'>[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </span>
첨부파일
스팸 방지용 인증 번호
2042
(왼쪽의 숫자를 입력해야 합니다.)