컴퓨터 파일은 0 또는 1의 값을 가지는 비트가 연속적으로 길게 이어진 것입니다. 컴퓨터 파일을 암호화하는 방법도 문장의 암호화와 마찬가지로 비트값의 변경(치환)과 비트의 위치바꿈(전치)을 응용하여 이루어집니다.
컴퓨터 파일의 비트 길이는 보통 매우 길어서, 문장의 암호화처럼 전체 파일을 한 번에 암호화하려면 속도가 매우 느려집니다. 그래서 컴퓨터 파일을 암호화할 때는 일정한 크기의 블록으로 나누어 암호화하는 블록암호화 방식이 일반적으로 사용됩니다.
내가 만든 파일을 다른 사람이 열어보는 것을 막기 위해서 파일을 암호화한 경우라면 암호화키를 내가 잊지 않는 한 필요할 때 파일을 해독해서 열어볼 수 있으므로 암호화가 도움이 됩니다.
하지만 랜섬웨어의 경우에는 암호화가 아주 큰 해를 입히는 경우입니다. 랜섬웨어는 컴퓨터에 저장되어 있는 문서나 사진 등의 자료 파일을 암호화하고 파일을 원래대로 복원하는 데 필요한 암호화 키를 제공하는 대가로 돈을 요구하는 프로그램이기 때문입니다.
2017년 5월에는 워너크라이는 이름의 랜섬웨어가 전세계에 퍼져 150여 개국에서 30만대 이상의 컴퓨터를 감염시켰다고 합니다. (출처: 한국스포츠경제)
랜섬웨어의 파일 암호화 방식
안랩에서 발행된 '워너크립터 랜섬웨어 분석보고서'에 워너크라이 랜섬웨어의 작동방식이 상세하게 설명되어 있습니다.
보고서 중 파일암호화 관련 설명을 옮겼습니다.
그림 2의 설명을 보면 워너크라이 랜섬웨어는 파일을 암호화할 때 AES_128 CBC 방식을 사용한다고 하며, AES의 암호화키는 RSA 공개키/개인키 쌍을 이용하여 암호화한다고 나와 있습니다.
AES 암호화법과 RSA 공개키/개인키 암호화법에 대해 조사해 보았습니다. 자세한 설명은 책 '스토리로 이해하는 암호화 알고리즘, 김수민, 로드북, 2017년'에 잘 나와 있습니다.
[AES_128 CBC 암호화]
AES는 Advanced Encryption Standard의 줄임말로 블록암호화 방식 중의 하나입니다. 128은 암호화키의 길이로 128비트를 의미하며, 0 또는 1의 값을 갖는 비트 128개로 이루어진 암호화키를 사용한다는 의미입니다. 암호화키가 길어질수록 암호화된 파일을 복원하는 데 시간이 오래 걸린다고 하며, AES_128 외에도 AES_192, AES_256 암호화법도 사용된다고 합니다.
AES_128 암호화는 다음의 과정을 통해 파일을 암호화합니다.
AES_128 암호화 과정의 설명이 복잡하고 어렵지만, 바이트 변환에 암호화키를 이용하고 변환된 바이트를 치환/전치시켜서 원래의 파일을 변화시키는 과정이라고 이해하였습니다.
CBC는 Cipher Block Chaining의 약자로 AES 암호화 과정에서 암호화키를 동일한 것을 사용하지 않고 라운드마다 변화시켜 사용하는 방법입니다. 라운드마다 변경된 암호화키를 사용하여 암호화키를 찾아내기 어렵게 합니다.
AES_128 CBC 암호화는 블록마다 11라운드를 거쳐 원본 데이터를 변형시키며, 이 때 암호화키를 변형시킨 라운드키를 이용하여 원본 데이터와 암호화키를 찾지 못하게 숨깁니다.
[RSA 공개키/개인키 암호화]
RSA 공개키/개인키 암호화법은 소인수분해의 난해함에 기반하여 특정 나머지 연산을 만족하는 두 소수를 구하여 공개키와 개인키로 사용하는 암호화법입니다. 공개키와 개인키를 구하는 원리는 위키백과에 잘 설명되어 있습니다.
RSA 암호화는 공개키로 평문을 암호화하고 개인키로 암호문을 평문으로 해독합니다. RSA 암호화는 암호화할 때와 해독할 때 같은 키를 사용하는 블록암호화법에 비해 속도가 느려 전체 파일의 암호화보다는 암호화키와 같이 짧은 길이의 비트를 암호화하는 데 사용된다고 합니다.
위의 보고서에 따르면 워너크라이 랜섬웨어는 RSA 암호를 두 번 생성하는데, 첫번째 생성하는 공개키/개인키 쌍은 랜섬웨어 제작자의 서버에서 생성되고 두번째 공개키/개인키 쌍은 랜섬웨어에 감염된 컴퓨터에서 생성됩니다. AES 암호화키는 두번째 공개키로 암호화되므로 두번째 개인키로 해독해야합니다. 하지만 두번째 개인키는 첫번째 공개키로 암호화되어 있어 알 수 없고, 첫번째 개인키로 해독해야만 합니다. 랜섬웨어 제작자만 첫번째 개인키를 알고 있으므로 암호화된 파일을 복원하려면 제작자에게 금전을 지불하고 첫번째 개인키를 받아야만 합니다. 하지만 랜섬웨어 제작자가 요구하는 금전을 지불해도 첫번째 개인키를 받지 못하는 경우도 많다고 합니다.
랜섬웨어로 암호화된 파일을 복원할 다른 방법은?
랜섬웨어는 평문블록을 암호화키를 이용하여 일정한 규칙에 따라 변형시켜 암호문블록을 만드는 것입니다.
그림 3과 같이 평문블록(A)에 암호화키(X)를 연산(AES)하여 암호문블록(B)를 얻는다고 단순화시키면 일차방정식과 같으므로, 평문블록(A)를 미리 정해진 비트의 파일-모든 비트가 0으로 채워진 파일과 같은-로 준비한다면 랜섬웨어에 감염되더라도 평문블록(A)와 암호문블록(B)를 비교하여 암호화키(X)를 찾아낼 수 있지 않을까하는 생각이 들었습니다.
깨지지 않는 암호는 없고 해독이 오래걸리는 암호만이 존재한다고 합니다. 따라서 평문블록(A)과 암호문블록(B)을 비교하여 암호화키를 찾아낼 수 있는 최대시간을 계산해 볼 필요가 있습니다.
그림 4는 자바언어를 이용하여 블록암호화 속도를 비교한 표입니다. (출처: Comparison of ciphers, Javamex: Programming Tutorials. http://www.javamex.com/tutorials/cryptography/ciphers.shtml)
그림 4에 따르면 AES_128 암호화법을 이용하여 30400개의 128비트(16바이트) 블록을 암호화하는 데 15초 가량 걸립니다. 128비트 암호키는 모두 2^128 가지의 가능성이 존재하고 2^15 = 32768이므로 2^15개의 암호화키를 시도해 보는 데 약 15초 걸린다고 할 수 있습니다. 그러면 1분에 2^15 * 4 = 2^17 개의 암호화키를 검증할 수 있습니다.
이 속도로 2^128가지 경우를 모두 확인하는 데 걸리는 시간은 2^128 / 2^17 = 2^111 분이고, 일년은 365 x 24 x 60 = 525600분(약 2^19)입니다. 따라서 AES_128 암호화된 파일의 암호화키를 구하는 시간은 2^92년이 걸립니다. 이 시간은 너무 길어서 현실적으로 암호화키를 구할 수 없다고 할 수 있습니다.
AES_128로 암호화된 파일을 현재 컴퓨터의 속도로는 매우 긴 시간이 걸려야만 풀 수 있으므로 평소에 중요/소중한 파일은 여러 곳에 자주 백업해 놓는 것이 가장 좋은 예방법입니다.