vendredi 29 mai 2015

Android Base64 Encoding and Apache codec decoding

We are using following method for encoding a string using ANDROID Base64.NO_CLOSE

    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;
}

The generated encrypted string is being decrypted outside Android app using following method

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;

    }

We are getting following exceptions

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)

So the questions are

1) Is it possible to decrypt the encrypted string using ANDROID Base64.NO_CLOSE, outside Android, i mean directly in the IDE?

2) In one of post I found that string encrypted using ANDROID Base64.NO_WRAP can be decrypted outside Android env, is this a correct understanding?

Thanks a lot for you your help in advance.

Regards, Amit

Aucun commentaire:

Enregistrer un commentaire