프로그래밍 노트/JAVA

[JAVA] RSA를 이용한 전자서명 및 복호화

깡냉쓰 2018. 6. 13. 22:07
728x90
반응형

RSA를 이용한 데이터 암복호화

 

키발급부터 개인키로 암호화(전자서명) 한 후 공개키로 복호화는 과정입니다.

public static void main(String[] args){
        
        /* server code */
        /* Key 발급 */
        PublicKey publicKey = null;    // 공개키
        PrivateKey privateKey = null;  // 개인키
         
        SecureRandom secureRandom = new SecureRandom(); // random number generator(RNG) 
         
        try {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); // RSA(1024, 2048), DiffieHellman(1024)
        keyPairGenerator.initialize(1024, secureRandom);
        KeyPair keyPair = keyPairGenerator.generateKeyPair(); // generate key pair
         
        publicKey  = keyPair.getPublic();
        privateKey = keyPair.getPrivate();
         
        System.out.println(publicKey.getAlgorithm());
        System.out.println(publicKey.getFormat()); // 공개키 표준
        System.out.println(publicKey.toString());
         
        System.out.println();
         
        System.out.println(privateKey.getAlgorithm());
        System.out.println(privateKey.getFormat()); // 개인키 표준
        System.out.println(privateKey.toString());
         
         
        String publicKeyStr = Base64.getEncoder().encodeToString(publicKey.getEncoded());   // Base64 인코딩
        String privateKeyStr = Base64.getEncoder().encodeToString(privateKey.getEncoded()); // Base64 인코딩
        System.out.println(privateKeyStr);
         
         
        } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
        } 
         
        /* 키발급 종료 */
         
        /* client code */
        String plainText = "hello world!";
        String encryptedText = "";
        String decryptedText = "";
         
        try {
        Cipher cipher = Cipher.getInstance("RSA");
         
        // 개인키 이용 전자서명
        cipher.init(Cipher.ENCRYPT_MODE, privateKey);
        encryptedText = Base64.getEncoder().encodeToString(cipher.doFinal(plainText.getBytes()));
        System.out.println("****encrypt****");
        System.out.println(encryptedText);
        System.out.println("****decrypt****");
        cipher.init(Cipher.DECRYPT_MODE, publicKey);
         
        // 공개키 이용 복호화
        decryptedText = new String(cipher.doFinal(Base64.getDecoder().decode(encryptedText.getBytes())));
        System.out.println(decryptedText);
         
         
         
        } catch (NoSuchAlgorithmException | NoSuchPaddingException |InvalidKeyException |IllegalBlockSizeException | BadPaddingException e) {
            e.printStackTrace();
        }
         
         
    }​

 

728x90
반응형