首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >没有静态方法encodeBase64String([B)Ljava/lang/String;在类Lorg/apache/共用/编解码器/二进制/Base64 64中;或它的超类

没有静态方法encodeBase64String([B)Ljava/lang/String;在类Lorg/apache/共用/编解码器/二进制/Base64 64中;或它的超类
EN

Stack Overflow用户
提问于 2020-12-30 04:38:36
回答 1查看 2.3K关注 0票数 1

实际上,我正试图在我的android应用程序中添加Aes加密和解密功能。在加密期间,它将使我崩溃在我的motoG5 S+设备,但它在我的一个加设备内正常工作。

这里是我的代码: AesUtil.Java

代码语言:javascript
运行
复制
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;
} }

我主要活动中的调用函数:

代码语言:javascript
运行
复制
String encryptedText=AesUtil().encrypt("codeinsidecoffee")

Moto G5s Plus中的G5s日志:

/system/framework/org.apache.http.legacy.boot.jar):java.lang.NoSuchMethodError:没有静态方法encodeBase64String([B)Ljava/lang/String;在类Lorg/apache/java.lang.NoSuchMethodError/codec/二进制/Base64 64中;或它的超类( 'org.apache.commons.codec.binary.Base64‘的声明出现在java.lang.NoSuchMethodError at com.justcodenow.bynfor.utils.AesUtil.encrypt(AesUtil.java:40)中)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-30 04:38:36

Method1:自Apache 1.4版本以来,就可以使用此方法。如果手机的操作系统只有较旧版本的Codec包,则该方法将不可用。或者,我们可以使用旧版本中存在的方法。

而不是:

代码语言:javascript
运行
复制
String encodedString = Base64.encodeBase64String(bytes);

使用:

代码语言:javascript
运行
复制
String encodedString = new String(Base64.encodeBase64(bytes));

和用于解码,而不是:

代码语言:javascript
运行
复制
byte[] bytes = Base64.decodeBase64(encodedString);

使用:

代码语言:javascript
运行
复制
byte[] bytes = Base64.decodeBase64(encodedString.getBytes()); 

方法2:您还可以使用下面的完整代码进行加密和解密.

代码语言:javascript
运行
复制
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;
} }
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65502088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档