자바에서는 기본적으로 AES 128bit 암호화를 제공합니다.
단방향 암호화와 달리 양방향은 암호화, 복호화에 필요한 키(key) 값이 필요합니다.
정확한 정보는 아니지만 암호화 key는 항상 16자리로 String으로 생성하여 주는 것으로 알고 있습니다.
예) private static String key = "16자리";
public static String encrypt(String message) throws Exception{
if(message == null){
return null;
}else{
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
byte[] encrypted = cipher.doFinal(message.getBytes());
return byteArrayToHex(encrypted);
}
}
private static String byteArrayToHex(byte[] encrypted) {
if(encrypted == null || encrypted.length ==0){
return null;
}
StringBuffer sb = new StringBuffer(encrypted.length * 2);
String hexNumber;
for(int x=0; x<encrypted.length; x++){
hexNumber = "0" + Integer.toHexString(0xff & encrypted[x]);
sb.append(hexNumber.substring(hexNumber.length() - 2));
}
return sb.toString();
}
public static String decrypt(String encrypted) throws Exception{
if(encrypted == null){
return null;
}else{
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
byte[] original = cipher.doFinal(hexToByteArray(encrypted));
String originalStr = new String(original);
return originalStr;
}
}
private static byte[] hexToByteArray(String hex) {
if(hex == null || hex.length() == 0){
return null;
}
//16진수 문자열을 byte로 변환
byte[] byteArray = new byte[hex.length() /2 ];
for(int i=0; i<byteArray.length; i++){
byteArray[i] = (byte) Integer.parseInt(hex.substring(2 * i, 2*i+2), 16);
}
return byteArray;
}
| cs |