Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 加密(模式和填充)_Java_Encryption_Cryptography_Public Key Encryption - Fatal编程技术网

Java 加密(模式和填充)

Java 加密(模式和填充),java,encryption,cryptography,public-key-encryption,Java,Encryption,Cryptography,Public Key Encryption,我的任务是编写一个涉及加密的小型Java控制台应用程序。我不熟悉加密技术,所以我必须先做一些阅读。到目前为止,给出的高级别要求是AES-256应用于生成一次性密钥以加密文件 之后,应使用收件人的公钥(RSA-2048)加密AES-256一次性密钥。加密文件和加密的一次性AES-256密钥将被压缩并发送给收件人 从我对加密和解密的理解来看,除了算法(RSA、AES等)之外,还有所谓的模式和填充。例如,以下代码将RSA指定为算法、ECB模式和PKCS1Padding Cipher cipher =

我的任务是编写一个涉及加密的小型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,因此这行代码与上面的代码相同。因此,可以假定RSA-2048默认使用ECB模式和PKCS1Padding模式吗?

否,对于发送消息,您应该使用较新的OAEP方案,因为带有PKCS#1 v1.5的RSA可能容易受到攻击。然而,请求RSA混合加密的人完全有可能从未听说过这种攻击。一般情况下,PKCS#1 v1.5填充仍然用作默认值

您不应该期望用户为您做出安全决策,除非唯一的用户是密码学专业的学生(并且知道上述攻击)。一般来说,安全性不应该过分依赖于教育用户

就我个人而言,我肯定会询问请求者关于填充物的问题。您还应该检查他们是否希望对称加密使用身份验证(MAC、HMAC、身份验证密码或签名)。如果他/她不能回答这个问题,他们可能对加密不太了解

我现在不会考虑你的要求是完整的(虽然“为了学习目的”可以是一个地狱的借口)。< /P> 笔记
“RSA/ECB/PKCS1Padding”
实际上并没有实现ECB模式加密。它应该被称为“RSA/None/pkcs1pdadding”,因为它只能用于加密单个明文块(或者实际上是一个密钥)。这只是Sun/Oracle的命名错误

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


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

您不想询问用户关于填充或块模式的问题。我认为你需要做的是:

生成一个随机的256bit密钥(确保使用加密库来执行此操作,并具有良好的种子设定)

使用带密钥的AES256加密文件(不要使用ECB,如果您想稍微隐藏文件的确切长度,请使用CBC和可能的填充)

使用RSA-2048加密密钥(此处,从安全角度来看,块模式是不相关的,因为密钥小于一个块,填充也是如此,因为密钥的长度已知。我将使用ECB)

您的协议不保证是谁发送了文件或文件的完整性。这是非常重要的考虑,考虑签署。< /P>
不幸的是,当实现任何与加密有关的东西时,您极有可能出错。一定要使用Java库,如果您能找到更高级别的可信库来做更接近您想要的事情,考虑使用那些。

HMAC是一个很好的替代方案,当只有一个共享的秘密是已知的而不是发送者身份时,我可以使用下面的代码来生成AES-256一次键:Kig生成器密钥生成器=密钥生成器.GETSimple(AES);keyGenerator.init(256);SecretKey SecretKey=keyGenerator.generateKey();是的,那也很好。在下面做同样的事情,但它更清晰。修改答案以使用您的解决方案。AES密钥生成器不使用您的问题中或多或少暗示的AES(“是否应使用AES-256生成一次性密钥”),因此需要注意。根据回复,我想我必须询问请求者有关模式和填充的问题。请求者可能是像我这样的技术人员。完全同意这一点。希望他们是明智的人,接受明智的问题。PKCS#1 v1.5更可能是有意的,但由于它可能不安全,您最好100%确定,并向他们解释不应该使用它。如果他们有疑问,请指向此答案。给出的回答是:“验证证书后,使用收件人证书中的公钥加密AES 256密钥,并指定‘带填充的PKCS7’”。那么模式应该是什么呢?根据@Tom L下面所说的,键小于一个块,所以块模式和填充都是不相关的。