来自java安全的Crypotography不工作并引发错误填充异常
我已经使用java的keytool实用程序创建了一个证书,并试图对代码进行加密和解密,但它不断抛出以下错误:;我尝试了从stackoverflow得到的所有可能的建议,但没有任何效果,我被困在如何解决: 堆栈跟踪:来自java安全的Crypotography不工作并引发错误填充异常,java,cryptography,Java,Cryptography,我已经使用java的keytool实用程序创建了一个证书,并试图对代码进行加密和解密,但它不断抛出以下错误:;我尝试了从stackoverflow得到的所有可能的建议,但没有任何效果,我被困在如何解决: 堆栈跟踪: javax.crypto.BadPaddingException: Data must start with zero at sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:325) at sun.se
javax.crypto.BadPaddingException: Data must start with zero
at sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:325)
at sun.security.rsa.RSAPadding.unpad(RSAPadding.java:272)
at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:356)
at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:382)
at javax.crypto.Cipher.doFinal(Cipher.java:2087)
代码
这里用于转换字符串,我在加密字节后将其转换为十六进制字符串,并将该十六进制字符串传递给decrypt,在decrypt方法中,该字符串被转换回byte并传递给doFinal方法。
但是抛出了一个错误。我试图将填充改为noPaading,但它显示了一些无法读取的块。我不知道我哪里弄错了。
谢谢。你误解了公钥密码的概念,我不打算在这个答案中给出教程。我会注意到一些事情,希望能为你指出进一步研究的正确方向
// Encryption code
protected byte[] encryptMessageWithPrivateKey(String aMessage) throws Exception {
ByteArrayOutputStream inputStream = new ByteArrayOutputStream();
ByteArrayOutputStream resultStream = new ByteArrayOutputStream();
byte[] vEncoded = null;
DataOutputStream outStream = new DataOutputStream(inputStream);
outStream.writeBytes(Integer.toString(this.randomGen.nextInt()));
outStream.writeBytes(":");
outStream.writeBytes(this.mTimestampFormat.format(Long.valueOf(System.currentTimeMillis())));
outStream.writeBytes(":");
outStream.writeBytes(",");
outStream.writeBytes(aMessage);
DataOutputStream resultWriter = new DataOutputStream(resultStream);
if (this.mEncryptCipher == null) {
KeyStore privateKs = KeyStore.getInstance(KeyStore.getDefaultType());
privateKs.load(new FileInputStream(new File(mPrivateCertFile)), null);
KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry) privateKs
.getEntry(mPrivateCertKey, new KeyStore.PasswordProtection(
mPrivateCertPassword.toCharArray()));
PrivateKey privateKey = privateKeyEntry.getPrivateKey();
System.out.println("encrypt private key : " + privateKey.getFormat());
this.mEncryptCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
this.mEncryptCipher.init(1, privateKey);
System.out.println("mEncryptCipher = " + this.mEncryptCipher);
}
byte[] vMyUnincryptedString = inputStream.toByteArray();
resultWriter.write(this.mEncryptCipher.doFinal(vMyUnincryptedString));
vEncoded = resultStream.toByteArray();
System.out.println("Encrypt length : " + vEncoded.length);
return vEncoded;
}
// Decyption code
protected byte[] decryptMessageWithPrivateKey(String aSecretMessage) throws Exception {
System.out.println("aSecretMessage : " + aSecretMessage);
byte[] vNoSecret = null;
if (this.mDecryptCipher == null) {
KeyStore privateKs = KeyStore.getInstance(KeyStore.getDefaultType());
privateKs.load(new FileInputStream(new File(mPrivateCertFile)), null);
KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry) privateKs
.getEntry(mPrivateCertKey, new KeyStore.PasswordProtection(
mPrivateCertPassword.toCharArray()));
PrivateKey privateKey = privateKeyEntry.getPrivateKey();
/*
* KeyPair keyPair =
* KeyPairGenerator.getInstance("RSA").generateKeyPair(); PublicKey
* publicKey=keyPair.getPublic(); System.out.println("public key : "
* +publicKey.toString());
*/
System.out.println("privateKey = " + privateKey.getAlgorithm());
this.mDecryptCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
/* .getInstance("RSA/ECB/PKCS1Padding"); */
System.out.println("List of provider : ");
Provider[] prov = Security.getProviders();
for (Provider provider : prov) {
System.out.println(" : " + provider.getName() + " ,Info : " + provider.getInfo());
}
this.mDecryptCipher.init(2, privateKey);
System.out.println("mDecryptCipher = " + this.mDecryptCipher);
}
/* byte[]encryptText = HexToByte.hexStringToByteArray(aSecretMessage); */
byte[] encryptText = TestConverter.afromHex(aSecretMessage);
System.out.println("Encrypt lenght : " + encryptText);
vNoSecret = this.mDecryptCipher.doFinal(encryptText);
System.out.println("vNoSecret msg : " + vNoSecret.length);
return vNoSecret;
}