Encryption

想要生成數字優惠券程式碼?

  • May 20, 2017

我們想要生成優惠券程式碼系列,然後僅以數字加密這些優惠券程式碼,並且它也必須是可破譯的。

我們將與客戶共享加密程式碼作為優惠券程式碼。

這些是條件:

  1. 加密程式碼不得串聯或不易猜出;
  2. 加密程式碼必須是數字
  3. 加密程式碼必須具有特定數量的數字(想想:大小/長度)。

例子 :

我們生成從 1 到 100 的優惠券程式碼(需要數百萬,plainCode 將是數字或字母數字無關緊要)。

我們希望與使用者共享具有特定數字的加密數字優惠券程式碼。即如果程式碼是 52,那麼加密的程式碼給我們 10000 到 99999 之間(如果指定了 5 位數字或者它需要固定位數)

我們也可以解密。

筆記:

  1. 以上只是一個例子。可能性以百萬計。
  2. 安全不是主要問題。只是無法猜測很重要。
  3. 加密程式碼必須是數字。

問題:

是否有一種既定的、加密的安全方式來做到這一點?如果不是,我們需要做些什麼來處理這個問題?

任何建議或想法都非常受歡迎。

我們已經查看了 FPE。以特定位數返回的相同推薦的任何好的算法。我們有一個提供小於指定數字的加密數字,但我們希望在特定範圍之間保持位數而不0附加。

我對在自定義庫存系統中使用的位置標識符有幾乎相同的要求。我有一個 35 位程式碼,顯示為 7 個 5 位元素,需要人類可讀且唯一。生成程式碼的方法不一定要保留格式,這可能只是所使用算法的副作用。

我使用的方法生成一個 7 個字元的程式碼,每個字元是字母數字 0-9 和 AZ,省略 OIZS,因為它們在視覺上與 0125 太相似。在內部,該算法是一個名為 Bromine 的分組密碼,具有 5 個 7 位元素的廣義Feistel 網路,基於HIGHT 分組密碼的輪結構。輸入是一個數字序列,輸出是一個偽隨機字母數字序列:

JE4HV9W
JPNJ4NE
V20MUP3
QCKCVWU
QTR7FUC
5E94W9J
4HYWH14
9W1229T
PT6JJTV
MEWTT68
91ACL19
....

因為輸入序列是數字的,對於一個 35 位值的給定 343.6 億種可能性,只有 1000 萬個輸出組合。這限制了可用於對算法進行逆向工程或確定使用的密鑰的密文數量。該算法很簡單,但在給定密鑰大小的情況下(理論上)有足夠的輪次來保證安全。使用環境對這種安全性沒有要求,但如果需要,它允許將其用於其他應用程序。數字輸入是安全性和可用性要求,而不是算法的限制。

如果用於生成優惠券程式碼,則可以固定某些輸入元素或位,這些固定位可以定義優惠券類型或折扣。系統只需要跟踪使用的優惠券程式碼,並對其進行解碼以確定類型和有效性。只有 1/3436 隨機輸入的程式碼會解碼為有效輸入,有效輸入的優惠券數量也可以進一步限制。

例如,您的輸入可以構造為 XXYYYYZ,其中 XX 是優惠券類型,YYYY 是價值,Z 是固定元素,例如 0。優惠券 01 將分配給 5% 的折扣,之前只允許使用 100 次優惠券它過期了。當進入系統時,它被解碼,它的結構有效性被確定(是數字並且Z=0),XX被確定為有效的優惠券,並且YYYY被確定為尚未用於給定的XX。如果滿足所有要求,則給予折扣,並保存 XXYYYY 以與其他優惠券進行比較。此範例格式中只有 0.003% 滿足所需的結構,其中只有 1% 解碼為所需的優惠券類型。

如果需要更長的程式碼,這種密碼的變體很容易以其他大小生成。40 位版本將子字擴展為 8 位,並顯示為 8 個字元程式碼。用於顯示為 6 位 7 字元程式碼的 42 位版本是通過將 5 個子字 7 位 Feistel 結構擴展到 6 個子字來創建的,而 48 位版本將其子字擴展到 8 位。

如果我理解正確,你想“加密”一個數字,把它變成另一個數字,然後逆轉這個過程?我認為這個算法可以用於這個目的……

虛擬碼:(對於您的“從 1 到 100”範例)

int i = 1
int key
int max = 100
list(of int) intList
read value for key
do until i = max
if i mod 2 = 0
intList.add(i * (i + key))
else
intList.add(round((i + _key) * i / 3))
end if
i+=1
loop

我在 VB 中實現了這個算法,我得到了一些看起來很隨機的數字 https://s22.postimg.org/42m3uoy01/bitmap.jpg

您可以反轉算法以“解密”數字。

我沒有碰撞(2 個數字產生相同的值),但有些非常接近。現在,如果您要按長度對值進行排序(甚至隨機排列它們的順序),您將擁有大量可以反轉為初始數量的優惠券。請注意,每個數字的最小加密數字不等於最小解密數字等。

截圖

引用自:https://crypto.stackexchange.com/questions/40834