java RSA 암호화(미리저장되어있는 키를 사용) key 설정
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);
이상입니다. 끝!