AES를 사용하여 텍스트를 암호화/해독하는 클래스를 작성하려고합니다.AES 키 문자열이 예외를 throw합니다.
키를 생성하고 키를 데이터베이스 열에 저장하고 해당 키를 사용하여 키가 들어있는 데이터베이스 행의 해당 텍스트를 암호화/해독합니다.
다음은 키를 생성하고 암호화 및 암호 해독 작업을 수행하기 위해 작성한 클래스입니다.
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class StringDecryptor {
public static String encrypt(String text, String key) {
Key aesKey = null;
Cipher cipher = null;
byte[] encrypted = null;
try {
aesKey = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, aesKey);
encrypted = cipher.doFinal(text.getBytes());
} catch (NoSuchAlgorithmException ex) {
Logger.getLogger(StringDecryptor.class.getName()).log(Level.SEVERE, null, ex);
} catch (NoSuchPaddingException ex) {
Logger.getLogger(StringDecryptor.class.getName()).log(Level.SEVERE, null, ex);
} catch (InvalidKeyException ex) {
Logger.getLogger(StringDecryptor.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalBlockSizeException ex) {
Logger.getLogger(StringDecryptor.class.getName()).log(Level.SEVERE, null, ex);
} catch (BadPaddingException ex) {
Logger.getLogger(StringDecryptor.class.getName()).log(Level.SEVERE, null, ex);
} catch (UnsupportedEncodingException ex) {
Logger.getLogger(StringDecryptor.class.getName()).log(Level.SEVERE, null, ex);
}
return new String(encrypted);
}
public static String decrypt(String text, String key) {
Key aesKey = null;
Cipher cipher;
String decrypted = null;
try {
aesKey = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, aesKey);
decrypted = new String(cipher.doFinal(text.getBytes()));
} catch (NoSuchAlgorithmException ex) {
Logger.getLogger(StringDecryptor.class.getName()).log(Level.SEVERE, null, ex);
} catch (NoSuchPaddingException ex) {
Logger.getLogger(StringDecryptor.class.getName()).log(Level.SEVERE, null, ex);
} catch (InvalidKeyException ex) {
Logger.getLogger(StringDecryptor.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalBlockSizeException ex) {
Logger.getLogger(StringDecryptor.class.getName()).log(Level.SEVERE, null, ex);
} catch (BadPaddingException ex) {
Logger.getLogger(StringDecryptor.class.getName()).log(Level.SEVERE, null, ex);
} catch (UnsupportedEncodingException ex) {
Logger.getLogger(StringDecryptor.class.getName()).log(Level.SEVERE, null, ex);
}
return decrypted;
}
public static String generateKey() {
SecretKey secretKey = null;
try {
secretKey = KeyGenerator.getInstance("AES").generateKey();
} catch (NoSuchAlgorithmException ex) {
Logger.getLogger(StringDecryptor.class.getName()).log(Level.SEVERE, null, ex);
}
String keyString = bytesToString(secretKey.getEncoded());
return keyString;
}
public static String bytesToString(byte[] b) {
String decoded = null;
try {
decoded = new String(b, "UTF-8");
} catch (UnsupportedEncodingException ex) {
Logger.getLogger(StringDecryptor.class.getName()).log(Level.SEVERE, null, ex);
}
return decoded;
}
public static void main(String args[]) {
String key = generateKey();
System.out.println("key: " + key);
String str = "This is the original string...";
String enc = encrypt(str, key);
System.out.println("enc: " + enc);
String dec = decrypt(enc, key);
System.out.println("dec: " + dec);
}
}
이 코드는 다음 예외를 throw합니다.
SEVERE: null
java.security.InvalidKeyException: Invalid AES key length: 26 bytes
at com.sun.crypto.provider.AESCipher.engineGetKeySize(AESCipher.java:372)
at javax.crypto.Cipher.passCryptoPermCheck(Cipher.java:1052)
at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1010)
at javax.crypto.Cipher.implInit(Cipher.java:786)
at javax.crypto.Cipher.chooseProvider(Cipher.java:849)
at javax.crypto.Cipher.init(Cipher.java:1213)
at javax.crypto.Cipher.init(Cipher.java:1153)
at com.innolabmm.software.luckydraw.utils.StringDecryptor.encrypt(StringDecryptor.java:27)
at com.innolabmm.software.luckydraw.utils.StringDecryptor.main(StringDecryptor.java:95)
Exception in thread "main" java.lang.NullPointerException
at java.lang.String.<init>(String.java:556)
at com.innolabmm.software.luckydraw.utils.StringDecryptor.encrypt(StringDecryptor.java:42)
at com.innolabmm.software.luckydraw.utils.StringDecryptor.main(StringDecryptor.java:95)
Java Result: 1
AES 키 변환으로 인해 예외가 발생하지 않는 키 문자열을 생성하는 방법이 있습니까?
키가 생성되었을 때 키가 올바른 길이 였지만 암호화가 발생했을 때 키가 짧아 졌다고 생각합니다. –