当前位置: 首页 > 知识库问答 >
问题:

加密(模式和填充)

秦宏硕
2023-03-14

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

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

根据我对加密和解密的理解,除了算法(RSA、AES等)之外,还有一些叫做模式和填充的东西。例如,下面的代码指定RSA为算法、ECB模式和PKCS1Padding。

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

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

共有1个答案

范承教
2023-03-14

不,对于发送消息,您应该使用较新的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创建密钥)。

 类似资料:
  • 问题内容: 我的任务是编写一个涉及加密的小型Java控制台应用程序。我对加密不熟悉,因此我必须先阅读一些内容。到目前为止,给出的高级要求是应使用AES-256生成一次性密钥来加密文件。 之后,应使用收件人的公共密钥(RSA-2048)来加密该AES-256一次性密钥。然后将加密的文件和加密的一次性AES-256密钥压缩并发送给收件人。 从我对读取的加密和解密的了解中,除了算法(RSA,AES等)之

  • 我正在尝试将aes-128-cbc加密与openssl一起使用,我希望密钥需要32位。但是,我注意到当我输入密钥长度为18时,openssl不会给我错误。 但是,如果我在密钥后添加0,直到它是32位,我仍然会得到相同的结果。 有文档说OpenSSL给键添加了填充吗? 编辑:我需要在代码中重现此行为。我得到了密钥,但不能保证密钥是多少位数。

  • 本文向大家介绍Java实现SSH模式加密,包括了Java实现SSH模式加密的使用技巧和注意事项,需要的朋友参考一下 Java实现SSH模式加密的实现原理思路分享给大家。 一、SSH加密原理 SSH是先通过非对称加密告诉服务端一个对称加密口令,然后进行验证用户名和密码的时候,使用双方已经知道的加密口令进行加密和解密,见下图: 解释:SSH中为什么要使用非对称加密,又使用对称加密,到底有什么用处?到底

  • 在Android中生成RSA密钥对。Android中包含了Bouncy castle的删减版本: Python中的加密: Android解密。android中包含了Bouncy castle的删减版本: 测试密钥:

  • 问题内容: 我希望用户能够单击表,并根据他们单击的行-它会用与该行相关的内容(MYSQL查询)填充模式,并打开模式。 我尝试执行以下操作:-加载表内容-使用jQuery单击表时-使用AJAX通过单击的行信息发布到PHP文件-使用行信息执行MYSQL查询- 填充具有收集的内容的模态-打开模态 我遇到的问题是,因为这是一条MYSQL语句,并且该函数是非阻塞的,所以在模式开始打开时尚未声明变量。Web编

  • 我正在尝试将java代码转换为NodeJs代码。这有点复杂,因为定制的格式包括密码和salt。 在main方法中有一个例子。 以下是我的java代码: 我正在尝试下面这样的JS代码,但不知道我做错了什么: 它抛出一个错误: 谢谢