来自java安全的Crypotography不工作并引发错误填充异常

来自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

我已经使用java的keytool实用程序创建了一个证书,并试图对代码进行加密和解密,但它不断抛出以下错误:;我尝试了从stackoverflow得到的所有可能的建议,但没有任何效果,我被困在如何解决:

堆栈跟踪:

    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,但它显示了一些无法读取的块。我不知道我哪里弄错了。
谢谢。

你误解了公钥密码的概念,我不打算在这个答案中给出教程。我会注意到一些事情,希望能为你指出进一步研究的正确方向

  • 您正在尝试使用私钥加密,同时也使用私钥解密。那不行。用公钥加密,用私钥解密

  • 通常,使用随机生成的密钥K使用对称算法(如AES或ChaCha)加密数据,然后使用接收方的RSA公钥Rpub加密K。然后,接收器使用其RSA私钥Rpriv对K进行解密,然后使用K和对称算法对数据进行解密

  • 请看一看,以帮助您发布更好的问题。请注意,在某些情况下(数字签名),您需要使用私钥加密,并使用公钥解密。在所有情况下,如果使用非对称加密,则不能使用相同的密钥进行加密和解密。
    // 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;
    }