Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.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
javax.crypto.BadPaddingException:未知块类型_Java_Encryption_File Io_Rsa_Java Io - Fatal编程技术网

javax.crypto.BadPaddingException:未知块类型

javax.crypto.BadPaddingException:未知块类型,java,encryption,file-io,rsa,java-io,Java,Encryption,File Io,Rsa,Java Io,我试图模拟非对称密钥系统。我使用下面的代码生成密钥对,加密,解密密码。我有一个分布式环境,目前我将生成的密钥保存在一个文件系统中。我知道这是不安全的,但它只是为了测试的目的 私有静态SecureRandom random=新SecureRandom; 静止的{ Security.addProvidernew org.bouncycastle.jce.provider.BouncyCastleProvider; } 受保护的同步void generateKeys引发InvalidKeyExcept

我试图模拟非对称密钥系统。我使用下面的代码生成密钥对,加密,解密密码。我有一个分布式环境,目前我将生成的密钥保存在一个文件系统中。我知道这是不安全的,但它只是为了测试的目的

私有静态SecureRandom random=新SecureRandom; 静止的{ Security.addProvidernew org.bouncycastle.jce.provider.BouncyCastleProvider; } 受保护的同步void generateKeys引发InvalidKeyException、IllegalBlockSizeException、, BadPaddingException、NoSuchAlgorithmException、NoSuchProviderException、, NoSuchPaddingException{ KeyPairGenerator generator=KeyPairGenerator.getInstanceRSA,BC; 生成器。初始化256,随机; 密钥对=generator.generateKeyPair; Key pubKey=pair.getPublic; Key privKey=pair.getPrivate; //存储公钥 试一试{ storeKeypubKey,Constants.KEY_PATH.concatConstants.SERVER_PREFIX.concat-publickey; }捕获异常e{ e、 打印跟踪; DBLogger.logMessagee.toString,Status.KEY\u GENERATION\u错误; } //存储私钥 试一试{ storeKeyprivKey,Constants.KEY_PATH.concatConstants.SERVER_PREFIX.concat-privatekey; }捕获异常e{ e、 打印跟踪; DBLogger.logMessagee.toString,Status.KEY\u GENERATION\u错误; } } 受保护的同步字符串EncryptingUsingPublicKeyString明文抛出IllegalBlockSizeException、BadPaddingException、, NoSuchAlgorithmException、NoSuchProviderException、NoSuchPaddingException、InvalidKeyException、, FileNotFoundException、IOException、ClassNotFoundException{ Cipher Cipher=Cipher.getInstanceRSA/ECB/PKCS1Padding,BC; cipher.initCipher.ENCRYPT_MODE,readKeyConstants.KEY_PATH.concatConstants.SERVER_PREFIX.concat-publickey,随机; byte[]cipherText=cipher.doFinalplainText.getBytes; System.out.printlncipher:+新的StringcipherText; 返回新的字符串密文; } 受保护的同步字符串解密使用PrivateKeyString密文引发NoSuchAlgorithmException, NoSuchProviderException、NoSuchPaddingException、InvalidKeyException、FileNotFoundException、, IOException、ClassNotFoundException、IllegalBlockSizeException、BadPaddingException{ Cipher Cipher=Cipher.getInstanceRSA/ECB/PKCS1Padding,BC; cipher.initCipher.DECRYPT_模式,readKeyConstants.KEY_PATH.concatConstants.SERVER_PREFIX.concat-privatekey; 字节[]明文=cipher.doFinalcipherText.getBytes; System.out.PRINTLNPRAIN:+新字符串纯文本; 返回新的字符串纯文本; } 公共静态无效字符串[]args{ KeyGenerator KeyGenerator=新的KeyGenerator; 试一试{ keyGenerator.deleteAllKeysConstants.KEY\u路径; keyGenerator.generateKeys; 字符串密文=keyGenerator.EncryptingUsingPrivateKeyDilshan; keyGenerator.DecryptingUsingPublicKeyCiphertext; //字符串密文=keyGenerator.EncryptingUsingPublicKeyDilshan1; //keyGenerator.DecryptingPrivateKeyCiphertext; }捕获异常e{ e、 打印跟踪; DBLogger.logMessagee.toString,Status.KEY\u GENERATION\u错误; } } 这在大多数情况下都非常有效。但有时会产生以下错误。这种情况偶尔发生。大多数情况下,这是可行的,所以我对代码没有问题。我相信这与文件系统的序列化/序列化过程有关。谢谢你的帮助

注意:我使用的是bouncycastle

错误如下:

javax.crypto.BadPaddingException: unknown block type
    at org.bouncycastle.jcajce.provider.asymmetric.rsa.CipherSpi.engineDoFinal(Unknown Source)
    at javax.crypto.Cipher.doFinal(DashoA13*..)
    at com.dilshan.ttp.web.KeyGenerator.decryptUsingPublickey(KeyGenerator.java:105)
    at com.dilshan.ttp.web.KeyGenerator.main(KeyGenerator.java:150)
发生在

字节[]明文=cipher.doFinalcipherText.getBytes;
在使用私钥方法解密时。

密码文本是二进制数据。如果使用默认编码将其转换为字符串,则很可能会遇到无法用字符表示的字节序列。因此,在解密过程中,当您将字符串转换回字节数组时,不会得到相同的字节,因此解密失败


要解决这个问题,请不要将密码文本转换为字符串,而要携带字节[]。

密码文本是二进制数据。如果使用默认编码将其转换为字符串,则很可能会遇到无法用字符表示的字节序列。因此,在解密过程中,当您将字符串转换回字节数组时,不会得到相同的字节,因此解密失败


要解决这个问题,请不要将密文转换为字符串,而要随身携带字节[]。

您是正确的。问题在于方法签名。使用PrivateKeyByte[]密文解密。我没有生成is字符串,而是将其更改为字节数组,这对我很有用。谢谢你
你说得对。问题在于方法签名。使用PrivateKeyByte[]密文解密。我没有生成is字符串,而是将其更改为字节数组,这对我很有用。谢谢。除了@Henry的评论,plainText.getBytes这一行将来还会给你带来悲伤。它对运行它的平台使用默认编码。这可能会有所不同,而不是您想要的。您应该始终指定编码。UTF-8将始终有效,即明文.getBytesUTF-8。要从字节返回到字符串,请使用新的Stringplaintext,UTF-8Ok,我会修改它。谢谢@GregSIn除了@Henry的评论外,plainText.getBytes这一行将来会给你带来悲伤。它对运行它的平台使用默认编码。这可能会有所不同,而不是您想要的。您应该始终指定编码。UTF-8将始终有效,即明文.getBytesUTF-8。要从字节返回到字符串,请使用新的Stringplaintext,UTF-8Ok,我会修改它。谢谢@GregS