유니코드 
파이썬 3에서 문자열은 모두 유니코드로 처리합니다. 예를 들어, 문자열 'I love Python'은
파이썬 3에서 모두 유니코드 문자열로 취급한다는 말입니다.
파이썬 3는 유니코드로 인코딩 되지 않은 문자열은 바이트 객체로 인식합니다. 바이트 객체
값이 112이면 특별한 처리를 하지 않는 한 파이썬 3는 그냥 112로 인식한다는 말입니다.하지만
ASCII코드로 처리하는 경우 112는 소문자'p'로 인식합니다. 파이썬 3에서 바이트 객체는 소문자
b를 써서 나타냅니다. 

msg = b'python3x' #바이트 객체로 'python3x' 선언

바이트 객체는 이진 데이터로 인식하기 때문에 유니코드 문자열과 비교하는 경우 제대로 된
결과가 나오지 않습니다.

msg = b'python3x'
msg[0] =='p'
#False
msg[0]
#112

msg를 바이트 객체'python3x'로 선언했습니다.msg[0]와'p'가 같은가? 라는 질문에 False가 나온다.
msg[0]의 값을 찍어보니 112입니다. 112는 ASCII코드 값으로 소문자'p'에 해당합니다.
유니코드 문자'p'와 ASCII코드 112는 당연히 다릅니다.

msg=b'python3x'
for c in msg:
    print(c,end=" ")
#112 121 116 104 111 110 51 120
바이트 객체로 선언된 'python3x'를 한자씩 화면에 출력하면 숫자로 출력된다.
파이썬 내장함수인 chr()를 이용해서 바이트 객체인 문자 1개를 유니코드 문자로 바꾸어 준다.

msg=b'python3x'
for c in msg:
    print(chr(c),end=" ")
#p y t h o n 3 x

바이트 객체로 선언된 문자열은 decode()를 이용해 유니코드 문자로 바꿀 수 있습니다.
msg = msg.decode()
msg[0] =='p'
#True
msg[0]
#'p'

utf-8을 쓰는 이유 
Pycryptodome 라이브러리는 아직 유니코드를 지원하지 않는다. 그래서 유니코드 문자열을 encode('utf-8')을 이용해 UTF-8로 인코딩 하여 인자로 전달하면 
문제없이 작동한다.

msg='python3x'
msg.encode('utf-8')
#b'python3x'

