현대 암호학

[현대 암호학] 04. 대칭(Symmetric) 암호 -1. 문자 암호에서 비트열 암호로

Uggjjini 2021. 6. 22. 17:12

현대 암호학

 

* 대칭키 암호

- 블록 암호

- 스트림 암호

 

* 비대칭키 암호

- 공개키 암호

- 공개키 서명

 

* 해시 암호

 

1. 문자 암호에서 비트열 암호로

 

1) 부호화

 

고전암호 => 문자 암호 방식(ex: 'A' -> 'T')

현대암호 => 비트열 암호 방식(ex: 0x41 + 연산 = 0x75)

 

암호화에 컴퓨터 사용이 필수

암호화 프로그램도 평문을 비트열로 변경하고 비트열(byte string)로 된 암호문을 출력

 

부호화(encoding)

문자열(string)을 비트열(bit string, byte string)로 바꾸는 것

 

 

ASCII(American Standard Code for Information Interchange)

  • https://ko.wikipedia.org/wiki/ASCII
  • ASCII는 7비트 인코딩으로, 33개의 출력 불가능한 제어문자들과 공백을 비롯한 95개의 출력 가능한 문자들로 총 128개로 이루어진다.
  • 출력 가능한 문자들은 52개의 영문 알파벳 대소문자, 10개의 숫자, 32개의 특수문자, 그리고 하나의 공백 문자로 이루어진다.

 

2^7 = 128 = 출력 불가능한 문자(33) + 출력 가능한 문자(95)

출력 가능한 문자(95) = 대문자(26) + 소문자(26) + 숫자(10) + 특수문자(32) + 공백(1)

 

 

문자열 midnight을 다음과 같은 비트열로 부호화

 

m : 01101101 : 0x6d

i : 01101001 : 0x69

d : 01100100 : 0x64

n : 01101110 : 0x6e

i : 01101001 : 0x69

g : 01100111 : 0x67

h : 01101000 : 0x68

t : 01110100 : 0x74

 

str = 'midnight'
for i in str:
     print(i, ord(i), hex(ord(i))
m 109   0x6d
i   105   0x69
d  100   0x64
n  110   0x6e
i   105   0x69
g  103   0x67
h  104   0x68
t   116   0x74
  • ord('A') : 문자 -> 십진수
  • chr(65) : 십진수 -> 문자
  • hex(65) : 숫자 -> 16진수

 

2) XOR

 

XOR = exclusive or (익스클루시브 오아, 엑스 오아)

 

배타적 논리합(XOR)

----------------

A    B    result

0     0     0

0     1     1

1     0     1

1     1     0

----------------

 

 

비트열 XOR 성질

----------------------------------
               01001100      : A
XOR         10101010      : B
----------------------------------
               11100110      : A XOR B
--------------------------------------------------
               11100110        : A XOR B
XOR         10101010        : B
---------------------------------------------------
               01001100        : A XOR B XOR B = A
                                     (A로 돌아간다.)

 

 

암호화/복호화의 순서와 매우 비슷

평문 A를 키 B로 암호화하고, 암호문 A XOR B를 얻는다.

암호문 A XOR B, B로 복호화해서 평문 A를 얻는다.

a = 60
b = 13

print(' a:', bin(a).rjust(10))
print(' xor b:', bin(b).rjust(10))
c = a ^ b
print('a xor b:', bin(c).rjust(10))
print()
print(' c:', bin(c).rjust(10))
print(' xor b:', bin(b).rjust(10))
d = c ^ b
print('c xor b:', bin(d).rjust(10))
        a: 0b111100
   xor b: 0b1101
a xor b: 0b110001

        c: 0b110001
  xor b: 0b1101
c xor b: 0b111100
  • a ^ b => a xor b
  • bin(60) :
  • rjust(10) : 10칸을 잡고, 오른쪽 정열
  • ljust(10) : 10칸을 잡고, 왼쪽 정열