Ответ 1
Я сделал небольшой javascript (node) lib для fpe:
https://github.com/mderazon/node-fpe
Он использует метод prefix cipher. Материал из Википедии:
Один простой способ создать алгоритм FPE на {0,..., N-1} - назначить псевдослучайный вес каждому целому числу, затем отсортировать по весу. Веса определяются путем применения существующего блочного шифрования к каждому целому. Black и Rogaway называют этот метод "префиксным шифрованием" и показали, что он был так же хорош, как и используемый блок-шифр.
Таким образом, чтобы создать FPE в домене {0,1,2,3}, заданный ключ K применяет AES (K) к каждому целому числу, давая, например,
weight(0) = 0x56c644080098fc5570f2b329323dbf62
weight(1) = 0x08ee98c0d05e3dad3eb3d6236f23e7b7
weight(2) = 0x47d2e1bf72264fa01fb274465e56ba20
weight(3) = 0x077de40941c93774857961a8a772650d
Сортировка [0,1,2,3] по весу дает [3,1,2,0], поэтому шифр
F(0) = 3
F(1) = 1
F(2) = 2
F(3) = 0.
Этот метод полезен только при малых значениях N. Для больших значений, размер таблицы поиска и необходимое количество шифров инициализация таблицы становится слишком большой, чтобы быть практичной.