암호화 알고리즘 중에, 대칭키 알고리즘이 있습니다. 어떤 것인지 간단하게 실습해 보도록 하겠습니다.

 


 파이썬에는 pycryptodome이 있습니다. 이쪽에, 여러 암호화 알고리즘들이 있습니다. 대칭키 알고리즘 중에 AES를 써 보도록 하겠습니다. 이 포스팅에서는 대칭키 알고리즘에 대해서 맛만 볼 것이니, 이 포스팅에서 언급되는 AES에 대해서도 딥 다이브를 하진 않을 것입니다.

 

 먼저, key가 "It is 16byteIt i"입니다. 이 키로 "my oshi is"를 암호화 하겠습니다. MODE_EAX로 암호화를 하였습니다.

 

 다음에, 10번째 줄에서 복호화를 합니다. 여기서 nonce=cipher.nonce를 넣었습니다. 10번째 줄에, cipher_text를 decrypt 해서, plain을 얻어옵니다.

 

 프로그램의 실행 결과는 위와 같습니다. "my oshi is"가 나오네요. 암호화를 한 키로, 다시 복호화를 했더니 평문이 나왔습니다. 양방향으로 암호화를 할 수 있는 셈이 되겠습니다.

 


 만약에 키가 다르면 어떻게 될까요? key와 diff_key는 단 1글자만 다릅니다.

 

decrypt를 하는 키를 diff_key로, encrypt를 하는 키를 key로 하였습니다. 두 키가 다른 상태입니다. 실행 결과는 어떻게 나올까요?

 

 어? 평문이 나오지 않았습니다. 키가 잘못되었으니 그런 것이겠네요. 여기까지 정리하면, 우리가 key를 알고 있으면, 해당 키를 이용해서 암호화 된 데이터를 다시 복호화 해서 원래대로 돌려놓을 수 있습니다. 비밀번호가 맞는지 확인할 때에는 일방향 해시 함수를 썼습니다. 이것은, 암호화 된 비밀번호에서 salt 값을 얻어낸 다음에, 특정 hash로 암호화 시켜서 verify 시켜보는 것이였습니다. 즉, raw를 복호화 해서 암호화된 값과 비교하는 방식이였습니다. 대칭키 알고리즘은 key를 알면 복호화가 된다는 점이 다릅니다.

 

 


여기서 하나 더 실습을 해 봅시다.

 

 실행 결과가 어떻게 나올까요? 제대로 나올까요?

 

 제대로 나올 것 같지만, 이상한 것이 나와버렸습니다. 분명 저는 key도 잘 넣었고, 복호화를 위한 키도 암호화 할 때 쓰던 키랑 똑같이 넣었는데요. 왜 이상한 값이 나왔을까요? 비밀은 nonce에 있습니다.

 

 설명을 읽어보면, MUST NEVER가 나와 있습니다. ~ 해야하는데, 절대로 하지 마세요. 절대로 하지 말라고 되어 있네요. 발급된 nonce로 다른 암호화된 텍스트를 절대로 풀지 말아야 한다고 되어 있습니다.

 

 계속 읽다 보면, 이것이 제공되지 않으면, random byte string이 사용된다고 되어 있습니다. 여기까지 정리해 보면, nonce는 한 번만 사용되어야 하고, 재사용 되어서는 절대 안 될 정도로 중요한 정보임을 알 수 있습니다. 그리고, 이 정보는 cipher가 암호화하고 복호화 하는 데 쓰이는 것임을 알 수 있습니다.

 

 그리고, 상식적으로 추론하자면, 이 값이 암호화 텍스트를 만드는 데도 일정 부분 관여한다는 것 또한 알 수 있습니다. 그렇지 않으면 단순하게 nonce가 달라졌는데 이상한 결과가 나오지 않을 것입니다.

 

 

 그러면 정말로 nonce가 랜덤하게 생성되는지 보겠습니다. 암호화를 하는 cipher는 nonce 옵션을 주지 않았습니다. 그러면 자동으로 생성이 될 겁니다. 해당 nonce 값을 출력하는 것은 6번째 줄에서 하고 있습니다.

 

  프로그램이 계속 재실행 될 때 마다 nonce가 계속 달라짐을 확인할 수 있습니다. 그리고 이 달라진 nonce 값과 key를 넘겨주면, 이것을 토대로 복호화를 진행해서 평문을 뽑아냄을 알 수 있습니다.