保形加密(FPE)

保形加密(FPE)

通过一个小例子来通俗易懂地解释保形加密,并使用 Python 来实现保形加密(FPE, FF3-1)。

数学基础伽罗瓦域Golang FPE (已开源)保形加密解决的问题保持原始数据格式

AES('123456') 是一堆乱码,而 FPE('123456') 会返回一个类似 '908245' 的打乱后的字符串。保持原始数据的长度

AES('123456') 的输出长度必须是 16 字节的倍数,而 FPE('123456') 的输出长度和输入长度一样。我们公司对应的场景是短链生成算法,通过数据库主键生成短链,而且要求短链长度固定。类似这样:FPE('00001') = 'a3b4c',其中 00001 是数据库主键,a3b4c 是加密后的短链码。

其他了解到的应用场景:

用户信息加密(例如公司之间营销信息共享,同时也能保证用户信息不会泄漏)加密流程在保形加密过程中,原始数据被分成两部分,分别进行加密处理。

如下图所示, FPE 会先用前半部分数据 AES 加密后得到的数据,加上后半部分的数据,并对后半部分的有限域空间取模,得到后半部分的加密结果。

加密后半部分数据在把后半部分加密成功以后,再用相同的方式,对前半部分数据进行加密处理。如此多次循环后,就得到了最终的加密数据。

下表中用一个仅包含 2 次循环的简单保形加密来解释:

encrypt_formula其中:

plaintext = A + B

其中 A B 各占一半长度,不一定要相等长度。W 即 padding,为了满足 AES block-size = 16bytes 的限制。Rev() 翻转字节的函数AES() 用来 AES128 加密的函数mod 即取模。

例如 11 % 7 = 4-11 % 7 = 3因为 (-7 * 2) = -14(-11) - (-14) = 3U 即 A 半部分的最大表示空间。

比如对于 16 进制的 plaintext='3d4'A = '3d'U = len(A) ** 16U = 256V 即 B 半部分的最大表示空间。

比如对于 16 进制的 plaintext='3d4'B = '4'U = len(B) ** 16U = 16上述流程中是如何保形的?利用一些取模运算的特性,如下面的代码片段所示:

# 将要被加密的原始数据 X

x = 45735432

# 混淆用的密钥(对应 FPE 实现中的 tweak)

y = 45739654332543

# 模空间,模空间必须能够包含 X,否则造成数据丢失,那就没法解密了。

m = 99999999

print('取模特性测试,x, y, m = ', x, y, m)

c = (x+y) %m

result = (c - y) % m

print(c, result, x == result)

print('\n当 X 超出模空间的范围时,解密会失败:')

m = 99999

c = (x+y) %m

result = (c - y) % m

print(c, result, x == result)

Output:

取模特性测试,x, y, m = 45735432 45739654332543 99999999

got cipher: 525372

decrypt cipher: 45735432 True

当 X 超出模空间的范围时,解密会失败:

got cipher: 69549

decrypt cipher: 35889 False

原理就是每次循环,都通过 AES + tweak + 另外一半未加密数据 生成一个"16字节的随机数",然后和需要被加密的数字取模,得到本次循环加密后的结果。

多次循环后,就可以得到一个毫无规律的结果。

在解密时,反着按照上面流程来一次就行。

其中,上面 Sb0 = AES(Rev(W + B0)) 是生成随机数的主要公式,并且可以被任意的加密算法替代。

解密流程再看看这张图,把算法简化一下,可以写成:

后半部分数据=MOD(AES(前半部分数据))后半部分数据 = MOD(AES(前半部分数据))后半部分数据=MOD(AES(前半部分数据))

即通过 AES + 取模运算(MOD)得到的。

加密后半部分数据因为 “取模运算(MOD)” 和 “AES 加密” 都是可逆的过程,所以解密时只需要再把前半部分的 AES 结果计算出来,然后计算取模前的结果即可。

“计算取模前的结果” 这一步利用的是 “有限域” 的性质,

已在上述流程中是如何保形的?这一小节证明。

算法实现Golang FPE (已开源)参考资料Python ImplementationFF3-1伽罗瓦域

相关推荐

【每日足球帅图】范佩西手机壁纸精选国家队篇
拍视频用什么单反好
365bet中文

拍视频用什么单反好

⌛ 08-01 👁️ 9506
绿卡更新换发最新流程
365bet中文

绿卡更新换发最新流程

⌛ 01-08 👁️ 4208
如何正确开启热水器的详细步骤与注意事项
365bet中文

如何正确开启热水器的详细步骤与注意事项

⌛ 08-22 👁️ 3099
dnf光枪100武器哪个好
365bet中文

dnf光枪100武器哪个好

⌛ 08-26 👁️ 2148
《古文观止》是什么书?
365bet中文

《古文观止》是什么书?

⌛ 10-20 👁️ 4337
SHE最好听的10首歌 SHE经典歌曲十首
365allsports

SHE最好听的10首歌 SHE经典歌曲十首

⌛ 12-01 👁️ 478
龙之谷弓箭手转职最强推荐——准确的技能搭配和装备选择是关键(打造无敌射手)
红茶和绿茶都有哪些
365体育APP官网

红茶和绿茶都有哪些

⌛ 08-17 👁️ 2964