No static method encodeBase64String([B)Ljava/lang/String; in class Lorg/apache/commons/codec/binary/Base64; or its super classes

Issue

Actually I am trying to add Aes Encryption and decryption functionality inside my android app. During encryption it will give me crash in my motoG5 S plus device but its working properly inside my One Plus device.

Here is my Code: AesUtil.Java

public class AesUtil {
private  int keySize = 256;
private  int iterationCount =  1000 ;
private  Cipher cipher;

private final String salt = "36e8fc9a6adf090665f459a7ad1b864d";
private final String iv = "ab00b7ea4e88500f2f0a17a7b5c7bcb1";
private final String passphrase = "ArknRQxD1YgaSFRHrjYazX7JMrlRxTERdkQx0dhENVlz";

public AesUtil() {
    try {
        cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    }
    catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
        throw fail(e);
    }
}

public String encrypt(String plaintext) {
    try {
        SecretKey key = generateKey(salt, passphrase);
        byte[] encrypted = doFinal(Cipher.ENCRYPT_MODE, key, iv, plaintext.getBytes("UTF-8"));
        return Base64.encodeBase64String(encrypted);
    }
    catch (UnsupportedEncodingException e) {
        throw fail(e);
    }
}




public String decrypt(String salt, String iv, String passphrase, String ciphertext) {
    try {
        SecretKey key = generateKey(salt, passphrase);
        byte[] decrypted = doFinal(Cipher.DECRYPT_MODE, key, iv, base64(ciphertext));
        return new String(decrypted, "UTF-8");
    } catch (Exception e) {
        throw fail(e);
    }
}

private byte[] doFinal(int encryptMode, SecretKey key, String iv, byte[] bytes) {
    try {
        cipher.init(encryptMode, key, new IvParameterSpec(hex(iv)));
        return cipher.doFinal(bytes);
    } catch (InvalidKeyException
            | InvalidAlgorithmParameterException
            | IllegalBlockSizeException
            | BadPaddingException e) {
        throw fail(e);
    }
}

public SecretKey generateKey(String salt, String passphrase) {
    try {
        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
        KeySpec spec = new PBEKeySpec(passphrase.toCharArray(), hex(salt), iterationCount, keySize);
        SecretKey key = new SecretKeySpec(factory.generateSecret(spec).getEncoded(), "AES");
        return key;
    }
    catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
        return null;
    }
}

public static byte[] base64(String str) {
    return Base64.decodeBase64(str);
}

public static byte[] hex(String str) {
    try {
        return Hex.decodeHex(str.toCharArray());
    }
    catch (DecoderException e) {
        throw new IllegalStateException(e);
    }
}

private IllegalStateException fail(Exception e) {
    e.printStackTrace();
    return null;
} }

Call Function in my main activity:

String encryptedText=AesUtil().encrypt("codeinsidecoffee")

Error Log Inside Moto G5s Plus:

java.lang.NoSuchMethodError: No static method encodeBase64String([B)Ljava/lang/String; in class Lorg/apache/commons/codec/binary/Base64; or its super classes (declaration of ‘org.apache.commons.codec.binary.Base64’ appears in /system/framework/org.apache.http.legacy.boot.jar)
at com.justcodenow.bynfor.utils.AesUtil.encrypt(AesUtil.java:40)

Solution

Method1: This method is available since version 1.4 of the Apache Commons Codec. If the OS of the phone has only an older version of the Codec package, the method won’t be available. Alternatively, we can use a method that exists in older versions.

Instead of:

String encodedString = Base64.encodeBase64String(bytes);

Use:

String encodedString = new String(Base64.encodeBase64(bytes));

And for decoding, instead of:

byte[] bytes = Base64.decodeBase64(encodedString);

Use:

byte[] bytes = Base64.decodeBase64(encodedString.getBytes()); 

Method-2: You can Also Use Below Complete code for Encryption and decryption.

import android.util.Base64;
import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Hex;
import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;

public class AesUtil {
private  int keySize = 256;
private  int iterationCount =  1000 ;
private  Cipher cipher;

private final String salt = "36e8fc9a6adf090665f459a7ad1b864d";
private final String iv = "ab00b7ea4e88500f2f0a17a7b5c7bcb1";
private final String passphrase = "ArknRQxD1YgaSFRHrjYazX7JMrlRxTERdkQx0dhENVlz";

public AesUtil() {
    try {
        cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    }
    catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
        throw fail(e);
    }
}

public String encrypt(String plaintext) {
    try {
        SecretKey key = generateKey(salt, passphrase);
        byte[] encrypted = doFinal(Cipher.ENCRYPT_MODE, key, iv, plaintext.getBytes("UTF-8"));
        return Base64.encodeToString(encrypted, Base64.DEFAULT);
    }
    catch (UnsupportedEncodingException e) {
        throw fail(e);
    }
}




public String decrypt(String salt, String iv, String passphrase, String ciphertext) {
    try {
        SecretKey key = generateKey(salt, passphrase);
        byte[] decrypted = doFinal(Cipher.DECRYPT_MODE, key, iv, base64(ciphertext));
        return new String(decrypted, "UTF-8");
    } catch (Exception e) {
        throw fail(e);
    }
}

private byte[] doFinal(int encryptMode, SecretKey key, String iv, byte[] bytes) {
    try {
        cipher.init(encryptMode, key, new IvParameterSpec(hex(iv)));
        return cipher.doFinal(bytes);
    } catch (InvalidKeyException
            | InvalidAlgorithmParameterException
            | IllegalBlockSizeException
            | BadPaddingException e) {
        throw fail(e);
    }
}

public SecretKey generateKey(String salt, String passphrase) {
    try {
        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
        KeySpec spec = new PBEKeySpec(passphrase.toCharArray(), hex(salt), iterationCount, keySize);
        SecretKey key = new SecretKeySpec(factory.generateSecret(spec).getEncoded(), "AES");
        return key;
    }
    catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
        return null;
    }
}

public static byte[] base64(String str) {
    return Base64.decode(str, Base64.DEFAULT);
}

public static byte[] hex(String str) {
    try {
        return Hex.decodeHex(str.toCharArray());
    }
    catch (DecoderException e) {
        throw fail(e);
    }
}

private IllegalStateException fail(Exception e) {
    e.printStackTrace();
    return null;
}


private static IllegalStateException fail(DecoderException e) {
    e.printStackTrace();
    return null;
} }

Answered By – Nimesh Patel

Answer Checked By – Clifford M. (FlutterFixes Volunteer)

Leave a Reply

Your email address will not be published. Required fields are marked *