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

时间:2011-08-09 19:02:00

标签: c# .net encryption

我需要找到一种方法(最好不对称地)[1]加密/解密单个Int32,结果加密值只包含有效字符[2],长度不超过11​​个字符。

我将如何做到这一点?

[1]鉴于目前为止的答案,对称加密很好

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

5 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

如果使用64位块大小,则必须修复IV。换句话说,如果你发送两次相同的数字,它将以相同的方式编码两次[不是真的! - 在下面的评论中看到整洁的想法]。但是使用32位分组密码,您可以使用随机IV(填充来隐藏重复值)。看起来像skip32将是一个不错的选择 - 请参阅Which "good" block encryption algorithm has the shortest output?

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

最后,我不知道为什么每个人都相信这些信息会/应该/必须是不安全的。安全性不依赖于消息大小(密钥大小很重要)。据我所知,小块只对弱消息很弱。在这里你没有长信息(能够猜测2 ^ 32中的单个消息和在类似的“小”猜测之后知道所有消息之间存在重要区别)。

答案 2 :(得分:1)

使用base64可以获得大约66位,包含11个字符。如果你增加你的角色集,你会得到更多。 (如果你认为中文符号“人类可读”你会得到更多)

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

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

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

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

答案 3 :(得分:0)

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

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

邮件中是否还有其他可用作计数器的信息?它不一定是秘密。你只是想模糊整数,还是真正加密它?

答案 4 :(得分:-1)

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