티스토리 뷰

위의 글에서 복호화에서 에러 나서 수정했는데 javax.crypto.BadPaddingException: Given final block not properly padded 에러가 났다.


알고보니 암호화할때 사요한 비밀키가 복호화 할시의 비밀키와 같이 않아서 생기는 오류였다.


그래서 암호화 할때는 키를 입력안했어도 에러가 나지는 않았지만 복호화 할때와 동일한 키를 사용해야 되서 복호화 할때와 똑같은 키를 써서 암호화를 했다.


그랬더니 이제야 에러가 나지 않고 정상적으로 동작하였다.


아래는 실제 돌아가는 전체 AES128 암호화 소스 이다.


public Key getAESKey() throws Exception {

    String iv;

    Key keySpec;


    String key = "1234567890123456";

    iv = key.substring(0, 16);

    byte[] keyBytes = new byte[16];

    byte[] b = key.getBytes("UTF-8");


    int len = b.length;

    if (len > keyBytes.length) {

       len = keyBytes.length;

    }


    System.arraycopy(b, 0, keyBytes, 0, len);

    keySpec = new SecretKeySpec(keyBytes, "AES");


    return keySpec;

}


// 암호화

public String encAES(String str) throws Exception {

    Key keySpec = getAESKey();


    String str2 = "1234567890123456";

    byte[] iv2 = str2.getBytes();

    IvParameterSpec ivParameterSpec = new IvParameterSpec(iv2);

    Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");

    c.init(Cipher.ENCRYPT_MODE, keySpec, ivParameterSpec);

    byte[] encrypted = c.doFinal(str.getBytes("UTF-8"));

    String enStr = new String(Base64.encodeBase64(encrypted));


    return enStr;

}


// 복호화

public String decAES(String enStr) throws Exception {

    Key keySpec = getAESKey();

    String str = "1234567890123456";

    byte[] iv = str.getBytes();

    IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);

    Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");

    c.init(Cipher.DECRYPT_MODE, keySpec, ivParameterSpec);

    byte[] byteStr = Base64.decodeBase64(enStr.getBytes("UTF-8"));

    String decStr = new String(c.doFinal(byteStr), "UTF-8");


    return decStr;

}

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함