Microsoft MVP성태의 닷넷 이야기
기타: 78. 도서 소개 - C#으로 배우는 암호학 [링크 복사], [링크+제목 복사],
조회: 18879
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

도서 소개 - C#으로 배우는 암호학

따끈따끈한 도서가 나왔는데요,

C#으로 이해하는 암호학 
; http://www.upaper.net/alexylee/1134590

덧셈 암호와 곱셈 암호를 mod 연산자 수식으로 설명한 부분이 재미있습니다. ^^

우선 알파벳 26글자에 대한 덧셈 암호를 보면,

C: 암호문
P: 평문
K: 키

C = (P + K) mod 26

P = (C + K-1) mod 26

로 표현이 됩니다. 덧셈 암호에서 키(K)에 해당하는 값이 있다면 그것의 역원을 더해 항등원 0이 나와야 하므로, 단순하게 K-1 = -K가 됩니다. 가령 K = 6일 때,

0 = (K + K-1) mod 26
0 = 6 + (-6) mod 26

결과가 나오고, 당연하겠지만 mod 26의 집합 Z26 = { 0, 1, 2, ..., 25 }에서 (현실적으로는 0을 제외한) 모든 요소에 대해 키로 선택될 수 있습니다.




이제 곱셈 암호를 볼까요?

C = (P * K) mod 26
P = (C * K-1) mod 26

선택된 키(K) 값에 대해 곱셈의 항등원인 1이 나오려면 1/K 값을 역원으로 선택하면 됩니다. 그렇긴 한데 일반적인 곱셈 연산이라면 1/K 값도 허용이 되겠지만, mod 연산에서는 실숫값이 허용이 안 된다는 점이 중요합니다. 예를 들어, P = 1, K = 3이라고 할 때,

3 = (1 * 3) mod 26
1 = (3 * (1/3)) mod 26

(C * K-1)의 결괏값이 정수가 될 것이기 때문에 mod 연산을 할 수 있는 경우도 있지만, P = 9, K = 3인 경우에는,

1 = (9 * 3) mod 26
? = (1 * (1/3)) mod 26

보는 바와 같이 mod 연산이 가능하지 않습니다. 여기서 재미있는 것은, 곱셈의 역원이 mod 연산에서 꼭 1/K 값일 필요는 없다는 점입니다. 결국, 곱셈의 항등원이 1만 나오면 되기 때문에 다음의 식을 만족하는 수가 있으면 되는데,

1 = (K * K-1) mod 26

가령 K = 3이라고 할 때, 집합 Z26 = { 0, 1, 2, ..., 25 }에서 찾아 보면, 9가 역원으로 될 수 있습니다.

1 = (3 * 9) mod 26

따라서, P = 7일 때, K = 3, K-1 = 9로 mod 연산을 하면,

21 = (7 * 3) mod 26
7 = (21 * 9) mod 26

암/복호화 연산이 자연스럽게 이뤄집니다.

여기서 더욱 재미있는 것은, 곱셈 연산의 특성상 0이 나오면 복호화를 할 수 없다는 점입니다. 가령, P = 13, K = 2라고 하면,

0 = (13 * 2) mod 26
0 = (0 * K-1) mod 26

(사실 2에 대한 mod 26 연산의 역원도 존재하지 않지만) 어떤 inv(K) 값이 와도 결과가 0이 되므로 복호화 연산이 가능하지 않게 됩니다. 따라서, 곱셈 암호의 경우 (덧셈 암호와는 달리) 집합 Z26 = { 0, 1, 2, ..., 25 }에서 키로 선택되려면 mod 26의 결과가 0이 나오면 안 된다는 제약이 있습니다.

이를 달리 말하면, 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 }는 키값으로 선택될 수 없습니다.

이것을 다르게 생각해 보면, 만약 "mod n"의 연산에서 'n' 값이 소수라면 당연히 집합 Zn = { 0, 1, 2, ..., n - 1 }의 (0과 현실적으로 1을 제외한) 모든 값들이 키로 선택될 수 있다는 결론이 나옵니다.




이에 기반을 둬서 RSA의 암호화에 해당하는 mod 계산을 볼까요?

[암호화]
C = Pk mod N

[복호화]
Cinv(k) ≡ P mod N

(덧셈 암호, 곱셈 암호로 바라보던 시각을 적용해 보면) RSA는 지수 암호라고 생각할 수 있습니다. (실제로 "지수 암호"라는 단어는 안 쓰는 것 같습니다. ^^)

다시 역으로 달리 생각해 보면, 곱셈 암호를 (쉽게 복호화 키를 알아낼 수 있어 부적절하지만) 비대칭 암호화의 한 사례로 볼 수 있습니다. 즉, 이 글의 예제에서 보면 공개키로 (3, 26) 쌍을 사용하고 개인키로 (9, 26) 쌍을 사용해 암호화 키와 복호화 키가 다른 것입니다.

이렇게 재미있는 이야기들이 ^^ 책에 나오니, 관심 있으신 분들은 e-book을 구매하시면 도움이 될 것입니다.




참고로, 이 글에 실은 수식은 책에도 나오지만 다음과 같은 웹상의 자료에도 있어 인용을 해봤습니다.

치환암호
; http://wiki.hash.kr/index.php/%EC%B9%98%ED%99%98%EC%95%94%ED%98%B8

그리고 기왕에 언급이 되었으니 다음의 정리된 글들도 한 번쯤 보시고. ^^

RSAParameters 와 System.Numerics.BigInteger 이야기
; https://www.sysnet.pe.kr/2/0/1295

RSAParameters와 RSA
; https://www.sysnet.pe.kr/2/0/11140

C# - Rabin-Miller 소수 생성 방법을 이용하여 RSACryptoServiceProvider의 개인키를 직접 채워보자
; https://www.sysnet.pe.kr/2/0/1300

C# - Rabin-Miller 소수 생성 방법을 이용하여 RSACryptoServiceProvider의 개인키를 직접 채워보자 - 두 번째 이야기
; https://www.sysnet.pe.kr/2/0/10925




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 11/7/2023]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 136  137  [138]  139  140  141  142  143  144  145  146  147  148  149  150  ...
NoWriterDateCnt.TitleFile(s)
1638정성태2/18/201446076Windows: 90. 실행 파일로부터 관리자 요구 권한을 제거하는 방법(부제: 크랙 버전을 보다 안전하게 실행하는 방법) [8]
1637정성태2/14/201426935Windows: 89. 컴퓨터를 껐는데도 어느 순간 자동으로 켜진다면? - 두 번째 이야기
1636정성태2/14/201423020Windows: 88. Hyper-V가 설치된 컴퓨터의 윈도우 백업 설정
1635정성태2/14/201423859오류 유형: 221. SharePoint - System.InvalidOperationException: The farm is unavailable.
1634정성태2/14/201424020.NET Framework: 424. C# - CSharpCodeProvider로 컴파일한 메서드의 실행이 일반 메서드보다 더 빠르다? [1]파일 다운로드1
1633정성태2/13/201426900오류 유형: 220. 2014년 2월 13일 이후로 Visual Studio 2010 Macro가 동작하지 않는다면? [3]
1632정성태2/12/201444897.NET Framework: 423. C#에서 DirectShow를 이용한 미디어 재생 [2]파일 다운로드1
1631정성태2/11/201423654개발 환경 구성: 217. Realtek 사운드 장치에서 재생되는 오디오를 GraphEditor로 녹음하는 방법
1630정성태2/5/201424135개발 환경 구성: 216. Hyper-V에 올려진 윈도우 XP VM에서 24bit 컬러 및 ClearType 활성화하는 방법
1629정성태2/5/201433898개발 환경 구성: 215. DOS batch - 하나의 .bat 파일에서 다중 .bat 파일을 (비동기로) 실행하는 방법 [1]
1628정성태2/4/201435266Windows: 87. 윈도우 8.1에서 .NET 3.5 설치가 안된다면? [2]
1627정성태2/4/201430336개발 환경 구성: 214. SQL Server Reporting Services를 이용해 간단한 리포트 제작하는 방법
1626정성태2/4/201422353Windows: 86. 윈도우 8.1의 Skydrive 내용이 동기화가 안된다면?
1625정성태2/2/201429433.NET Framework: 422. C++과 C#의 Event 공유파일 다운로드1
1624정성태2/2/201425125.NET Framework: 421. ASP.NET에서 Server.CreateObject와 COM Interop 클래스 생성의 차이점
1623정성태2/1/201429867개발 환경 구성: 213. x86/x64별로 나뉘어진 어셈블리를 한 프로젝트에서 참조하는 방법 [1]파일 다운로드1
1622정성태1/31/201430190VC++: 74. 어떤 것을 쓰면 좋을까요? wvnsprintf, _vsnwprintf_s, StringCbVPrintfW [4]
1621정성태1/31/201422015.NET Framework: 420. 베트남의 11학년(한국의 고2)이 45분만에 푼다는 알고리즘 문제파일 다운로드1
1620정성태1/30/201432085.NET Framework: 419. C# - BigDecimal파일 다운로드1
1619정성태1/30/201428763VS.NET IDE: 85. T4를 이용한 INotifyPropertyChanged 코드 자동 생성파일 다운로드1
1618정성태1/29/201444376Linux: 2. 우분투에서 Active Directory 계정을 이용한 파일 공유
1617정성태1/29/201425669.NET Framework: 418. Thread.Abort 호출의 hang 현상 [1]
1616정성태1/29/201426227디버깅 기술: 63. windbg 디버깅 사례: AppDomain 간의 static 변수 사용으로 인한 crash
1615정성태1/29/201428048.NET Framework: 417. WPF WebBrowser 컨트롤에서 SHDocVw.IWebBrowser2 인터페이스를 구하는 방법 및 순수 WPF 웹 브라우저 컨트롤 소개
1614정성태1/29/201425093.NET Framework: 416. System.Net.Sockets.NetworkStream이 Thread-safe할까?파일 다운로드1
1613정성태1/29/201426977.NET Framework: 415. IIS 작업자 프로세스 재생(recycle)하는 방법 [1]
... 136  137  [138]  139  140  141  142  143  144  145  146  147  148  149  150  ...