Если ваши идентификаторы относительно короткие (15 байт или меньше), то я предлагаю зашифровать их блочным шифром, а именно AES . AES использует секретный ключ K длиной 128, 192 или 256 бит (достаточно 128 бит). Поскольку AES обрабатывает блок размером 16 байтов, вам нужно немного дополнить свой идентификатор. «Обычный» заполнитель (известный как «PKCS # 5») состоит в добавлении n байтов ( n> = 1 ), все они имеют значение n так, чтобы полученная длина была подходящей (здесь вам нужна длина 16).
Таким образом, преобразование ID (конфиденциальные данные) в S (шифрованная строка, которая может быть показана широкой публике): S = AESencrypt_K ( площадка (ID)) . Обратная операция: ID = unpad (AESdecrypt_K (S)) . Если ID равен 16 байтам или более, то при шифровании будет использоваться несколько вызовов AES, и есть некоторые тонкости в том, как эти вызовы связаны друг с другом. Ключевое слово режим цепочки и обычный ответ "CBC".
Знание секретного ключа K (тот же K ) необходимо для обеих операций. Это означает, что тот, кто может вычислить S из ID , также может вычислить ID из S и наоборот.
Теперь, если вам нужно, чтобы некоторые сущности могли вычислять S из ID , не давая им возможности выполнять обратную операцию, тогда все будет сложнее. В частности, у вас не должно быть детерминированного процесса: если существует единственный S , который может быть вычислен из ID , тогда любой может попробовать исчерпывающий поиск возможных значений ID , пока не будет найдено соответствие с данным S . Таким образом, вы должны расслабить модель, так как данный ID может дать большое количество возможных зашифрованных строк S ', так что все эти S' могут быть преобразованным обратно в ID кем-то, кто имеет "правильное" секретное значение. Это то, что вы получите от асимметричного шифрования. Обычный алгоритм асимметричного шифрования - RSA . С 1024-битным ключом RSA (типичный размер для надлежащей защиты) ID может иметь размер до 117 байт, а S ' будет иметь длину 128 байт (размер увеличение соответствует введенным случайным данным, что делает процесс недетерминированным). Если 128 байтов слишком много, вы можете получить более короткие зашифрованные сообщения с помощью шифрования Эль-Гамаля по эллиптическим кривым (примерно до 40 байт или около того, для размера до 10 байт ID ), но вы может быть трудно найти существующую реализацию.