有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Android Base64编码和Apache编解码器解码

我们使用以下方法使用ANDROID Base64对字符串进行编码。没关系

    public static String encrypt(String inputString, byte[] keyBytes) {
    Calendar cal = Calendar.getInstance();
    int mDay = cal.get(Calendar.DAY_OF_MONTH);
    // System.out.println("Day of month :::" + mDay);
    String encryptedString = "";
    Key publicKey = null;
    try {
        Random generator = new Random(mDay);
        int num = (generator.nextInt()) % 100;
        String salt = "WEER563784" + num;
        inputString += salt;
        X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        publicKey = keyFactory.generatePublic(publicKeySpec);
    } catch (Exception e) {
        System.out.println("Exception rsaEncrypt:::::::::::::::::  "
                + e.getMessage());
        e.printStackTrace();
    }
    // Encode the original data with RSA public key
    byte[] encodedBytes = null;
    try {
        Cipher c = Cipher.getInstance("RSA");
        c.init(Cipher.ENCRYPT_MODE, publicKey);
        encodedBytes = c.doFinal(inputString.getBytes());
        encryptedString = Base64.encodeToString(encodedBytes,
                Base64.NO_CLOSE);
        System.out.println(encryptedString);
    } catch (Exception e) {
        System.out.println("Exception rsaEncrypt:::::::::::::::::  "
                + e.getMessage());
        e.printStackTrace();
    }

    return encryptedString;
}

生成的加密字符串正在Android应用程序外部使用以下方法解密

public static String decrypt(String inputString, byte[] keyBytes) {
        String resultStr = null;
        Calendar cal = Calendar.getInstance();
        int mDay = cal.get(Calendar.DAY_OF_MONTH);
        Random generator = new Random(mDay);
        int num = (generator.nextInt()) % 100;
        String salt = "qqq" + num;
        PrivateKey privateKey = null;
        try {
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(keyBytes);
            privateKey = keyFactory.generatePrivate(privateKeySpec);
        } catch (Exception e) {
            System.out.println("Exception privateKey:::::::::::::::::  "
                    + e.getMessage());
        }
        byte[] decodedBytes = null;
        try {
            Cipher c = Cipher.getInstance("RSA/ECB/PKCS1Padding");
            // Cipher c = Cipher.getInstance("RSA");
            c.init(Cipher.DECRYPT_MODE, privateKey);
            // decodedBytes = c.doFinal(Base64.decodeBase64(inputString));
            decodedBytes = c.doFinal(Base64InputStream());

        } catch (Exception e) {
            System.out.println("Exception privateKey1:::::::::::::::::  "
                    + e.getMessage());
            e.printStackTrace();
        }
        if (decodedBytes != null) {
            resultStr = new String(decodedBytes);
            System.out.println("resultStr:::" + resultStr + ":::::");
            resultStr = resultStr.replace(salt, "");
        }
        return resultStr;

    }

我们有以下例外情况

javax.crypto.BadPaddingException: Decryption error
    at sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:380)
    at sun.security.rsa.RSAPadding.unpad(RSAPadding.java:291)
    at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:365)
    at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:391)
    at javax.crypto.Cipher.doFinal(Cipher.java:2087)
    at RSAEncryption.decrypt(RSAEncryption.java:41)
    at RSAEncryption.main(RSAEncryption.java:108)

所以问题是

1)是否可以使用ANDROID Base64对加密字符串进行解密。不,在Android之外,我是说直接在IDE中

2)在一篇帖子中,我发现这个字符串是用ANDROID Base64加密的。安卓环境外无法解密任何包装,这是正确的理解吗

非常感谢您事先的帮助

问候,, 阿米特


共 (1) 个答案

  1. # 1 楼答案

    问题已经解决了

    在解密时,我们需要使用RSA/ECB/NOP

    基本上,当我们在Android设备中使用RSA加密值时,在单独的独立Java环境中解密时,应在密码中添加RSA/ECB/NOP

    Android加密代码:

    public static String encrypt(String inputString, byte[] keyBytes) {
            Calendar cal = Calendar.getInstance();
            int mDay = cal.get(Calendar.DAY_OF_MONTH);
            // System.out.println("Day of month :::" + mDay);
            String encryptedString = "";
            Key publicKey = null;
            try {
                Random generator = new Random(mDay);
                int num = (generator.nextInt()) % 100;
                String salt = "MNSadm563784" + num;
                //inputString += salt;
                X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(keyBytes);
                KeyFactory keyFactory = KeyFactory.getInstance("RSA");
                publicKey = keyFactory.generatePublic(publicKeySpec);
            } catch (Exception e) {
                System.out.println("Exception rsaEncrypt:::::::::::::::::  "
                        + e.getMessage());
                e.printStackTrace();
            }
            // Encode the original data with RSA public key
            byte[] encodedBytes = null;
            try {
                Cipher c = Cipher.getInstance("RSA");
                c.init(Cipher.ENCRYPT_MODE, publicKey);
                encodedBytes = c.doFinal(inputString.getBytes());
                encryptedString = Base64.encodeToString(encodedBytes,
                        Base64.NO_CLOSE);
                System.out.print("  -??"+encryptedString+"??   -");
            } catch (Exception e) {
                System.out.println("Exception rsaEncrypt:::::::::::::::::  "
                        + e.getMessage());
                e.printStackTrace();
            }
    
            return encryptedString;
        }
    

    服务器解密代码:

    public static String decrypt(String inputString, byte[] keyBytes) {
            String resultStr = null;
    //      Calendar cal = Calendar.getInstance();
    //      int mDay = cal.get(Calendar.DAY_OF_MONTH);
    //      Random generator = new Random(mDay);
    //      int num = (generator.nextInt()) % 100;
    //      String salt = "MNSadm563784" + num;
            PrivateKey privateKey = null;
            try {
                KeyFactory keyFactory = KeyFactory.getInstance("RSA");
                EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(
                        keyBytes);
                privateKey = keyFactory.generatePrivate(privateKeySpec);
            } catch (Exception e) {
                System.out.println("Exception privateKey:::::::::::::::::  "
                        + e.getMessage());
                e.printStackTrace();
            }
            byte[] decodedBytes = null;
            try {
                Cipher c = Cipher.getInstance("RSA/ECB/NoPadding");
                // Cipher c = Cipher.getInstance("RSA");
                c.init(Cipher.DECRYPT_MODE, privateKey);
                decodedBytes = c.doFinal(Base64.decodeBase64(inputString));
                // decodedBytes = c.doFinal(Base64InputStream());
    
            } catch (Exception e) {
                System.out.println("Exception privateKey1:::::::::::::::::  "
                        + e.getMessage());
                e.printStackTrace();
            }
            if (decodedBytes != null) {
                resultStr = new String(decodedBytes);
                System.out.println("resultStr:::" + resultStr + ":::::");
    //          resultStr = resultStr.replace(salt, "");
            }
            return resultStr;
    
        }