首页 > 解决方案 > 带有私钥的 RSA 解码文件

问题描述

我有一个应用程序客户端/服务器,它使用以下代码在客户端加密文件:

 private static byte[] cifrador(byte[] file) throws Exception {

    String provider = "SunJCE";
    String algorithm = "RSA";
    String transfor = "/ECB/PKCS1Padding";

    /************************************************************
     * Xerar e almacear a clave
     ************************************************************/

    // Obter a clave publica do trustStore

    KeyStore ks = KeyStore.getInstance("JCEKS");

    ks.load(new FileInputStream(pathCliente + TrustStore), password.toCharArray());

    PublicKey publicKeyServer = ks.getCertificate("serverkey").getPublicKey();

    Cipher cipher = Cipher.getInstance(algorithm + transform);
    cipher.init(Cipher.ENCRYPT_MODE, publicKeyServer);
    byte[] encodedFile = cipher.update(file);
    return encodedFile;
}

在此之后,我通过 SSL 连接将编码的文件发送到服务器,服务器尝试使用下一个代码对其进行编码:

public static byte[] descifrador(byte[] encodedFile) throws Exception {
    String provider = "SunJCE";
    String algorithm = "RSA";
    String transform = "/ECB/PKCS1Padding";

    char[] key_password = password.toCharArray();
    KeyStore ks = KeyStore.getInstance("JCEKS");

    ks.load(new FileInputStream(path + KeyStore), key_password);

    KeyStore.PrivateKeyEntry pkEntry = (KeyStore.PrivateKeyEntry)
            ks.getEntry("serverkey",
                    new KeyStore.PasswordProtection(key_password));


    PrivateKey privateKeyServer = (PrivateKey) ks.getKey("serverkey", key_password);

    Cipher decoder = Cipher.getInstance(algorithm + transform);

    decoder.init(Cipher.DECRYPT_MODE, privateKeyServer);

    // byte[] decodedFile = decoder.update(encodedFile);
    byte[] decodedFile = decoder.doFinal(encodedFile);

    return decodedFile;
}

使用decoder.update(encodedFile)我得到的方法Null和使用该方法decoder.doFinal(encodedFile)我得到下一个错误:

javax.crypto.BadPaddingException: Decryption error
at java.base/sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:382)
at java.base/sun.security.rsa.RSAPadding.unpad(RSAPadding.java:294)
at java.base/com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:364)
at java.base/com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:390)
at java.base/javax.crypto.Cipher.doFinal(Cipher.java:2191)

请提供一些想法并感谢您的回答

标签: javasecurityencryptionrsadecode

解决方案


推荐阅读