java - 解密错误: caused by java. lang.noclassdeffounderror com/android/org/constcrypt/OpenSSLRSAPublicKey android

标签 java android encryption cryptography android-6.0-marshmallow

您好,我正在尝试从 Android 上的公钥解密内容:

public String decrypt(String basetext) {

        try {
            FileInputStream iR = new FileInputStream("/sdcard/publickkey");
            ObjectInputStream inputStream = new ObjectInputStream(iR);
            final PublicKey key = (PublicKey) inputStream.readObject();

            byte[] text = Base64.decode(basetext, Base64.DEFAULT);

            // get an RSA cipher object and print the provider
            final Cipher cipher = Cipher.getInstance("RSA");

            // decrypt the text using the public key
            cipher.init(Cipher.DECRYPT_MODE, key);
            byte[] dectyptedText = cipher.doFinal(text);

            iR.close();
            return new String(dectyptedText,"UTF-8");

        } catch (Exception ex) {
            ex.printStackTrace();
            return  null;
        }
    }

它在我的棉花糖上运行良好,尝试在模拟器 4.2.2 上运行,但抛出以下错误:

caused by java.lang.noclassdeffounderror com/android/org/constcrypt/OpenSSLRSAPublicKey android

如果我看到我的导入,则没有像上面这样的错误导入

import javax.crypto.Cipher;
import java.security.PublicKey;
import java.io.ObjectInputStream;
import java.io.FileInputStream;

这在真实设备 android marshmallow 上工作正常,4.2.2 在模拟器上它崩溃了

全类:-

import android.util.Base64;

import java.io.File;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;

import javax.crypto.Cipher;

public class EncryptionUtils {

    public static final String ALGORITHM = "RSA";
    public static final String PRIVATE_KEY_FILE = "/sdcard/private.key";
    public static final String PUBLIC_KEY_FILE = "/sdcard/public.key";

    public static void generateKey() {
        try {
            final KeyPairGenerator keyGen = KeyPairGenerator.getInstance(ALGORITHM);
            keyGen.initialize(2048);
            final KeyPair key = keyGen.generateKeyPair();

            File privateKeyFile = new File(PRIVATE_KEY_FILE);
            File publicKeyFile = new File(PUBLIC_KEY_FILE);

            // Create files to store public and private key
            if (privateKeyFile.getParentFile() != null) {
                privateKeyFile.getParentFile().mkdirs();
            }
            privateKeyFile.createNewFile();

            if (publicKeyFile.getParentFile() != null) {
                publicKeyFile.getParentFile().mkdirs();
            }
            publicKeyFile.createNewFile();

            // Saving the Public key in a file
            ObjectOutputStream publicKeyOS = new ObjectOutputStream(
                    new FileOutputStream(publicKeyFile));
            publicKeyOS.writeObject(key.getPublic());
            publicKeyOS.close();

            // Saving the Private key in a file
            ObjectOutputStream privateKeyOS = new ObjectOutputStream(
                    new FileOutputStream(privateKeyFile));
            privateKeyOS.writeObject(key.getPrivate());
            privateKeyOS.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public static String encrypt(String text, PrivateKey key) {
        try {
            // get an RSA cipher object and print the provider
            final Cipher cipher = Cipher.getInstance(ALGORITHM);
            // encrypt the plain text using the private key
            cipher.init(Cipher.ENCRYPT_MODE, key);
            byte[] cipherText = cipher.doFinal(text.getBytes("UTF-8"));
            String base64 = Base64.encodeToString(cipherText, Base64.DEFAULT);
            return  base64;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public static String decrypt(String basetext, PublicKey key) {

        try {
            byte[] text = Base64.decode(basetext, Base64.DEFAULT);

            // get an RSA cipher object and print the provider
            final Cipher cipher = Cipher.getInstance(ALGORITHM);

            // decrypt the text using the public key
            cipher.init(Cipher.DECRYPT_MODE, key);
            byte[] dectyptedText = cipher.doFinal(text);
            return new String(dectyptedText,"UTF-8");

        } catch (Exception ex) {
            ex.printStackTrace();
            return  null;
        }
    }
}

最佳答案

在定义您打算使用的密码时,具体是值得的。而不是使用:

final Cipher cipher = Cipher.getInstance("RSA");

你应该尝试:

final Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

我相信普通 Java 和 Android 之间存在一些不一致,我不记得是什么版本,但在大多数情况下,上述调整可以解决问题。

关于java - 解密错误: caused by java. lang.noclassdeffounderror com/android/org/constcrypt/OpenSSLRSAPublicKey android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41527728/

相关文章:

android - Android EditText,ButtonEdit无法正确显示?

c++ - 如何在 Crypto++ 中加载 Base64 RSA key

git 在推/pull 时加密/解密远程存储库文件

java - 在 css 中更改 TabPane 的顶部颜色

安卓NDK : no archive symbol table

java - 使用 ObjectReader 相对于 ObjectMapper 有什么好处?

android - Android 中的子元素可以忽略其包含样式吗?

linux - 使用 OpenSSL 加密时的不同结果

java - 如何确定 Eclipse JDT 中方法或字段的修饰符?

java - 微服务架构、认证等服务