2014년 11월 16일 일요일

RSA java 예제


RSA는 비대칭키로 많이 사용되는 알고리즘입니다.
일반적인 암호화하면 비밀키가 있고 해당 비밀키로만 해제가 되는게 대칭키 알고리즘입니다.
하지만 RSA 공개키과 개인키 두개의 키가 존재하고 암호를 하는쪽에서는 공개키로 암호화를 하면 암호를 해독 하는 쪽에서는 개인키로만 해제가 가능합니다.
더 자세한 설명은 아래 wiki를 살펴보면 됩니다.
http://ko.wikipedia.org/wiki/RSA_%EC%95%94%ED%98%B8
최초 두개의 키를 만들때 두개의 곱셈을 이용하는 부분이 있어서 하나의 키를 알더라도 곱해지는 숫자를 알기 위해서는 소인수 분해를 해야하는데 키가 하나의 소수로 되어 있으며 상당히 큰 숫자로 되어있어 소인수 분해의 어려움이 있기 때문에 개인키 값을 알아내기 힘들게 됩니다.

아래는 RSA의 일반적인 사용에 대해서 그림으로 도식한 것 입니다. 복호화 하는쪽에서 공개키와 개인키를 만들어 공개키를 배포하게 됩니다.


(새로운 예제:각각 모듈이 나누어진 예제)

http://swlock.blogspot.com/2016/01/rsa-java-2-3.html



자바의 RSA 암호화 복호화 예제

package cmdlineJava;

import java.security.InvalidKeyException;
import java.security.Key;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SecureRandom;
import java.security.Security;
import java.security.spec.InvalidKeySpecException;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;

public class RSAexample {

 public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException, InvalidKeySpecException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
  Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

     byte[] input = "abcdefg hijklmn".getBytes();
     Cipher cipher = Cipher.getInstance("RSA/None/NoPadding", "BC");
     SecureRandom random = new SecureRandom();
     KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "BC");

     generator.initialize(128, random); // 여기에서는 128 bit 키를 생성하였음
     KeyPair pair = generator.generateKeyPair();
     Key pubKey = pair.getPublic();  // Kb(pub) 공개키
     Key privKey = pair.getPrivate();// Kb(pri) 개인키

     // 공개키를 전달하여 암호화
     cipher.init(Cipher.ENCRYPT_MODE, pubKey);
     byte[] cipherText = cipher.doFinal(input);
     System.out.println("cipher: ("+ cipherText.length +")"+ new String(cipherText));
     
     // 개인키를 가지고있는쪽에서 복호화
     cipher.init(Cipher.DECRYPT_MODE, privKey);
     byte[] plainText = cipher.doFinal(cipherText);
     System.out.println("plain : " + new String(plainText));
 }
}

실행결과
cipher 쪽은 random으로 인해 값이 바뀜

cipher: (16)뾡 쁴M%긵w?f?
plain : abcdefg hijklmn

위 코드 빌드시 bouncycastle 관련 에러가 난다면 아래 site에서 jar파일을 받아서 library를 추가 하시기 바랍니다.
http://www.bouncycastle.org/latest_releases.html

더 많은 RSA sample은 여기를 참고하시기 바랍니다.
http://www.java2s.com/Tutorial/Java/0490__Security/BasicRSAexample.htm

RSA 계산시 중간에 생성되는 값은 아래 site를 참고하시기 바랍니다.
http://xenon.stanford.edu/~tjw/jsbn/



댓글 3개:

  1. http://blog.naver.com/runajoker/220867343772 여기에 본문의 내용 포스팅 했습니다 출처는 밝혔습니다만 원치 않으시면 댓글같은거 남겨주시면 삭제 하겠습니다

    답글삭제
  2. 작성자가 댓글을 삭제했습니다.

    답글삭제