'RSA'에 해당되는 글 1건

  1. 2012.06.20 java RSA 암호화(미리저장되어있는 키를 사용) key 설정 (4)

RSA 암호화를 사용하게 되었습니다.

앞글에서 언급했드시 seed, des , 등 이것저것 다 사용하는군요.ㅎㅎㅎ


지금까지 그랬드시

"이론, 배경지식, 그런거 벌써 검색을 통해 다 이해했으니

(혹은 개발시간도 별로 없고 바쁘니깐 그냥 소스를 알려달라!)"


하시는 분을위해 기본 소스를 먼저 공개하겠습니다.


import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.spec.RSAPrivateKeySpec;
import java.security.spec.RSAPublicKeySpec;
import javax.crypto.Cipher;
public class TestRsa
{
 public static void main( String [] args )
 {
  try
  {
   // RSA 공개키/개인키를 생성한다.
   KeyPairGenerator clsKeyPairGenerator = KeyPairGenerator.getInstance("RSA");
   clsKeyPairGenerator.initialize(2048);
  
   KeyPair clsKeyPair = clsKeyPairGenerator.genKeyPair();
   Key clsPublicKey = clsKeyPair.getPublic();
   Key clsPrivateKey = clsKeyPair.getPrivate();
   KeyFactory fact = KeyFactory.getInstance("RSA");
   RSAPublicKeySpec clsPublicKeySpec = fact.getKeySpec( clsPublicKey, RSAPublicKeySpec.class);
   RSAPrivateKeySpec clsPrivateKeySpec = fact.getKeySpec( clsPrivateKey, RSAPrivateKeySpec.class);
   System.out.println( "public key modulus(" + clsPublicKeySpec.getModulus( ) + ") exponent(" + clsPublicKeySpec.getPublicExponent( ) + ")" );
   System.out.println( "private key modulus(" + clsPrivateKeySpec.getModulus( ) + ") exponent(" + clsPrivateKeySpec.getPrivateExponent( ) + ")" );
  
   // 암호화 한다.
   String strPinNumber = "1234567890";
  
   Cipher clsCipher = Cipher.getInstance("RSA");
   clsCipher.init( Cipher.ENCRYPT_MODE, clsPublicKey );
    byte[] arrCipherData = clsCipher.doFinal( strPinNumber.getBytes( ) );
    String strCipher = new String( arrCipherData );
    System.out.println( "cipher(" + strCipher + ")" );
   
    // 복호화 한다.
    clsCipher.init( Cipher.DECRYPT_MODE, clsPrivateKey );
    byte[] arrData = clsCipher.doFinal( arrCipherData );
   
    String strResult = new String( arrData );
    System.out.println( "result(" + strResult + ")" );
  }
  catch( Exception e )
  {
  
  }
 }
}


위와 같습니다.

그런데 문제는 실제 필드에서는 이렇게 사용하지 않죠.ㅎㅎㅎ

이유는 서버와 클라이언트간에 통신을 하는데

위의 소스는 그냥 로컬에서 스스로 인코딩하고 디코딩하는 로직입니다.

당연히 서버와 클라이언트간에 키공유 이슈는 빠져있습니다.


"그래 그래 당연하지 . 그러니깐 긴말하지 말고 당장 소스를 내놔라! 바빠죽겠다."


머 패킷통신으로 주거니 받거니 하는건 설명하지 않겠습니다.

결국 cipher 로 암호화하기 위해서는 publicKey 가 필요한데 파일에 저정되어있던 디비에 저장되어있던 하던 아니면 통신으로 받던 바이트배열형식으로 암호화기가 되어있다면 이것을 publiKey로 바꿔야합니다.

그래야 init을 하니깐요. private 도 마찮가기겠지요.


publicKey를 만드는 방법은


KeyFactory fac = KeyFactory.getInstance("RSA");
X509EncodedKeySpec x509Spec = new X509EncodedKeySpec(key); // key 가 바로 byte 배열
PublicKey publicKey = fac.generatePublic(x509Spec);


privateKey를 만드는 방법은


KeyFactory fac = KeyFactory.getInstance("RSA");
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(key);
PrivateKey privateKey = fac.generatePrivate(keySpec);


이상입니다. 끝!

Posted by 빨강토끼
TAG ,

댓글을 달아 주세요

  1. jhlee 2014.06.27 17:30  댓글주소  수정/삭제  댓글쓰기

    글 잙일었습니다.

    저기 궁금 한게 있는데요
    1. Key clsPublicKey = clsKeyPair.getPublic();
    Key clsPrivateKey = clsKeyPair.getPrivate();
    --> 여기서 공개키 개인키가 생성이 된건가요?

    2. 그리고 실제 필드에선 이렇게 사용안한다고 하시고
    publickey만드는 방법 privateKey만드는 방법은 이렇게 하셨는데
    여기도 공개키 개인키를 만든건가요??

    만약 같다면 1번과 2번의 차임점이 뭔지 알수 있을까요?? 둘다 똑같은 공개키 개인키라는 건데.

    3. 그리고
    clsPublicKeySpec.getModulus( ) clsPublicKeySpec.getPublicExponent( )

    이두개의 값이 어디에 쓰이나요?

    • 빨강토끼 2014.06.30 13:42 신고  댓글주소  수정/삭제

      1. 맞습니다. 거기서 공개키 개인키가 생성됩니다.
      2. 1번은 스스로 공개키와 개인키를 만들고 암호화를 하고 복호화를 하는 코드입니다. 하지만 실제필드에서는 서버와 클라이언트간의 통신시 정보를 암호화 하고 복호화합니다. 즉 혼자서 암호화하고 복호화하는 북치고 장구치고의 로직이 아니라는 겁니다. 보내는쪽에서 암호화를 해서 보내고 받는쪽에서는 복호화를 하는 로직입니다.
      그러면 주는쪽과 받는쪽이 서로 암호화하고 복호화하는데 공통으로 사용하는 약속된 정보가 있어야겠지요. 그걸 예제 코딩에서는 key라고 정의 한겁니다.

      2. clsPublicKeySpec.getModulus( ) clsPublicKeySpec.getPublicExponent( ) 는 실제로 코딩을 돌려보시면 의미를 알수있을겁니다. 그래도 모르시면 구글을 검색해보세요.
      댓글로 정리될만한 규모의 내용은 아닌것 같습니다.

      고맙습니다.

  2. ideadownload 2015.09.15 17:32  댓글주소  수정/삭제  댓글쓰기

    이 소스를 마음껏 써도 될까요?