解密错误:javax.crypto.BadPaddingException:消息大于模数

时间:2016-11-30 10:39:21

标签: java encryption

该程序以混合模式加密和解密。我运行它并且可以毫无问题地加密它,但是如果我尝试使用解密模式,控制台会向我显示以下消息:

解密部分以“DESENCRIPTAR”开头。

  

javax.crypto.BadPaddingException:消息大于模数

这是我的Java代码:

public static void main(String[] args) throws UnrecoverableKeyException, KeyStoreException, NoSuchAlgorithmException {
    final byte[] IV_PARAM = {
        0x06,
        0x07,
        0x08,
        0x09,
        0x0A,
        0x0B,
        0x0C,
        0x0D,
        0x0E,
        0x0F,
        0x00,
        0x01,
        0x02,
        0x03,
        0x04,
        0x05,
    };

    // MAGATZEM DE CLAUS
    String magatzemClaus = null;
    String contraMagatzemClaus = null;
    String alias = null;
    String contraAlias = null;
    String text = null;
    String concatenat = null;

    int opcio = 0;

    KeyStore keystore = null;
    SecretKey secretkey = null;
    PublicKey publickey = null;
    PrivateKey privateKey = null;

    byte[] missatgeEncriptat = null;
    byte[] clauEncriptada = null;
    byte[] clauMissatgeEncriptat = null;
    byte[] missatgeADesencriptar = null;
    byte[] missatgeDesencriptat = null;
    byte[] clau = null;

    // SCANNER
    Scanner teclat = new Scanner(System.in);

    // DEMANEM EL TEXT A ENCRIPTAR
    System.out.print("Introdueix el text: ");
    text = teclat.next();

    // DEMANEM MAGATZEM DE CLAUS
    System.out.print("MAGATZEM DE CLAUS: QuiMatA3\n");
    magatzemClaus = "QuiMatA3";

    // DEMANEM CONTRASENYA PER AL MAGATZEM DE CLAUS
    System.out.print("CONTRASENYA DE [" + magatzemClaus + "]: QuiMatA3\n");
    contraMagatzemClaus = "QuiMatA3";

    //DEMANEM OPCIO
    System.out.println("Transformaci� a realitzar [1] xifrar [2] desxifrar.");
    opcio = teclat.nextInt();

    //////////////////////////////////////////////
    //  KEYSTORE
    //////////////////////////////////////////////

    try {
        keystore = KeyStore.getInstance("JKS");
        File arxiu = new File(magatzemClaus + ".jks");
        if (arxiu.isFile()) {
            FileInputStream llegeix = new FileInputStream(arxiu);
            keystore.load(llegeix, contraMagatzemClaus.toCharArray());
        }
    } catch (KeyStoreException e) {
        System.err.println("error keystore: " + e.toString());
    } catch (FileNotFoundException e) {
        System.err.println("Error fileinput: " + e.toString());
    } catch (Exception e) {
        System.err.println("error al carregar: " + e.toString());
    }

    switch (opcio) {
        case 1:

            ///////////////////////////////////////////
            //      GENEREM SECRET KEY
            ///////////////////////////////////////////

            try {

                //GENEREM LA CLAU SECRETA
                KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
                keyGenerator.init(192);
                secretkey = keyGenerator.generateKey();

                // ALIAS DE LA CLAU
                System.out.println("ALIAS DE LA CLAU [" + contraMagatzemClaus + "]: QuiMat\n");
                alias = "QuiMat";

                //////////////////////////////////
                // ENCRIPTAR
                /////////////////////////////////
                Cipher xifrar = Cipher.getInstance("AES/CBC/PKCS5Padding");
                IvParameterSpec ivParam = new IvParameterSpec(IV_PARAM);
                xifrar.init(Cipher.ENCRYPT_MODE, secretkey, ivParam);
                missatgeEncriptat = xifrar.doFinal(text.getBytes());

            } catch (Exception e) {
                System.err.println("Error al generar clau secreta o al xifrar!" + e.toString());
            }

            //GENEREM LA CLAU PUBLICA

            try {
                publickey = keystore.getCertificate(alias).getPublicKey();
            } catch (KeyStoreException e) {
                System.err.println("Error al generar clau p�blica! " + e.toString());
            }

            //ENCRPITEM CLAU SIM�TRICA AMB LA CLAU P�BLICA
            // CLAU ENCRIPTADA
            Cipher xifrar;
            try {
                xifrar = Cipher.getInstance("RSA/ECB/PKCS1Padding");
                xifrar.init(Cipher.ENCRYPT_MODE, publickey);
                clauEncriptada = xifrar.doFinal(secretkey.getEncoded());
            } catch (Exception e) {
                System.err.println("Error al encriptar la clau sim�trica: " + e.toString());
            }

            // CONCATENEM
            concatenat = MadMarConverter.byteArrayToHexString(missatgeEncriptat) +
                MadMarConverter.byteArrayToHexString(clauEncriptada);
            System.out.println("Concatenaci� clau i text: " + concatenat);

            break;

        case 2:

            ////////////////////////////////////////////////////////////////////
            ////////////            DESENCRIPTAR
            ////////////////////////////////////////////////////////////////////

            // ALIAS DE LA CLAU
            System.out.println("ALIAS DE LA CLAU [" + contraMagatzemClaus + "]: QuiMat\n");
            alias = "QuiMat";
            //teclat.next();

            // CONTRASENYA ALIAS
            System.out.println("CONTRASENYA DE L'ALIAS  [" + alias + "]:QuiMatP\n");
            contraAlias = "QuiMatP";

            clauMissatgeEncriptat = MadMarConverter.hexStringToByteArray(text);

            //SEPAREM CLAU SIMETRICA DE MISSATGE ENCRIPTAT
            clau = Arrays.copyOfRange(clauMissatgeEncriptat, 0, 256); //GUARDEM CLAU EN UN ARRAY
            missatgeADesencriptar = Arrays.copyOfRange(clauMissatgeEncriptat, 256, clauMissatgeEncriptat.length); //MISSATGE EN UN ARRAY

            //CLAU PRIVADA

            privateKey = (PrivateKey) keystore.getKey(alias, contraAlias.toCharArray());

            /////////////////////////////////////
            //      DESXIFRAT CLAU SIMETRICA
            /////////////////////////////////////
            byte[] clauDesencriptada = null;

            try {

                Cipher desxifrar = Cipher.getInstance("RSA/ECB/PKCS1Padding");
                desxifrar.init(Cipher.DECRYPT_MODE, privateKey);
                clauDesencriptada = desxifrar.doFinal(clau);
            } catch (Exception e) {
                System.err.println("Error al desencriptar clau: " + e.toString());
            }

            secretkey = new SecretKeySpec(clauDesencriptada, 0, clauDesencriptada.length, "AES");

            /////////////////////////////////////////////////////
            //          DESXIFRAR MISSATGE
            /////////////////////////////////////////////////////
            try {
                Cipher desxifrar = Cipher.getInstance("AES/CBC/PKCS5Padding");
                IvParameterSpec ivParam = new IvParameterSpec(IV_PARAM);
                desxifrar.init(Cipher.DECRYPT_MODE, secretkey, ivParam);
                missatgeDesencriptat = desxifrar.doFinal(missatgeADesencriptar);
            } catch (Exception e) {
                System.err.println("Error al desencriptar missatge: " + e.toString());
            }

            System.out.println("Miisatge desencriptat: " + new String(missatgeDesencriptat));
            break;
        case 0:
            System.out.println("deu!");
            break;
    }

    teclat.close();
}

0 个答案:

没有答案