微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 48位到48位使用什么类型的加密?

我有一堆48位(6字节)值,我需要对称加密.这两个要求是:

>生成的加密值也需要48位(6字节)长.它们关键本身可以(并且最好是)更长时间来防止暴力攻击.
>产生的加密值需要是确定性的,即使用密钥B的值A将始终产生加密值C(我们在运行中加密并向用户显示加密数据,因此需要始终显示相同的值)

我发现的所有块密码都使用了64的最小块大小并且看起来是固定的(不能使用任意块大小).我应该考虑流密码吗?

我在Java中这样做.

注意:我已经看过this question和相关答案,但不清楚这些建议是否符合我的第二个要求.

解决方法

(对不起,我最初误读了认为需要6个字节的INPUT数据的要求.)

我不认为您可以使用标准加密算法完全按照您的要求执行操作:

>流密码的问题在于,标准的密码通过从密钥生成随机位流然后用明文对这些位进行异或来有效地工作;实际上这意味着你永远不应该使用相同的位流两次(例如,如果你这样做,那么XORing两个密文给你的结果与对相应的明文相同;并且在任何情况下都有48位,只有2 ^ 48可能比特流,所以你可以通过蛮力来测试它们;
>块密码的问题是,就我所知,块大小为48位而言,没有标准密码.

现在,这并不意味着无法开发48位分组密码 – 事实上我敢说有一些密码 – 只是没有经过多年审查的沼泽标准密码加密社区具有该块大小.

所以我建议选项是:

>放宽48位密文的要求;例如,TripleDES具有64位块大小并且“相当”安全(相当于112位安全性)[*];
>原则上,您可以使用您需要的任何块大小来实现自己的分组密码,尽可能贴近标准设计,例如:遵循一些通常推荐的设计原则的Feistel网络 – 作为起点,参见Schneier,“Applied Cryptography”,pp.446ff,“Block Cipher Design Theory”.

后一种选择的明显问题是,惠斯特标准分组密码通常基于共同的一般原则,它们采用经过相当严格审查的特定设计决策;你的大概不会.

我还建议从问题中稍微退一步(或者或许可以解释一下你正在尝试做的事情),因为它似乎是基于通常违反良好安全实践的要求(具有相同的明文总是加密)例如,对于相同的密文,通常会特别避免这种密文.所以你可以拥有世界上设计最好的Feistel密码,但在你如何使用它时会引入一些其他的漏洞.

[*]通常不建议使用TripleDES,因为AES可以更有效地提供更好的安全性(您可能希望看到我在Java中使用的一些comparative timings of block ciphers以查看它有多糟糕).但是,这可能与您的特定应用无关.

不,只需用你不关心的一些字节“填充”你的数据(但如果这是你的要求则总是相同的),这样你就可以达到一个块的大小. (如果您使用的是合适的padding mode,那么这将为您完成.)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐