Chr*_*ris 9 java encryption rsa deterministic encryption-asymmetric
这是我在这个网站上的第一个问题,我对RSA只有基本的数学理解,所以请耐心等待!:)
我正在为大学的最后一年项目编写一个Java Web应用程序.这是一个基于网络的实施"Pret-a-voter",一个安全的投票系统,适用于那些听过它的人.
基本上我的问题是我希望能够给某人履行审计员的角色:
然后,我希望审计员能够使用前两项执行加密,并确信第三项是结果.因此,我需要加密是确定性的,即每次重复使用相同的明文和公钥加密时生成相同的密码数据.
(注意 - 我在这个项目中的数据很小块的工作 - 有在所有涉及没有对称加密...我知道这是一个"有趣"的使用RSA的!)
无论如何我发现在Java中,使用
cipher = Cipher.getInstance("RSA");
Run Code Online (Sandbox Code Playgroud)
使用默认的随机填充方案,在11个字节的成本(因此与2048位密钥对,这是可能的加密2048/8-11 = 245字节).对同一明文的重复加密会产生不同的密文,这显然不是我想要的ECB模式.
我的问题是 - 我应该使用以下内容吗?
cipher = Cipher.getInstance("RSA/ECB/NoPadding");
Run Code Online (Sandbox Code Playgroud)
我已经在很多地方看到RSA没有填充而不安全.这仅仅是因为攻击者可以建立明文/密文字典吗?这是确定性的加密我需要为了让审计人员来验证我的加密的副作用,并在我的方案审核员信任,所以这将是确定.
我的问题的第二部分与java有关.如果我确实如上所述使用RSA/ECB/NoPadding,我相信我能够提供(例如)长度为128(对于1024位RSA密钥对)的源字节数组并加密以获得另一个长度的字节数组128.如果我再尝试加密是再次,与1024不同长度的公钥,我得到
javax.crypto.BadPaddingException:消息大于模数
有谁知道为什么?
编辑 - 使用NoPadding进行加密并不总能产生这种异常 - 这是一种性情.但是,即使加密没有生成此异常,解密也会生成:
javax.crypto.BadPaddingException:数据必须以零开头
非常感谢您阅读本文!任何帮助将不胜感激.
编辑 - 对不起,我原来的问题不是很明确我想做什么,所以这是一个[尝试]解释:
抱歉,这是如此冗长 - 我希望它描述了我对确定性加密的需求.我错过了很多基本细节(我已经大量修改了这个方案),但希望核心原则都存在.非常感谢你阅读 - 我真的很感激.
删除填充会使系统不安全。如果公钥确实是公开的,如您所说,那么攻击者可以简单地转到第 5 列,获取明文,并按照正确的顺序使用 4 个公钥对其进行加密。然后,他们可以将生成的密文与接收者的密文进行匹配,从而损害“无强制”属性。
随机填充阻止了这一点,因为攻击者不知道要添加什么填充。
您将需要使用普通填充,但向一部分审计员(通常在选举系统中称为“审查员”)显示私钥的一个子集。这意味着一个检查员可以确认第 1 列与第 2 列匹配,另一个可以确认第 2 列与第 3 列匹配,依此类推。单独的监票员不能将选民与选票相匹配,只能是合作的。
您收到“消息大于模数”错误的原因是因为每个模数都不同,因此一次加密的密文可能超出下一次加密的允许范围。
| 归档时间: |
|
| 查看次数: |
7257 次 |
| 最近记录: |