我的任务是编写一个涉及加密的小型Java控制台应用程序。我不熟悉加密,所以我必须先读一些东西。到目前为止,给出的高级要求是应该使用AES-256来生成一次性密钥来加密文件。
之后,应使用接收方的公钥(RSA-2048)对该AES-256一次性密钥进行加密。然后,加密的文件和加密的一次性AES-256密钥将被压缩并发送给收件人。
根据我对加密和解密的理解,除了算法(RSA,AES等)之外,还有模式和填充。例如,下面的代码将RSA指定为algorithm、ECB mode和PKCS1Padding。
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");加密和解密必须使用相同的算法、模式和填充。因此,我去问用户他们想要什么模式和填充是合理的吗?
我注意到Cipher cipher = Cipher.getInstance("RSA")似乎使用默认模式ECB和PKCS1Padding填充,因此这行代码与上面的代码相同。那么,是否可以假设将使用ECB模式和PKCS1Padding模式作为RSA-2048的默认模式?
发布于 2015-01-11 19:12:55
不,对于发送消息,您应该使用较新的OAEP方案,因为带有PKCS#1 v1.5的RSAV1.5可能容易受到Bleichenbacher attack的攻击。然而,完全有可能,甚至很可能有人请求RSA混合加密从未听说过该攻击。一般来说,仍然使用PKCS#1 v1.5填充作为默认设置。
你不应该期望用户为你做出安全决策,除非唯一的用户是密码学的学生(并且知道上面的攻击)。一般来说,安全不应该太依赖于教育用户。
就我个人而言,我肯定会向请求者询问有关填充的问题。您还应该检查他们是否期望对称加密的身份验证(MAC、HMAC、已验证密码或签名)。如果他/她不能回答问题,他们可能不太了解加密。
我现在不会考虑给你的要求是完整的(尽管“为了学习的目的”可能是一个地狱的借口)。
备注
"RSA/ECB/PKCS1Padding"实际上并没有实现ECB模式的加密。它应该被称为"RSA/None/PKCS1Padding",因为它只能用于加密单个明文块(或者实际上是密钥)。这只是Sun/Oracle的命名错误。
还有一种称为RSA-KEM的混合加密模式,它应该至少与RSA OAEP一样安全,但尚未在Java SE中实现。
AES-256本身不应用于“生成一次性密钥”。您应该使用KeyGenerator的一个实例生成一个AES-256一次性密钥(这可能有点命名混乱,因为KeyGenerator本身并不使用AES,它为AES创建密钥)。
发布于 2015-01-11 19:27:41
您不希望询问用户有关填充或块模式的问题。我认为你需要做的是:
生成一个随机的256位密钥(请确保使用密码库,并具有良好的种子)
使用AES256和密钥对文件进行加密(不要使用ECB,如果您想稍微隐藏文件的确切长度,请使用CBC和可能的填充)
使用RSA-2048加密密钥(从安全的角度来看,块模式在这里是无关紧要的,因为密钥小于一个块,填充也是如此,因为密钥的长度是已知的。我会使用ECB)
您的协议不能保证文件的发送者或文件的完整性。这一点真的很重要,需要考虑签名。
不幸的是,在实现与crypto有关的任何事情时,您极有可能会出错。一定要使用Java库,如果可以找到更高级别的可信库,可以考虑使用这些库。
https://stackoverflow.com/questions/27885726
复制相似问题