加密(模式和填充)

我的任务是编写一个涉及加密的小型Java控制台应用程序。我对加密不熟悉,因此我必须先阅读一些内容。到目前为止,给出的高级要求是应使用AES-256生成一次性密钥来加密文件。

之后,应使用收件人的公共密钥(RSA-2048)来加密该AES-256一次性密钥。然后将加密的文件和加密的一次性AES-256密钥压缩并发送给收件人。

从我对读取的加密和解密的了解中,除了算法(RSA,AES等)之外,还有所谓的模式和填充。例如,以下代码将RSA指定为算法,ECB模式和PKCS1Padding。

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

加密和解密中必须使用相同的算法,模式和填充。因此,我合理地去问用户他们想要什么模式和填充?

我注意到,Cipher cipher = Cipher.getInstance(“ RSA”)似乎使用ECB的默认模式和PKCS1Padding的填充,因此此代码行与上面的代码相同。那么可以确定默认将ECB模式和PKCS1Padding模式用于RSA-2048吗?

回答:

不可以,对于发送消息,您应该使用较新的OAEP方案,因为带有PKCS#1 v1.5的RSA可能容易受到Bleichenbacher攻击。但是,请求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创建密钥)。

以上是 加密(模式和填充) 的全部内容, 来源链接: utcz.com/qa/410118.html

回到顶部