데이터베이스에서 값을 처리할 때 INT 형으로 되어있는 값들은 처리속도가 빠르다. IP, MAC, 문자열, DATETIME, PORT 등을 INT 형으로 바꿔 데이터베이스에 삽입할 수 있다. (단, 입력값은 모두 문자열이여야 함)


  • IP to INT
1
2
3
4
5
6
7
8
def ip2int(ip):
    try:
        #print("IP : %s    Type : %s" % (ip, type(ip)))
        return struct.unpack("!I", socket.inet_aton(ip))[0]
    except:
        #print(traceback.print_exc())
        #print(ip)
        return ''
cs



IP

2진수 → 16진수

INT

127.0.0.1

0b01111111000000000000000000000001

\x7f\x00\x00\x01

2130706433


  • MAC to INT
1
2
3
4
5
6
7
def mac2int(mac):
    try:
        return int(mac.replace(':'''), 16)
    except:
        #print(traceback.print_exc())
        return ''
 
cs


MAC

변환을 위한 치환

INT

AA:BB:CC:DD:EE:FF

AABBCCDDEEFF

187723572702975


  • ACTION to INT
1
2
3
4
5
def act2int(string):
    if '문자1' in string:
        return 1
    elif '문자2' in string:
        return 0
cs

- 0 또는 1로 나타냄으로써 해당 문자열에 대해 숫자로 표현이 가능하다.


  • DATETIME to INT
1
2
3
def date2int(date):
    time = datetime.datetime.strptime(date, '%Y-%m-%d %H:%M:%S')
    return int(time.timestamp())
cs


DATETIME

문자열 → DATETIME

INT

2019-12-31 15:12:15

datetime.datetime(2019, 12, 31, 15, 12, 15)

time.timestamp() : 1577772735


  • PORT to INT
1
2
def port2int(port):
    return int(port)
cs

- PORT 자체는 '12345' 와 같이 들어온 문자 자체가 INT 형태이므로 특별한 처리 없이 바로 INT 형으로 변환했다.


'공부 > Python' 카테고리의 다른 글

python venv 설치방법  (0) 2019.11.05
[암호] Vigenere  (0) 2019.02.09
[전자서명]Python OpenSSL  (0) 2018.07.17

1. pip3 install vitualenv

2. python3 -m virtualenv [대상 폴더]

3. call [대상폴더]\Scripts\activate.bat

'공부 > Python' 카테고리의 다른 글

[DB] INT 형 삽입  (0) 2020.03.21
[암호] Vigenere  (0) 2019.02.09
[전자서명]Python OpenSSL  (0) 2018.07.17

설치


01. 우분투안의 인터넷을 실행시켜 https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html 에서 Workstation Pro for Linux 다운로드




02. 다운로드 후 VMware-Workstaion-full-15.0.2-10952284.x86_6.bundle이 다운로드 된 것을 확인할 수 있다.



03. Linux 내의 VMware 설치를 위해 아래 명령어를 입력하여 설치해준다.



04. 이제 Ubuntu iso 를 설치하기 위해 snap 명령어를 이용한다.



snap 명령어를 사용하여 아래와 같이 설치된 것을 확인할 수 있다.



05. Ubuntu에서 VM 을 검색해서 설치된 VMware을 실행시킨다.



설치 시 에러사항


01.snap 명령어 오류


ubuntu iso 를 다운받기 위해 명령어를 입력했는데 아래와 같이 'error: cannot communicate with server: Post http://localhost/v2/snaps/ubuntu-iso-download: dial unix /run/snapd.socket: connect: connection refused' 라는 메시지가 출력되었다.



여러 방법을 찾아 refresh, systemctl 등 사용해 보았으나 효과가 없었다. 그래서 결국 삭제하고 다시 설치했더니 실행이 되었다.



'공부 > 그 외' 카테고리의 다른 글

네트워크 시험공부 1  (0) 2017.12.07
Ubuntu 해상도 조절  (0) 2017.07.06


소스코드


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
ENC = 0
DEC = 1
def encrypt(text, key):
    crypt_text = ""
    for n, letter in enumerate(text):
        if n >= len(key):
            n = n%len(key)
        print_text = operation(letter, key[n], ENC)
        crypt_text += print_text
        print("plain -> crypt : " + letter + "→" + print_text + " key : " + key[n]) 
    print("Crypt_Text : "+crypt_text)
    
    
    
def decrypt(text, key):
    decrypt_text = ""
    for n, letter in enumerate(text):
        if n >= len(key):
            n = n%len(key)
        print_text = operation(letter, key[n], DEC)
        decrypt_text += print_text
        print("crypt -> plain : " + letter + " → " + print_text + " key : " + key[n])
    print("Decrypt_Text : "+decrypt_text)
    
    
    
def operation(letter, key, action):
    key_value = ord(key)-ord('a')
    if letter.isupper():
        plain_value = ord(letter) - ord('A')
        if action == DEC:
            key_value = -key_value
        result = (plain_value + key_value)%26
        result_text = chr(result + ord('A'))
        
    elif letter.islower():
        plain_value = ord(letter) - ord('a')
        if action == DEC:
            key_value = -key_value
        result = (plain_value + key_value)%26
        result_text = chr(result + ord('a'))
        
    else :
        result_text = letter    
        
    return result_text
    
    
    
def error(text, key):
    if not key.isalpha() or not key.islower() or len(key)>10:
        print("Please Check the Key")
        exit();
    elif len(text) > 255:
        print("Please Check the Text")
        exit();
    else :
        pass        
        
        
        
def select_option():
    option = input("암호화 하려면 1, 복호화 하려면 2 : ")
    if option == '1':
        text = input("평문을 입력하여 주십시오: ")
        key = input("키를 입력하여 주십시오(소문자) : ")
        error(text, key)
        encrypt(text, key)
        
    elif option == '2':
        text = input("암호문을 입력하여 주십시오: ")
        key = input("키를 입력하여 주십시오(소문자) : ")
        error(text, key)
        decrypt(text, key)
    
    else:
        print("Please Check the Option")        
        
        
        
if __name__ == '__main__':
    select_option()
cs



소스코드 해설 (letter 변수)


암호화를 할 것인지 복호화를 할 것인지 입력 받은 후 문자열(text)과 key를 encrypt, decrypt 함수로 넘겨준다. enumerate(text) 내장 함수를 이용하여 문자 하나당 인덱스 값을 넘겨 받는다.

변수이름

n

letter

역할

인덱스 넘버

문자 하나

예시

text = abcde

n = 0, letter = a

n = 1, letter = b



 

대문자

소문자

연산

ord(letter) - ord(‘A’)

ord(letter) - ord(‘a’)

연산

문자의 아스키 코드 65

문자의 아스키 코드 - 97

평문

A ~ Z

a ~ z

평문 값

00 ~ 25

00 ~ 25



소스코드 해설 (key 변수)


문자길이가 키 길이보다 길면 n 값이 넘게 되므로 %연산자를 사용하여 나머지 값을 이용해 key의 인덱스 값 설정한다. 

ex) text = abcd, key = ab → n = 0~3, letter = a, b, c, d => key 길이는 2 일 경우

인덱스 값은 0,1 이지만 여기서 enumerate(text)로 구한 인덱스 값은 0~3이 되므로 2~3의 인덱스 값을 가지지 않는다. 

따라서, %연산자를 사용하여 나머지를 구해야 한다. 즉, 2 % 2 = 0 , 3 % 2 = 1 이 되도록 한다. 

(만약 마이너스만 사용하면 한 차례는 가능하지만 두바퀴 때부터 불가능) key 값을 받아 왔으면 연산 함수에 넣어 key 값을 연산한다.



연산

ord(letter) - ord(‘a’)

연산

문자의 아스키 코드 - 97

key

a ~ z

key

00 ~ 25



소스코드 해설 (action 변수)


함수를 넘길 때, 암호화 할 것인지 복호화 할 것인지 입력 받은 후 암호화 할 것이면 그대로 평문 값고 더하여 연산해주고, 복호화 할 것이면 key 값을 ‘-’로 하여 더해 연산해준다. result_text 로는 chr 모듈을 사용하여 아스키 코드 값을 다시 영문자로 바꿔 출력할 수 있도록 한다.



결과


암호화와 복호화의 경우를 선택하고 key를 설정한다. 이를 통해 key 길이만큼 암/복호화가 진행되고 결과물을 출력한다. 평문이 255글자이상일 경우, key 길이제한 및 대문자 입력의 경우, 특수문자 입력 시 오류가 난다. 

 초기 소스


초기에 소스코드 코딩 시 짧은 소스만 강조하여 읽기 어렵게 해놨다. 

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
def encrypt(text, key):
    crypt_text = ""
    for n, letter in enumerate(text):
        if n >= len(key):
            n = n%len(key)
        if letter.isupper():
            crypt_text = crypt_text + chr((((ord(letter)-65)+(ord(key[n])-97))%26)+65)
        elif letter.islower():
            crypt_text = crypt_text + chr((((ord(letter)-97)+(ord(key[n])-97))%26)+97)
        else:
            crypt_text = crypt_text + letter
    print("Crypto_Text : "+crypt_text)
    
def decrypt(text, key):
    decrypt_text = ""
    for n, letter in enumerate(text):
        if n >= len(key):
            n = n%len(key)
        if letter.isupper():
            decrypt_text = decrypt_text + chr((((ord(letter)-65)-(ord(key[n])-97))%26)+65)
        elif letter.islower():
            decrypt_text = decrypt_text + chr((((ord(letter)-97)-(ord(key[n])-97))%26)+97)
        else:
            decrypt_text = decrypt_text + letter
            
    print("Decrypto_Text : "+decrypt_text)
 
def main():
    option = input("암호화 하려면 1, 복호화 하려면 2 : ")
    if int(option) == 1:
        text = input("평문을 입력하여 주십시오: ")
        key = input("키를 입력하여 주십시오(소문자) : ")
        if not key.isalpha() or not key.islower() or len(key)>10:
            print("Please Check the Key")
            exit();
        encrypt(text, key)
        
    elif int(option) == 2:
        text = input("암호문을 입력하여 주십시오: ")
        key = input("키를 입력하여 주십시오(소문자) : ")
        if not key.isalpha() or not key.islower() or len(key)>10:
            print("Please Check the Key")
            exit();
        decrypt(text, key)
    
    else:
        print("Please Check the Option")
        
if __name__ == '__main__':
    main()
cs


crypt_text = crypt_text + chr((((ord(letter)-65)+(ord(key[n])-97))%26)+65) 이런식으로 한 줄에 다 작성하려고 하니 보기가 어려워 본래 소스코드처럼 보기 단순화해놨다.

'공부 > Python' 카테고리의 다른 글

[DB] INT 형 삽입  (0) 2020.03.21
python venv 설치방법  (0) 2019.11.05
[전자서명]Python OpenSSL  (0) 2018.07.17

+ Recent posts