这是我在本站上的第一个问题,我只有基本的RSA数学理解,请多包涵! :)
我正在为我的大学毕业项目编写Java Web应用程序。它是“Pret-a-voter”的网络实现,是一种安全投票系统,对于那些听说过的人来说。
我的问题在于,我想让扮演审计员角色的人表现出:
- 一个源字节数组(要加密的明文)
- RSA公钥文件
- 一个“目标”字节数组,这是根据明文和公钥计算的密码数据的结果
然后我希望审计员能够使用前两个项目进行加密,并确信第三个项目是结果。因此,我需要加密是确定性的,即在重复使用相同的明文和公钥进行加密时生成相同的密码数据。
(注意-在这个项目中,我使用非常小的数据块-根本没有对称加密...我知道这是RSA的一个“有趣”的用途!)
无论如何,我发现在Java中,使用
cipher = Cipher.getInstance("RSA");
使用默认的随机填充方案,需要消耗11个字节(因此,使用2048位密钥对,可以加密2048/8-11=245个字节)。重复加密相同的明文将生成不同的密文,这显然不是我想要的ECB模式。
我的问题是——我应该使用以下内容吗?
cipher = Cipher.getInstance("RSA/ECB/NoPadding");
我在很多地方读到RSA没有填充时不安全。这是因为攻击者可以建立明文/密文的字典吗?这是确定性加密的副作用,我需要它来允许审计员验证我的加密,在我的方案中,审计员是受信任的,所以这没问题。
我的第二个问题与Java相关。如果我像上面那样使用RSA/ ECB / NoPadding,我相信我能够提供一个长度为128的源字节数组(例如,对于1024位RSA密钥对),并将其加密以获得另一个长度为128的字节数组。然后,如果我尝试使用不同的1024长度公钥再次加密那个数组,我会得到
javax.crypto.BadPaddingException:消息大于模数
有人知道为什么吗?
编辑-NoPadding加密并不总是生成此异常-它很难琢磨。但是,即使加密不会生成此异常,解密也会生成此异常:
javax.crypto.BadPaddingException:数据必须以零开始
非常感谢您阅读这篇文章!任何帮助都将不胜感激。
编辑-抱歉,我的原始问题没有很清楚地说明我想要做什么,所以这里有一个[尝试]的解释:
- 明文是选民在选举中的投票。
- Pret-a-voter旨在实现端到端可验证性,同时不牺牲选民的机密性(等等)。选民在投票后会收到一张收据,他们可以使用该收据验证他们的投票是否被正确记录,并且稍后还将显示他们的投票没有被篡改。选民将在其收据上的信息与发布在网络上的完全相同的副本进行比较。
- 但是,任何选民都不应该能够证明自己的投票方式(因为这可能会导致强制),因此信息不是明文,而是投票的加密副本。
- 事实上,明文被加密了四次,使用四个不同的非对称密钥进行加密 - 由两个不同的出纳员持有,每个出纳员持有两个密钥。因此,一个投票(明文)提供给一个出纳员,该出纳员使用公钥#1加密它,然后使用其第二个公钥加密该密文,将该密文交给第二个出纳员,后者用相同的方式使用他的两个密钥加密它。结果的密文(四个顺序加密的结果)是发布到Web上的内容(公开发布)。出纳员是值得信赖的。
- 每个加密的选票可以被视为一个“洋葱”,其中心是选票,有几层加密。为了获得选票,必须逐层删除每个层,这意味着必须按相反的顺序应用对应的私钥(由出纳员持有)。这是安全的关键 - 所有出纳员必须合作才能解密投票。
- Web公告板可以被视为具有5列的表格 - 左侧的第一列包含完全加密的选票(也显示在每个选民的收据上),并且是投票阶段期间唯一可见的列。第二列包含相同的选票集,但已去除外层 - 出纳员2在计票阶段使用其私钥解密选票来填充此列和列3。在计票阶段结束时,第5列包含完全解密的选票,然后可以进行统计。
- 每个选民都会收到一个收据,将他们链接到第1列中的加密选票。这不显示他们的投票方式,但允许他们验证他们的投票是否未被篡改,因为在整个选举过程中,他们可以验证他们的加密选票仍然在第1列中未被触动。当然,这只是“端到端验证”的一半,因为选民无法验证解密是否已经正确完成,即在第2列中存在一个条目,其中是他们的投票减去外层加密。每个选民只负责到第1列之前的验证。
- 此后,审计员有责任检查第1列的条目是否解密为第2列等等。他们这样做的方法是依靠确定性加密和用于加密的公钥是公开的。
- 由于公钥是公开的,因此您不希望人们简单地从第5列到第1列画线,将某人的投票连接起来,因为它变得越来越多次加密 - 这样,将您与加密的选票联系起来的收据实际上将您与未加密的可读选票联系起来-->强迫!
很抱歉以上内容有些冗长 - 我希望它能描述我对确定性加密的需求。我错过了很多基本细节(我已经大量修改了此方案),但是希望核心原则都在那里。非常感谢您的阅读 - 我真的很感激。