Từ 4.1 Biểu diễn chuỗi ký tự của thông số dự thảo NIST SP 800 38G Rev 1 đã được đề cập trong các ý kiến:
Đầu vào và đầu ra dữ liệu cho chức năng mã hóa và giải mã FF1 và FF3-1 286 phải là chuỗi hữu hạn các chữ số, nghĩa là các chuỗi chữ số. Nếu dữ liệu được mã hóa được định dạng theo bảng chữ cái chưa phải là tập hợp các chữ số cơ số, thì mỗi ký tự phải được biểu thị bằng một chữ số riêng biệt để áp dụng FF1 hoặc FF3-1.
...
Việc lựa chọn và triển khai tương ứng một đối một giữa một bảng chữ cái nhất định và tập hợp các chữ số cơ số đại diện cho bảng chữ cái nằm ngoài phạm vi của ấn phẩm này.
Điều này vẫn chưa rõ ràng, nhưng về cơ bản, bạn cần ánh xạ chính tắc dữ liệu đầu vào của mình thành một phạm vi [0, N) và quay lại trong cả hai quá trình mã hóa và giải mã. Ánh xạ này nằm ngoài phạm vi, vì nó tất nhiên dành riêng cho đặc tả đầu vào dữ liệu.
Nếu dữ liệu của bạn bao gồm nhiều phạm vi thì mọi thứ sẽ phức tạp hơn một chút. Về cơ bản, trước tiên bạn sắp xếp thứ tự dữ liệu (thường từ trái sang phải), sau đó bạn xác định cơ sở cho từng nhóm phạm vi đầu vào riêng biệt. Sau đó, giá trị trong phạm vi được tạo bằng cách nhân phạm vi đầu vào với các cơ sở cấp thấp hơn.
Trước tiên tôi sẽ chỉ cho bạn cách những $\text{mã hóa}$ và $\text{decode}$ các chức năng sẽ hoạt động:
Giả sử rằng các phạm vi đầu vào dành cho một chữ số - không bao gồm số 0 - theo sau là một ký tự ở dạng chữ hoa ABC, tức là [1-9][A-Z]
. Cơ sở của các chữ số - không bao gồm số 0 - là $9$, cơ sở của bảng chữ cái tất nhiên là $26$.
Bây giờ hãy thử tính giá trị cho 7Z
. Nếu bạn tuân theo các quy tắc này thì giá trị bạn nhận được là $6 \cdot 26 + 25 = 181$, ở đâu $6$ là chỉ số của 7
Trong $[1, 9]$, $26$ là cơ sở (số ký tự) trong ABC và $25$ là chỉ số của z
trong ABC đó.
Để ánh xạ lại, trước tiên bạn thực hiện $181 \bmod 26$, mà sẽ cung cấp cho bạn $25$ một lần nữa, mang lại cho bạn z
sau khi hủy lập chỉ mục. Sau đó, bạn chia: $\big\lceil 181 / 26 \big\rceil$, và quay lại $6$ đó là chỉ số của 7
trong phạm vi $[1, 9]$.
Bây giờ chúng ta cần bao gồm mã hóa và giải mã:
Bây giờ bạn có thể thực hiện FF1 hoặc FF3 trên kết quả, $181$ và nhận một giá trị khác. Bạn có thể chỉ cần sử dụng các quy tắc để mã hóa điều này thành biểu diễn được yêu cầu của mình.
Vì vậy, nói rằng bạn có $\text{encode}(\text{"7Z"}) = 181$ và $\text{enc}_k(181) = 26$, sau đó điều này sẽ cung cấp cho bạn
$\text{decode}(26) = "1A"$ mà bạn có thể lưu trữ. Sau đó, bạn đảo ngược như thế này: $\text{decode}(\text{dec}_k(\text{encode}(\text{"1A"}))) = "7Z"$. Các tham số mã hóa và giải mã là dành riêng cho [1-9][A-Z]
.
Các thủ thuật trên có thể dễ dàng được mở rộng sang bất kỳ định dạng nào có phạm vi rõ ràng và - khi được mã hóa chính xác - chỉ cần phép nhân & phép cộng để mã hóa và chỉ cần phép chia có phần dư để giải mã.Quá trình mã hóa/giải mã sẽ mất chưa đến một phần triệu giây khi được triển khai chính xác (đối với các kích thước đầu vào tương đối nhỏ mà FPE thường được sử dụng).