본문 바로가기
자바

javascript - java 간 RSA 를 이용해서 암호화 복호화 하기

by 처리2 2021. 4. 26.
반응형

먼저 js를 다운 받아야 합니다. ㅎㅎ

 

script.zip
0.01MB

요기용

 

먼저 jsp에 추가해야 할것  다운받은 스크립트를 적용해줘야겠죠?

<script type="text/javascript" src="/resources/api/rsa2js/rsa.js"></script>
<script type="text/javascript" src="/resources/api/rsa2js/jsbn.js"></script>
<script type="text/javascript" src="/resources/api/rsa2js/prng4.js"></script>
<script type="text/javascript" src="/resources/api/rsa2js/rng.js"></script>

그리고 javascript에 추가해줘야 할 것

 

id 와 pw 는 뭔지 아시겠죠? input값입니다 ㅎㅎㅎ 참고용이니깐 잘 적용해보세요

function loginRSA(id,pw){
	// rsa 암호화	
	var rsa = new RSAKey();
	rsa.setPublic($('#RSAModulus').val(),$('#RSAExponent').val());
	    
	$("#UI_IDs").val(rsa.encrypt(id));
	$("#UI_PASSWORD").val(rsa.encrypt(pw));
	    
    return true;
}

java에서 로그인 버튼 클릭 후 처리 되는 부분 입니당

PrivateKey privateKey = (PrivateKey) session.getAttribute(CommonMemberController.RSA_WEB_KEY);


String id = (idValue);
String password = (PwValue);


// 복호화
try {
id = CommonMemberController.decryptRsa(privateKey, id);
password = CommonMemberController.decryptRsa(privateKey, password);
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("복호화 에러");
}

// 개인키 삭제
session.removeAttribute(CommonMemberController.RSA_WEB_KEY);

이거 전에  준비되어야 할 메소드 부분


	public static String RSA_WEB_KEY ="";
	public static String RSA_INSTANCE ="";
	/**생성자 만들어주는 모습 **/	
	public CommonMemberController() {
		 RSA_WEB_KEY = "_RSA_WEB_Key_"; // 개인키 session key
		 RSA_INSTANCE = "RSA"; // rsa transformation
	}
	
    
    
    /**
     * 복호화
     * 
     * @param privateKey
     * @param securedValue
     * @return
     * @throws Exception
     */
    public static String decryptRsa(PrivateKey privateKey, String securedValue) throws Exception {
        Cipher cipher = Cipher.getInstance(CommonMemberController.RSA_INSTANCE);
        byte[] encryptedBytes = hexToByteArray(securedValue);
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
        String decryptedValue = new String(decryptedBytes, "utf-8"); // 문자 인코딩 주의.
        return decryptedValue;
    }
 
    /**
     * 16진 문자열을 byte 배열로 변환한다.
     * 
     * @param hex
     * @return
     */
    public static byte[] hexToByteArray(String hex) {
        if (hex == null || hex.length() % 2 != 0) { return new byte[] {}; }
 
        byte[] bytes = new byte[hex.length() / 2];
        for (int i = 0; i < hex.length(); i += 2) {
            byte value = (byte) Integer.parseInt(hex.substring(i, i + 2), 16);
            bytes[(int) Math.floor(i / 2)] = value;
        }
        return bytes;
    }
	
	
    /**
     * rsa 공개키, 개인키 생성
     * 
     * @param request
     */
    public void initRsa(HttpServletRequest request) {
        HttpSession session = request.getSession();
 
        KeyPairGenerator generator;
        try {
            generator = KeyPairGenerator.getInstance(CommonMemberController.RSA_INSTANCE);
            generator.initialize(1024);
 
            KeyPair keyPair = generator.genKeyPair();
            KeyFactory keyFactory = KeyFactory.getInstance(CommonMemberController.RSA_INSTANCE);
            PublicKey publicKey = keyPair.getPublic();
            PrivateKey privateKey = keyPair.getPrivate();
 
            session.setAttribute(CommonMemberController.RSA_WEB_KEY, privateKey); // session에 RSA 개인키를 세션에 저장
 
            RSAPublicKeySpec publicSpec = (RSAPublicKeySpec) keyFactory.getKeySpec(publicKey, RSAPublicKeySpec.class);
            String publicKeyModulus = publicSpec.getModulus().toString(16);
            String publicKeyExponent = publicSpec.getPublicExponent().toString(16);
 
            request.setAttribute("RSAModulus", publicKeyModulus); // rsa modulus 를 request 에 추가
            request.setAttribute("RSAExponent", publicKeyExponent); // rsa exponent 를 request 에 추가
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

잘 추가 해주시면 쉽게 할 수 있습니다.!

 

 

화이팅

 

반응형

댓글