javax.crypto.BadPaddingException:给定的最后一个块没有正确填充。[使用解密的DES密钥时出现问题]

javax.crypto.BadPaddingException:给定的最后一个块没有正确填充。[使用解密的DES密钥时出现问题],java,encryption,cryptography,des,Java,Encryption,Cryptography,Des,我正在开发一套程序,对数据进行加密,然后再次解密(比如创建一个必须由办公室修改的文档) 我对用户数据使用DES,然后使用office的公钥加密DES密钥,这部分不会产生错误,但当我尝试解密密钥并使用它时,会出现以下错误:javax.crypto.BadPaddingException:给定的最后一个块没有正确填充。 我已经搜索了这个错误,但由于我发现的案例都与我的相似,所以我找不到问题所在 下面是我用来生成和加密DES密钥的代码(加密是通过从文件中检索公钥来完成的): //创建DES密钥 key

我正在开发一套程序,对数据进行加密,然后再次解密(比如创建一个必须由办公室修改的文档)

我对用户数据使用DES,然后使用office的公钥加密DES密钥,这部分不会产生错误,但当我尝试解密密钥并使用它时,会出现以下错误:javax.crypto.BadPaddingException:给定的最后一个块没有正确填充。

我已经搜索了这个错误,但由于我发现的案例都与我的相似,所以我找不到问题所在

下面是我用来生成和加密DES密钥的代码(加密是通过从文件中检索公钥来完成的):

//创建DES密钥
keyGeneratorGeneradOrdes=KeyGenerator.getInstance(“DES”);
初始代(56);
SecretKey claveDES=generadorDES.generateKey();
//使用DES密钥加密数据
Cipher cifradorDES=Cipher.getInstance(“DES/ECB/PKCS5Padding”);
cifradorDES.init(Cipher.ENCRYPT_模式,claveDES);
byte[]bufferDatos=datosJson.getBytes();
字节[]datosCifrados=cifradorDES.doFinal(缓冲数据);
//加密DES密钥
addProvider(新的BouncyCastleProvider());
KeyFactory keyFactoryRSA=KeyFactory.getInstance(“RSA”、“BC”);
File ficheroClavePublica=新文件(args[2]+“.publica”);
int-tamanoficeroclavepublica=(int)ficheroClavePublica.length();
byte[]bufferPub=新字节[TamanofichorClavePublica];
FileInputStream in=新的FileInputStream(ficheroClavePublica);
in.read(bufferPub,0,TamanofichorClavePublica);
in.close();
X509EncodedKeySpec clavePublicaSpec=新的X509EncodedKeySpec(bufferPub);
PublicKey clavePublicaOficina=keyFactoryRSA.generatePublic(clavePublicaSpec);
Cipher cifradorRSAOficina=Cipher.getInstance(“RSA”、“BC”);
civradorrsaoficina.init(Cipher.ENCRYPT_模式,clavePublicaOficina);
字节[]claveDESCifrada=cifradorsaoficina.doFinal(claveDES.getEncoded());
然后我将其与其余数据一起存储,当轮到办公室解密时,这就是代码(同样,私钥由文件检索):


//解密DES密钥
File ficheroClavePrivada=新文件(args[2]+“.privada”);
int-tamanoficeroclaveprivada=(int)ficheroClavePrivada.length();
byte[]bufferPriv=新字节[TamanofichorClavePrivada];
FileInputStream in=新的FileInputStream(ficheroClavePrivada);
in.read(bufferPriv,0,TamanofichorClavePrivada);
in.close();
PKCS8EncodedKeySpec clavePrivadaSpec=新的PKCS8EncodedKeySpec(bufferPriv);
PrivateKey clavePrivadaOficina=keyFactoryRSA.generatePrivate(clavePrivadaSpec);
Cipher cifradorsa=Cipher.getInstance(“RSA”、“BC”);
cifradorsa.init(Cipher.DECRYPT_模式,clavePrivadaOficina);
字节[]claveSecretaB=cifradorsa.doFinal(claveDESCifrada);
SecretKeyFactory secretKeyFactoryDES=SecretKeyFactory.getInstance(“DES”);
DESKeySpec DESspec=新的DESKeySpec(claveSecretaB);
SecretKey claveSecreta=SecretKey工厂des.generateSecret(DESspec);
//解密用户数据
字节[]datosPeregrinoCifrados=paqueteCred.getContenidoBloque(“datosPeregrino”);
Cipher cifradorDES=Cipher.getInstance(“DES/ECB/PKCS5Padding”);
cifradorDES.init(Cipher.DECRYPT_模式,claveSecreta);
字节[]datosPeregrinoDES=cifradorDES.doFinal(datosPeregrinoCifrados);

根据错误,异常在最后一行。我想这就是执行选项的所有相关代码,而且我也不确定会出什么问题。提前谢谢。

我不知道您为什么要使用过时的DES。重要的部分不见了!DES的密码在哪里?@kelalaka完全忘了那部分!我现在在
//用DES加密数据
注释下添加了它。至于过时的DES,我对密码学一无所知,所以我使用的是我给出的示例,但是如果有更好的选择,请告诉我。您应该使用AES的认证加密模式,如AES-GCM或ChaCha20-poly1305。有了这些,您将拥有机密性、完整性和身份验证。我想指出的是,您的变量不是英文的,因此它们对所有人都没有意义。下一次更好地使用英语?这可能有助于@kelalalaka:ChaCha20-Poly1305,但前提是java 11升级或Bouncy 1.64,这两个版本今天都不确定。另外,您建议在WinXP上使用j5???Paula:我没有发现你的代码有任何错误(除了DES不安全,在ECB中更糟糕),它成功地为我运行。检查您的存储:确保它可以存储和返回任意字节(二进制数据而不是字符),并确保它返回的解密字节与DES加密操作(datosCifrados)创建的字节完全相同——尽管您对RSA包装密钥所做的一切似乎都没有问题。我不知道您为什么使用过时的DES。重要的部分不见了!DES的密码在哪里?@kelalaka完全忘了那部分!我现在在
//用DES加密数据
注释下添加了它。至于过时的DES,我对密码学一无所知,所以我使用的是我给出的示例,但是如果有更好的选择,请告诉我。您应该使用AES的认证加密模式,如AES-GCM或ChaCha20-poly1305。有了这些,您将拥有机密性、完整性和身份验证。我想指出的是,您的变量不是英文的,因此它们对所有人都没有意义。下一次更好地使用英语?这可能有助于@kelalalaka:ChaCha20-Poly1305,但前提是java 11升级或Bouncy 1.64,这两个版本今天都不确定。另外,您建议在WinXP上使用j5???宝拉:我看不出你的代码有任何错误(除了DES不安全,在ECB中更糟糕),而且它运行正常