티스토리 뷰

안녕하세요 박스여우입니다.

이번에는 AES란 무엇이고 Java로 구현한 AES 암호화/복호화에 대해서 알아보겠습니다.


■ AES(Advanced Encryption Standard) 암호화 알고리즘

AES 는 벨기에의 2명의 암호학자로부터 탄생한 암호화 알고리즘 입니다. NIST는 기밀문서를 안전하게 암호화 시켜 보호하기 위해 DES 암호화 알고리즘을 대체할 새로운 암호화 알고리즘이 필요했고, 1997년에 보다 강력한 알고리즘을 찾기 위한 공모전를 진행했습니다. 그중 MARS, RC6, Rijndael, Serpent, Twofish 이 다섯 개의 암호화 알고리즘이 후보에 올랐고, 결국 Rijndael(레인달) 암호화 알고리즘이 체택되었습니다. 이때 AES 후보 알고리즘들은 다양한 방식의 공격에도 안정성을 갖추고, 속도 및 메모리 요구량과 알고리즘의 유연성, 단순성을 만족해야 했습니다.

(AES와 유사한 알고리즘으로 대한민국에서 개발한 블록 암호 형식인 SEED가 있습니다.)

Rijndael은 암호알고리즘 분류 상 대칭형암호알고리즘중 에서 블록암호 알고리즘 방식입니다. 128bit 블럭 단위로 암호화를 하고, 사용되는 키의 사이즈는 128bit, 192bit, 256bit등이 있습니다. 대칭형암호알고리즘은 암호화/복호화 속도가 비대칭형 암호알고리즘보다 빠르고, 암호화문의 크기가 평문보다 크지않다는 장점을 가지고 있습니다.(암호화시 사이즈 증가 없음)


AES 암호화 알고리즘 Java

AES 암호화 알고리즘의 소스 입니다. 해당 소스를 이용하시려면 org.apache.commons.codec jar을 프로젝트에 build Path 해야 합니다. 

commons-codec-1.7.jar

encrypt 함수가 암호화 메소드이고 암호화할 문장을 매개변수로 넣으시면 됩니다. 그리고 decrypt 메소드는 복호화 메소드 입니다 복호화할 암호화된 문장을 넣으시면 됩니다. 그리고 키는 16자 입니다.

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package asdfasds;
 
import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
 
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
 
public class AES128 {
    private String ips;
    private Key keySpec;
 
    public AES128(String key) {
        try {
            byte[] keyBytes = new byte[16];
            byte[] b = key.getBytes("UTF-8");
            System.arraycopy(b, 0, keyBytes, 0, keyBytes.length);
            SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
            this.ips = key.substring(016);
            this.keySpec = keySpec;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
 
    public String encrypt(String str) {
        Cipher cipher;
        try {
            cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, keySpec,
                    new IvParameterSpec(ips.getBytes()));
 
            byte[] encrypted = cipher.doFinal(str.getBytes("UTF-8"));
            String Str = new String(Base64.encodeBase64(encrypted));
 
            return Str;
        } catch (NoSuchAlgorithmException | NoSuchPaddingException
                | InvalidKeyException | InvalidAlgorithmParameterException
                | IllegalBlockSizeException | BadPaddingException
                | UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
    }
 
    public String decrypt(String str) {
        try {
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, keySpec,
                    new IvParameterSpec(ips.getBytes("UTF-8")));
 
            byte[] byteStr = Base64.decodeBase64(str.getBytes());
            String Str = new String(cipher.doFinal(byteStr), "UTF-8");
 
            return Str;
        } catch (NoSuchAlgorithmException | NoSuchPaddingException
                | InvalidKeyException | InvalidAlgorithmParameterException
                | IllegalBlockSizeException | BadPaddingException
                | UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
    }
}
cs


댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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 29 30
글 보관함