java - 加密(模式和填充)

标签 java encryption cryptography public-key-encryption

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

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

根据我阅读的关于加密和解密的知识,除了算法(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 attack 的攻击。 .然而,请求 RSA 混合加密的人完全有可能甚至可能从未听说过这种攻击。一般来说,PKCS#1 v1.5 padding 仍然被用作默认值。

你永远不应该期望用户为你做出安全决定,除非唯一的用户是密码学的学生(并且知道上面的攻击)。一般来说,安全不应过分依赖于对用户的教育。

就我个人而言,我肯定会询问请求者有关填充的问题。您还应该检查他们是否期望对称加密的身份验证(MAC、HMAC、经过身份验证的密码或签名)。如果他/她不能回答问题,他们可能对加密知之甚少。

我目前认为您的要求不完整(尽管“出于学习目的”可能是一个该死的借口)。

注意事项

"RSA/ECB/PKCS1Padding" 实际上没有实现 ECB 模式加密。它应该被称为 "RSA/None/PKCS1Padding" 因为它只能用于加密单个明文 block (或者,实际上是一个 key )。这只是Sun/Oracle的命名错误。

还有一种称为 RSA-KEM 的混合加密模式,应该至少与 RSA OAEP 一样安全,但它尚未在 Java SE 中实现。

AES-256 本身不应用于“生成一次性 key ”。您应该使用 KeyGenerator 的实例生成一个 AES-256 一次性 key (这可能有点命名困惑,因为 KeyGenerator 本身并不使用 AES,它为 AES 创建 key 。

关于java - 加密(模式和填充),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27885726/

相关文章:

java - Dagger2+Retrofit 更改子组件的 URL : cannot be provided without an @Provides- or @Produces-annotated method

security - 为什么使用具有 CBC 模式的非随机 IV 会存在漏洞?

mysql - 在 MYSQL 中对敏感数据使用 AES 加密 - 实现问题

java - onCompleted 方法

java - 在 Restful-WebService 响应中包含所有 @OneToMany 实体?

java - java多线程中的生产者消费者

cryptography - 为什么.cer 文件公钥不包含 RSA 指数?

c - 下面的代码可能有什么问题,在 c 中给出了段错误

php - 未解密加密,能够操作加密数据

cryptography - Golang crypto 多次调用有不同的响应