공개키 암호화 [RSA구현]

Posted by 백창
2015.01.16 15:33 컴퓨터보안/Programming


 개념


 공개키 알고리즘은 암호화하는 키와 해독하는 키가 동일하지 않도록(혹은 하나로 다른 하나를 유추할 수 없도록) 고안된 방식이다. 공개키 알고리즘을 이용하면, 암호문을 작성할 때 사용하는 암호키가 외부에 공개되어도 비밀키를 모르면 암호문을 해독할 수 없다.


 공개키 알고리즘에서는 사용자가 두 개의 암호키(공개키와 비밀키)를 사용하는데, 공개키는 원문서를 암호화하는 데 사용하므로 원칙적으로 누구에게나 공개된다. 따라서 송신 호스트는 공개키로 원문서를 암호화하여 전송한다. 수신 호스트에서는 암호문을 해독하기 위해 비밀키를 사용한다.


 공개키 알고리즘의 대표 예는 RSA 알고리즘이 있다.



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



 RSA 구현


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
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
 
import javax.crypto.Cipher;
 
public class RSA {
    //RSA
    private PublicKey publicKey;
    private PrivateKey privateKey;
    
    /**
     * 키 쌍 생성
     * */
    public KeyPair keyGen(){
        KeyPair keyPair = null;
        
        try {
            KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
            keyPair = keyPairGen.generateKeyPair();
            
            publicKey = keyPair.getPublic();
            privateKey= keyPair.getPrivate();
            
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        
        return keyPair;
    }
    
    public PublicKey getPublic(){
        return publicKey;
    }
    public PrivateKey getPrivate(){
        return privateKey;
    }
    
    /**
     * 암호화
     * */
    public byte[] encryptRSA(byte[] input, PublicKey publicKey)throws Exception{
        byte[] encrypted = null;
        
        try {
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            encrypted = cipher.doFinal(input);
            
        } catch(Exception e){
            e.printStackTrace();
        }
        
        return encrypted;
    }
    /**
     * 암호화
     * */
    public byte[] encryptRSA(byte[] input, PrivateKey privateKey)throws Exception{
        byte[] encrypted = null;
        
        try {
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE, privateKey);
            encrypted = cipher.doFinal(input);
            
        } catch(Exception e){
            e.printStackTrace();
        }
        
        return encrypted;
    }
    
    /**
     * 복호화
     * */
    public byte[] decryptRSA(byte[] input, PrivateKey privateKey) throws Exception{
        byte[] decrypted = null;
        try{
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            decrypted = cipher.doFinal(input);
        }catch(Exception e){
            e.printStackTrace();
        }
        
        return decrypted;
    }
    
    /**
     * 복호화
     * */
    public byte[] decryptRSA(byte[] input, PublicKey publicKey) throws Exception{
        byte[] decrypted = null;
        try{
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.DECRYPT_MODE, publicKey);
            decrypted = cipher.doFinal(input);
        }catch(Exception e){
            e.printStackTrace();
        }
        
        return decrypted;
    }
    
}
 
 
cs


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

공개키 암호화 [RSA구현]  (0) 2015.01.16
대칭키 암호화  (0) 2014.12.27
DES 암호화 과정(java)  (0) 2014.10.20
이 댓글을 비밀 댓글로

대칭키 암호화

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
대칭키 암호화  (0) 2014.12.27
DES 암호화 과정(java)  (0) 2014.10.20
이 댓글을 비밀 댓글로

고전암호기법

Posted by 백창
2014.10.20 10:18 컴퓨터보안/개념

기본용어

- plaintext : 평문

- ciphertext : 암호문

- cipher : 평문을 암호화 하는 알고리즘

- key : 전달자와 수신자만 알고 있는 암호화에 사용되는 정보

- encipher : 암호화

- decipher : 복호화

- cryptography : 암호학

- cryptanalysis(codebreaking) : 알려진 키 없이 복호화 (해커들..) 암호해독학

- cryptology : 암호학과 암호해독학을 합친


대칭 알고리즘

- 강력한 알고리즘

- 비밀 키의 안전한 전달법


Cryptography

- 치환(substitution) : 각 원소가 다른 원소에 맵핑

- 전치(Transposition) : 각 원소를 재배치


공격 유형(가진정보)

- 암호문 단독 공격 : 암호 알고리즘, 암호문

- 기지 평문 공격 : 암호 알고리즘, 암호문, 하나 이상의 비밀키에 의한 평문-암호문 쌍

- 선택 평문 공격 : 암호 알고리즘. 암호문, 해독자가 선택한 평문 메시지와 비밀키로 생성된 그 평문에 대한 암호문

- 선택 암호문 공격 : 암호 알고리즘, 암호문, 해독자가 선택한 목적 암호문과 비밀키로 생성된 그 암호문의 해독된 평문

- 선택 원문 공격 : 암호 알고리즘, 암호문, 해독자가 선택한 평문 메시지와 비밀키로 생성된 그 평문에 대한 암호문, 해독자가 선택한 목적 암호문과 비밀키로 생성된 암호문에 해독된 평문


절대 안정성과 계산 안정성

- 절대 안정성 : 해당 암호 기법으로 생성된 암호문을 아무리 많이 사용하더라도 해당 암호문에 평문을 알아낼 수 있는 충분한 정보를 포함하지 않을 경우(OTP)

- 계산 안전성 : 암호 해독 비용이 암호화된 정보의 가치 초과, 암호 해독 시간이 정보의 유효 기간 초과


Ceaser cipher

- 치환에 의한 암호화

- 3번째 글자로 대체

- 25개의 키를 가짐

- 평문의 언어를 알고 있으면 쉽게 인식 가능(brute force search에 취약)


Monoalphabetic cipher

- 시이저 암호기법이 안ㅇ전하다고 볼 수 없으나 임의의 치환을 허용해 키 공간을 급격히 증가 시킴

- 26!의 키

- DES보다 몇 십배 큰 키 공간을 가져 안전해 보이지만 언어의 특성(특정 문자의 빈도수)때문에 안정성이 급격히 떨어진다.


Playfair cipher

- 다중 문자 치환

- 2중 문자를 한 단위로 취급해 치환해 안전도를 높임

- 특정 키워드를 기반으로 하여 5x5 matrix를 만듦

- monoalphabetic cipher에 비해 복잡한 구조를 가지지만 평문의 구조가 많이 드러난다.


Hill cipher

- m개의 평문을 m개의 암호문으로 치환함

- 이때, m개의 선형 방정식에 의해 치환됨

in matrix, C = PK mod 26

P = mod 26


Polyalphabetic cipher

- 평문에 대해 서로 다른 방식의 단일 문자 치환 기법을 사용


Vinenere cipher

- 각 평문자에 대한 암호 문자가 유일한 키워드의 각 문자에 대하여 하나씩 여러 개 존재한다. 따라서 문자 빈도수에 대한 정보가 감춰지지만 평문 구조에 대한 정보가 모두 은폐되는 것은 아니다.

- 여러 가지 동일 문자열 사이의 거리에 대해 공통인가를 알아봄으로써 키워드 길이를 근사하게 추정할 수 있다. 그리고 알려진 빈도 특성을 이용하여 해독한다(Kasiski method)

Key         : d e c p t i v e

plain text : w e a r e d i s

ciphertext: z i c v t w q n 

- Autokey cipher : 반복되지 않은 키워드를 사용하여 Kasiski method에 의한 해독을 방지한다. 키워드와 평문을 연결시켜 키를 만들어 사용하는 기법이다. 하지만 키와 평문이 동일한 문자 빈도를 갖기 때문에 통계적 기법이 적용 가능하다.

Key         : deceptive

plain        : wear...

autokey    : deceptivewear ...


Vernam cipher

- 암호학적 공격에 안전하기 위해 평문과 동일 한 길이의 키를 가진다.

- 평문과 통계적 연관성이 없어야 한다.




One Time Pad

- 메시지와 정확히 같은 길이이고 반복되지 않는 랜덤 키 사용을 제시 함으로써 통계적 관계를 갖지 않는 임의의 키를 출력한다.

- Perfect security를 제공하지만 대용량의 랜덤한 키를 다루기 어렵고 키 분배 및 보호의 문제가 발생한다.


Transposition cipher

- 전치에 의한 암호

- 평문과 같은 빈도를 가진다.


Rail Fence cipher

- ex

plain : meet me

m e m 

  e  t  e

cipher: memete


Row Transposition cipher

- 키의 순서대로 재배치하는 암호화


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

고전암호기법  (0) 2014.10.20
서론  (0) 2014.10.20
이 댓글을 비밀 댓글로

DES 암호화 과정(java)

Posted by 백창
2014.10.20 10:10 컴퓨터보안/Programming


 개요

 

 DES 암호화 과정 16R를 손으로 풀어보라는 과제 때문에 작성한 코드 백업용



 소스


급한대로 작성

 

desCrypt.zip



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

공개키 암호화 [RSA구현]  (0) 2015.01.16
대칭키 암호화  (0) 2014.12.27
DES 암호화 과정(java)  (0) 2014.10.20
이 댓글을 비밀 댓글로

서론

Posted by 백창
2014.10.20 09:25 컴퓨터보안/개념

Computer Security

 정보 시스템 자원에 대한 무결성과 가용성, 기밀성유지와 같은 목적을 달성하기 위해 자동화된 정보시스템에 적용되는 보호


CIA tiad




Passive attack

 도청, 감시 등 데이터를 조작하지 않고 들여다 보기만 하는것


Active attack

 데이터 스트림을 불법 수정 또는 거짓 데이터를 전달 하는것


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

고전암호기법  (0) 2014.10.20
서론  (0) 2014.10.20
이 댓글을 비밀 댓글로