将整数加密为人类可读的字符串<= 10个字符

本文关键字:字符串 10个 字符 加密 整数 人类 | 更新日期: 2023-09-27 18:05:05

我需要找到一种方法(最好是非对称的)[1]加密/解密单个Int32,所得到的加密值仅包含有效字符[2]并且长度小于11个字符。

我该怎么做呢?

[1]根据目前的答案,对称加密是很好的

[2]字母数字[0-9a-zA-Z],特殊字符"$-_.+!*'()

将整数加密为人类可读的字符串<= 10个字符

您不能使用非对称加密,如RSA,而得到小的东西。加密的值将是模数的大小(以字节为单位),例如1024位为128字节。IIRC . net不允许您使用小于384bits(48字节)的密钥,这仍然太大而且不太安全[1]。

您最好使用对称算法,块大小在64到256位之间,然后对结果使用base64(这应该为64位提供11个字符)。

[1]在任何情况下,记住猜一个整数,在最大情况下,是一个2^32的问题;-)

正如另一个答案所说,非对称解决方案很困难,最好的标准解决方案是使用具有短块大小的对称密码。您对10个字符的限制意味着以64为基数的60位,但是您可以使用自定义编码来获得64位(对于块密码,您需要发送精确数量的块)。

如果你使用64位块大小,你将不得不修复IV.换句话说,如果你发送相同的数字两次,它将以相同的方式编码两次[不正确!]-在下面的评论中看到整洁的想法]。但对于32位分组密码,您可以使用随机IV(填充来隐藏重复值)。看起来skip32将是一个不错的选择-看看哪个"好";块加密算法的输出最短?

另一个特别的想法,我刚刚扯出来的,因此可能不安全的是把你的消息分成两个:32位和其余的。用一个随机值填充其余部分,您可以将其用作任何流密码(http://en.wikipedia.org/wiki/Stream_cipher)的种子(如果有必要,可以填充零),然后用该密码的前32位进行xor加密(因此您的最终消息是32位xor结果加上随机种子)。

最后,我不知道为什么每个人都确信这些消息将/应该/必须是不安全的。安全性不依赖于消息大小(重要的是密钥大小)。据我所知,小块只对长消息弱。在这里,您没有长消息(能够在2^32中猜出一条消息与在类似的"少量"猜测后知道所有消息之间存在重要区别)。

使用base64可以得到大约66位和11个字符。如果你增加你的字符集,你会得到更多。(如果你认为中文符号是"人类可读的",你会得到更多)

我不认为使用这些参数进行安全的非对称加密是可能的。RSA需要几百个甚至更多的大于1000位的密钥和块。即使是椭圆曲线加密也使用比~66位大得多的块。

另一方面,你可能可以用这些属性得到对称加密。但是我想不出任何标准算法可以做到这一点,因为64位密钥大小现在有点小,大多数64位块的密码都有64位密钥。

所以我会用更大的(128位+)密钥搜索一个体面的64位块密码。我认为其中有一些是存在的,但不常用。

不要忘记给64位添加随机填充。只有2^32种不同的明文可能是危险的。

没有任何传统的非对称算法的结果适合11个或更少的字符。

对于真正安全的解决方案,您需要为每条消息提供唯一的序列号或标识符;这将是你可以用来初始化密码模式的东西,就像CBC的IV或CTR模式的计数器。然而,重要的是,对于给定的纯文本,这个种子是不可预测的。

消息中还有其他信息可以用作计数器吗?这不必是一个秘密。您只是想模糊整数,还是真正加密它?

将值与给定的键进行异或,然后将结果显示为十六进制字符串