/*
written by kaspy (kaspyx@gmail.com)
*/
RSA는 대단히 수학적인 알고리즘으로 200자리가 넘어가면 슈퍼컴퓨터로 푸는데만해도 1만년이상이 걸린다고 한다.
알고리즘은 두개의 소수 p,q 그리고 (p-1)*(q-1)의 서로소 d를 구하고
p,q,d는 비밀키로 개인이 보관(유출금지)한다.
그리고 p*q 의값 n과 e * d % (p-1)(q-1) = 1을 만족하는 e를 구한다.
n과 e는 공개키로 외부에게 공개할수있다.
p = 11, q = 17, d = 23
e = 7, n = 187
메시지가 m이라고 할때
암호화 c = ( m ^ e ) % n
복호화 d = ( c ^ d) % n
로 구할수있다. 큰 숫자를 다뤄야하는 특성상, 자바 자료형 BigInteger를 사용하여 구현하였다.
- 컴파일
javac RSAtest.java
- 실행
java RSAtest
- import java.math.BigInteger;
- import java.security.SecureRandom;
- import java.io.*;
- import java.util.*;
- class RSAtest
- {
- BigInteger p = new BigInteger("11"); // 비밀키 소수 p = 11
- BigInteger q = new BigInteger("17"); // 비밀키 소수 q = 17
- BigInteger d = new BigInteger("23"); // z = (p-1)(q-1) = 160의 소로소로 d는 23을 택하였습니다.
- BigInteger e = new BigInteger("7"); // e * d(7) mod 160 = 1 인 수 e는 7으로 정하였습니다. 공개키
- BigInteger n; // n = p *q 공개키
- RSAtest()
- {
- n = p.multiply(q); // 공개키 n = p * q
- }
- void encrypt_msg(BigInteger txt[])
- {
- System.out.println("암호화를 진행합니다.");
- for (int i=0; i < txt.length;i++ )
- {
- txt[i] = txt[i].modPow(e, n);
- }
- }
- void decrypt_msg(BigInteger txt[])
- {
- System.out.println("복호화를 진행합니다.");
- for (int i=0; i < txt.length;i++ )
- {
- txt[i] = txt[i].modPow(d, n);
- }
- }
- public static void main(String[] args)
- {
- RSAtest rsa = new RSAtest();
- BigInteger[] key;
- Scanner sc = new Scanner(System.in);
- String s,b;
- String t;
- Integer t2;
- System.out.println("평문을 입력해주세요.");
- s = sc.nextLine();
- key = new BigInteger[s.length()];
- for (int i=0;i < s.length() ;i++ )
- {
- t2 = (int)s.charAt(i);
- t = t2.toString();
- key[i] = new BigInteger(t);
- }
- // 암호화
- rsa.encrypt_msg(key);
- // 복호화
- rsa.decrypt_msg(key);
- s = key.toString();
- for(int i = 0; i < key.length; i++)
- {
- String s2 = key[i].toString();
- Integer integer = Integer.valueOf(Integer.parseInt(s2));
- int k = integer.intValue();
- System.out.printf("%c", new Object[] {
- Integer.valueOf(k)
- });
- }
- System.out.println();
- }
- }
* 참고 사이트
- http://pulsebeat.tistory.com/56
- http://reinliebe.tistory.com/79
'IT > Java' 카테고리의 다른 글
자바 리플렉션(Java Reflection) (0) | 2017.01.06 |
---|---|
Java로 달력(Calendar) 구현하기 (0) | 2015.05.18 |