이제 16자리 신용카드 번호의 크기와 형태를 유지하는 ‘완벽한(혼돈과 확산을 충족하는)’ 알고리즘을 만들어 봅시다. 방법은 ‘16자리 십진수 원문’에 무작위(Random Shuffle)로 ‘16자리 십진수 암호문’을 각각 매칭하는 모든 경우의 수(모든 가능한 테이블)를 생성하는 것입니다.
| ‘완벽한’ 알고리즘을 사용하여 만들 수 있는 원문–암호문 테이블 예 |
신용카드 번호 원문 |
신용카드 번호 암호문 |
0000 0000 0000 0001 |
9456 1238 7623 9012 |
0000 0000 0000 0002 |
7123 8829 3128 0023 |
0000 0000 0000 0003 |
4128 4328 2811 8239 |
‘완벽한’ 알고리즘이 생성한 테이블의 집합에서 각 테이블(원문-암호문 매칭 관계에서 하나의 경우)은 유일합니다(첫 번째 조건). 또 각 테이블에서 암호문은 무작위로 생성했으므로 공격자는 어떤 키를 사용했는지 전혀 추측할 수 없습니다(두 번째 조건). 원문과 암호문의 관계도 전혀 알 수 없습니다(세 번째 조건).
그런데 이처럼 안전성이 확보된 ‘테이블의 집합’은 용량이 매우 커서 실용성이 없습니다. 16자리 십진수를 16자리 십진수로 매칭하는 모든 경우의 수는 용량이 약 60,000GB3에 달합니다. 현실적으로 사용할 수 있는 알고리즘을 구성하려면 키의 크기(가능한 경우의 수)를 줄여야 합니다. 이때 알고리즘의 안전성이 ‘이미 검증된 AES의 안전성(2128=128비트)’ 이상만 된다면 충분히 안전하고 실용적인 FPE 알고리즘을 만든 것이라고 볼 수 있습니다. 즉, 원문과 암호문이 모두 16자리 십진수인 암호 알고리즘을 만들면서 AES 이상의 안전성을 확보하는 것이 알고리즘 개발의 과제입니다.
3 테이블 용량은 1016P1016 = (1016) ! = 60,000GB가 됩니다. P는 흔히 순열(Permutation)을 표시할 때 사용합니다.