성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
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
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>도서 소개 - C#으로 배우는 암호학</h1> <p> 따끈따끈한 도서가 나왔는데요,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C#으로 이해하는 암호학 ; <a target='tab' href='http://www.upaper.net/alexylee/1134590'>http://www.upaper.net/alexylee/1134590</a> </pre> <br /> 덧셈 암호와 곱셈 암호를 <a target='tab' href='https://devblogs.microsoft.com/oldnewthing/20231106-00/?p=108971'>mod 연산</a>자 수식으로 설명한 부분이 재미있습니다. ^^<br /> <br /> 우선 알파벳 26글자에 대한 덧셈 암호를 보면, <br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C: 암호문 P: 평문 K: 키 C = (P + K) mod 26 P = (C + K<sup>-1</sup>) mod 26 </pre> <br /> 로 표현이 됩니다. 덧셈 암호에서 키(K)에 해당하는 값이 있다면 그것의 역원을 더해 항등원 0이 나와야 하므로, 단순하게 K<sup>-1</sup> = -K가 됩니다. 가령 K = 6일 때,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 0 = (K + K<sup>-1</sup>) mod 26 0 = 6 + (-6) mod 26 </pre> <br /> 결과가 나오고, 당연하겠지만 mod 26의 집합 Z<sub>26</sub> = { 0, 1, 2, ..., 25 }에서 (현실적으로는 0을 제외한) 모든 요소에 대해 키로 선택될 수 있습니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 이제 곱셈 암호를 볼까요?<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C = (P * K) mod 26 P = (C * K<sup>-1</sup>) mod 26 </pre> <br /> 선택된 키(K) 값에 대해 곱셈의 항등원인 1이 나오려면 1/K 값을 역원으로 선택하면 됩니다. 그렇긴 한데 일반적인 곱셈 연산이라면 1/K 값도 허용이 되겠지만, mod 연산에서는 실숫값이 허용이 안 된다는 점이 중요합니다. 예를 들어, P = 1, K = 3이라고 할 때,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 3 = (<span style='color: blue; font-weight: bold'>1</span> * 3) mod 26 <span style='color: blue; font-weight: bold'>1</span> = (3 * (1/3)) mod 26 </pre> <br /> (C * K<sup>-1</sup>)의 결괏값이 정수가 될 것이기 때문에 mod 연산을 할 수 있는 경우도 있지만, P = 9, K = 3인 경우에는,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 1 = (<span style='color: blue; font-weight: bold'>9</span> * 3) mod 26 <span style='color: blue; font-weight: bold'>?</span> = (1 * (1/3)) mod 26 </pre> <br /> 보는 바와 같이 mod 연산이 가능하지 않습니다. 여기서 재미있는 것은, 곱셈의 역원이 mod 연산에서 꼭 1/K 값일 필요는 없다는 점입니다. 결국, 곱셈의 항등원이 1만 나오면 되기 때문에 다음의 식을 만족하는 수가 있으면 되는데,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 1 = (K * K<sup>-1</sup>) mod 26 </pre> <br /> 가령 K = 3이라고 할 때, 집합 Z<sub>26</sub> = { 0, 1, 2, ..., 25 }에서 찾아 보면, 9가 역원으로 될 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 1 = (3 * 9) mod 26 </pre> <br /> 따라서, P = 7일 때, K = 3, K<sup>-1</sup> = 9로 mod 연산을 하면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 21 = (<span style='color: blue; font-weight: bold'>7</span> * 3) mod 26 <span style='color: blue; font-weight: bold'>7</span> = (21 * 9) mod 26 </pre> <br /> 암/복호화 연산이 자연스럽게 이뤄집니다.<br /> <br /> 여기서 더욱 재미있는 것은, 곱셈 연산의 특성상 0이 나오면 복호화를 할 수 없다는 점입니다. 가령, P = 13, K = 2라고 하면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 0 = (13 * 2) mod 26 0 = (0 * K<sup>-1</sup>) mod 26 </pre> <br /> (사실 2에 대한 mod 26 연산의 역원도 존재하지 않지만) 어떤 inv(K) 값이 와도 결과가 0이 되므로 복호화 연산이 가능하지 않게 됩니다. 따라서, 곱셈 암호의 경우 (덧셈 암호와는 달리) 집합 Z<sub>26</sub> = { 0, 1, 2, ..., 25 }에서 키로 선택되려면 mod 26의 결과가 0이 나오면 안 된다는 제약이 있습니다.<br /> <br /> 이를 달리 말하면, 26과 서로소인 수만 키로써 자격이 있게 됩니다. 따라서 위에서 예를 든 { 2, 13 } 쌍을 비롯해 { 4, 13 }, { 6, 13 }, { 8, 13 }, { 10, 13 }, { 12, 13 }, { 13, 12 }, { 14, 13 }, { 16, 13 }, { 18, 13 }, { 20, 13 }, { 22, 13 }, { 24, 13 }의 쌍들은 모두 mod 26에 대해 0이 나오므로 { 2, 4, 6, 8, 10, 12, 13, 14, 16, 18, 20, 22, 24 }는 키값으로 선택될 수 없습니다.<br /> <br /> 이것을 다르게 생각해 보면, 만약 "mod n"의 연산에서 'n' 값이 소수라면 당연히 집합 Z<sub>n</sub> = { 0, 1, 2, ..., n - 1 }의 (0과 현실적으로 1을 제외한) 모든 값들이 키로 선택될 수 있다는 결론이 나옵니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 이에 기반을 둬서 <a target='tab' href='https://www.sysnet.pe.kr/2/0/11140#rsa_exp'>RSA의 암호화에 해당하는 mod 계산</a>을 볼까요?<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > [암호화] C = P<sup>k</sup> mod N [복호화] C<sup>inv(k)</sup> ≡ P mod N </pre> <br /> (덧셈 암호, 곱셈 암호로 바라보던 시각을 적용해 보면) RSA는 지수 암호라고 생각할 수 있습니다. (실제로 "지수 암호"라는 단어는 안 쓰는 것 같습니다. ^^)<br /> <br /> 다시 역으로 달리 생각해 보면, 곱셈 암호를 (쉽게 복호화 키를 알아낼 수 있어 부적절하지만) 비대칭 암호화의 한 사례로 볼 수 있습니다. 즉, 이 글의 예제에서 보면 공개키로 (3, 26) 쌍을 사용하고 개인키로 (9, 26) 쌍을 사용해 암호화 키와 복호화 키가 다른 것입니다.<br /> <br /> 이렇게 재미있는 이야기들이 ^^ 책에 나오니, 관심 있으신 분들은 <a target='tab' href='http://www.upaper.net/alexylee/1134590'>e-book을 구매</a>하시면 도움이 될 것입니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 참고로, 이 글에 실은 수식은 책에도 나오지만 다음과 같은 웹상의 자료에도 있어 인용을 해봤습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 치환암호 ; <a target='tab' href='http://wiki.hash.kr/index.php/%EC%B9%98%ED%99%98%EC%95%94%ED%98%B8'>http://wiki.hash.kr/index.php/%EC%B9%98%ED%99%98%EC%95%94%ED%98%B8</a> </pre> <br /> 그리고 기왕에 언급이 되었으니 다음의 정리된 글들도 한 번쯤 보시고. ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > RSAParameters 와 System.Numerics.BigInteger 이야기 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/1295'>https://www.sysnet.pe.kr/2/0/1295</a> RSAParameters와 RSA ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/11140'>https://www.sysnet.pe.kr/2/0/11140</a> C# - Rabin-Miller 소수 생성 방법을 이용하여 RSACryptoServiceProvider의 개인키를 직접 채워보자 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/1300'>https://www.sysnet.pe.kr/2/0/1300</a> C# - Rabin-Miller 소수 생성 방법을 이용하여 RSACryptoServiceProvider의 개인키를 직접 채워보자 - 두 번째 이야기 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/10925'>https://www.sysnet.pe.kr/2/0/10925</a> </pre> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1645
(왼쪽의 숫자를 입력해야 합니다.)