AES从整数到整数的加密

时间:2014-06-15 06:09:37

标签: java encryption aes

我在java中使用AES加密算法来加密我的数据库值。我的加密函数将加密值作为String返回,但是类型为" Int"的列。无法存储非常合乎逻辑的字符串值。有没有办法将整数加密为整数(数值)?三江源。

4 个答案:

答案 0 :(得分:1)

Plain AES返回一个字节数组。您可以将其存储为字节数组,Base64文本字符串或BigInteger

BigInteger myBigInt = new BigInteger(AESByteArray);

128位或更大的AES结果不太可能适合32位Java int

如果你想要32位输入和32位输出,那么一切都适合Java int,然后编写你自己的32位Feistel cipher,或使用Hasty Pudding Cipher,这可以是设置为您需要的任何位大小。

答案 1 :(得分:1)

将整数加密为整数就是FPE(保留格式的加密)。 FPE不会更改数据类型或数据长度。 这就是为什么数据库仅对字符数据实施FPE而对int实施FPE的原因。 AES 128将加密128位块。这是16个字节。 如果要加密64位或32位整数(4或8个字节的值),则仍必须加密16个字节的块。可以通过将8(或12)个字节添加到int32或int64值来解决此问题。这就产生了问题-如果添加的字节始终为0,则会严重限制加密,因为数据集受到严重限制。它可以用于对AES等的蛮力攻击。反过来,可以通过添加8或12个字节的加密强随机数来解决此问题(这也会造成漏洞,因为您的随机生成器很可能不够强)。解密时,您可以清除额外添加的字节,仅提取16字节中的4或8字节。 尽管如此,生活并不完美。 AES加密不会更改块的大小,它总是产生16个字节。您可以将int加密为16个字节,但是数据库只能为int存储8个字节。 除非您将数据存储在binary(16)列中。但这不是整数,您需要整数。 理论上,numeric(38)占用16个字节。在某些数据库中,可以将16个字节设置为任意值,然后提取。我还没有看到它的实现。

答案 2 :(得分:0)

您始终可以将字符串编码为整数,但它可以是一个大整数。

如果你不能提供大整数,你可以用多个小整数对它进行编码。

如果既不能提供大整数也不能提供多个整数,也许你无论如何都不能做得好,在ECB模式下使用分组密码几乎总是一个坏主意。

答案 3 :(得分:0)

尝试将加密输出从字符串转换为二进制,然后从二进制转换为十进制整数。