대칭키 암호화

Posted by 백창
2014. 12. 27. 17:52 컴퓨터보안/Programming
반응형


 개념


 대칭키 암호에서는 암호화를 하는 측과 복호화를 하는 측이 같은 비밀키를 사용하여 암복호화를 수행하는 방식을 말한다. 공개키 암호화 방식에 비해 빠른 계산속도를 가지지만 비밀키 분배가 어렵고 중요하다.

 

 대칭키의 종류로는 AES, DES 등이 있다.



그림 출처 : 네이버 지식백과



 AES 구현


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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
 
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
 
 
public class AES{
    private String ALGO = "AES/CBC/PKCS5Padding";
    private SecretKeySpec skeySpec;
    private String iv = "abcdabcdabcdabcd";
    
    util u = new util();
    /**
     * Key 생성
     * */
    public SecretKeySpec keyGen(String key){
        
        skeySpec = new SecretKeySpec(key.getBytes(), "AES");
        
        return skeySpec;
    }
    
    /**
     * Key 설정
     * */
    public void setKey(SecretKeySpec skey){
        skeySpec = skey;
    }
    
    /**
     * 암호화 - String Version
     * */
    public String encryptAES(String s) throws Exception{
        String encrypted = null;
        
        try {
//            SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), "AES");
        
            Cipher cipher = Cipher.getInstance(ALGO);
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new IvParameterSpec(iv.getBytes()));
            encrypted = u.byte2Hex(cipher.doFinal(s.getBytes()));
        } catch(Exception e){
            e.printStackTrace();
        }
        
        return encrypted;
        
    }
    
    /**
     * 암호화 - ByteArray Version
     * */
    public byte[] encryptAES(byte[] input) throws Exception{
        byte[] encrypted = null;
        
        try {
//            SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), "AES");
        
            Cipher cipher = Cipher.getInstance(ALGO);
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new IvParameterSpec(iv.getBytes()));
            encrypted = cipher.doFinal(input);
        } catch(Exception e){
            e.printStackTrace();
        }
        
        return encrypted;
        
    }
    
    /**
     * 복호화 - String Version
     * */
    public String decryptAES(String s) throws Exception{
        String decrypted = null;
        
        try{
//            SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), "AES");
            
            Cipher cipher = Cipher.getInstance(ALGO);
            
            cipher.init(Cipher.DECRYPT_MODE, skeySpec,new IvParameterSpec(iv.getBytes()));
            decrypted = new String(cipher.doFinal(u.hex2Byte(s)));
            
        }catch(Exception e){
            e.printStackTrace();
        }
        return decrypted;
    }
    
    /**
     * 복호화 - ByteArray Version
     * */
    public byte[] decryptAES(byte[] input) throws Exception{
        byte[] decrypted = null;
        
        try{
//            SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), "AES");
            
            Cipher cipher = Cipher.getInstance(ALGO);
            cipher.init(Cipher.DECRYPT_MODE, skeySpec,new IvParameterSpec(iv.getBytes()));
            decrypted = cipher.doFinal(input);
            
        }catch(Exception e){
            e.printStackTrace();
        }
        return decrypted;
    }
    
    
    
}
 
 
cs



반응형

'컴퓨터보안 > Programming' 카테고리의 다른 글

공개키 암호화 [RSA구현]  (0) 2015.01.16
DES 암호화 과정(java)  (0) 2014.10.20