当前位置: 首页 > 面试题库 >

Android解密错误

苍意智
2023-03-14
问题内容

我正在尝试在我的Android应用程序中加密和解密字符串,但始终收到InvalidKeyException错误。

这是我的代码:

//生成密钥方法

public void generateKeys() {
    Calendar cal = Calendar.getInstance();
    Date now = cal.getTime();
    cal.add(Calendar.YEAR, 25);
    Date end = cal.getTime();

    KeyPairGenerator kpg = null;
    try {
        kpg = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (NoSuchProviderException e) {
        e.printStackTrace();
    }
    try {
        kpg.initialize(new KeyPairGeneratorSpec.Builder(context)
                .setAlias(KEY_ALIAS)
                .setStartDate(now)
                .setEndDate(end)
                .setSerialNumber(BigInteger.valueOf(1))
                .setSubject(new X500Principal("CN=" + KEY_ALIAS))
                .build());
    } catch (InvalidAlgorithmParameterException e) {
        e.printStackTrace();
    }

    KeyPair kp = kpg.generateKeyPair();

    KeyStore ks = null;
    try {
        ks = KeyStore.getInstance("AndroidKeyStore");
        ks.load(null);
        Enumeration<String> aliases = ks.aliases();
    } catch (KeyStoreException e) {
        e.printStackTrace();
    } catch (CertificateException e) {
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    KeyStore.Entry entry = null;
    try {
        entry = ks.getEntry(KEY_ALIAS, null);
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (UnrecoverableEntryException e) {
        e.printStackTrace();
    } catch (KeyStoreException e) {
        e.printStackTrace();
    }
    if (!(entry instanceof KeyStore.PrivateKeyEntry)) {
        Log.e(LOG_TAG, "Not an instance of PrivateKeyEntry.");
    }
    else{
        privKey = ((KeyStore.PrivateKeyEntry) entry).getPrivateKey();
        pubKey = ((KeyStore.PrivateKeyEntry) entry).getCertificate().getPublicKey();
    }

}

//加密方法

private String encryptString(String value){
    byte[] encodedBytes = null;
    try {
        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", "AndroidOpenSSL");
        cipher.init(Cipher.ENCRYPT_MODE,  pubKey);
        encodedBytes = cipher.doFinal(value.getBytes());
    } catch (Exception e) {
        e.printStackTrace();
    }

    return Base64.encodeToString(encodedBytes, Base64.DEFAULT);
}

//解密方法

private String decryptString(String value){
    byte[] decodedBytes = null;
    try {
        Cipher c = Cipher.getInstance("RSA/ECB/PKCS1Padding", "AndroidOpenSSL");
        c.init(Cipher.DECRYPT_MODE,  privKey);
        decodedBytes = c.doFinal(Base64.decode(value, Base64.DEFAULT));
    } catch (Exception e) {
        e.printStackTrace();
        Log.e("Error", "Error = " + e);
        return "SECURE_FAILURE";
    }

    return new String(decodedBytes);
}

//测试代码

    generateKeys();
    String encrypted = encryptString("Hello World");
    Log.e("Encrypt", "encrypted = " + encrypted);
    String decrypted = decryptString(encrypted);
    Log.e("Decrypt", "decrypted = " + decrypted);

看起来加密工作正常,因为它打印出如下内容:

加密= SbA2iWWKQbDL7NTA9xvtjD /
viYDdpx9fLRYTSZ8UQzdBy3QLqzkswBY21ErH7FPza3vZys4E4PZw
uxaGkRz0aC0FLqsYlbpcJernGm5 +
D5lRcBOaZmgkNY9pMf0YP75cBbcJdcmb1rDaH40nCRDnEoXv
rGESJRqT6p0NMzlZqdd9KO3tqfExwgservAWxPNtRDBbMgE4I / 09418jM5Ock5eayfOuv /
STwEy6 Ecd56UjFH63h + gP6ed2aMDhBVeExMxvdloY +
VnsAxS5Dkoc2GdaljtjRuPK48HQASoJK8EwAMNpz

但是,当我尝试解密时,出现以下错误:

java.security.InvalidKeyException:需要RSA私钥或公钥

我不知道为什么会收到此异常?有人可以帮忙吗?


问题答案:

尝试使用其他提供程序,如下所示:

Cipher.getInstance("RSA/ECB/PKCS1Padding", "AndroidKeyStoreBCWorkaround");


 类似资料:
  • 我正在尝试解密服务器上的加密字符串。但当我解密的时候,我发现了错误。我需要成功解密字符串。我们正在使用AES 256 cbc 当我使用aes/cbc/nopadding时,我能够解密,但是文本中附加了垃圾字符。 解密A:2:{S:5:“电子邮件”;S:24:“afroj.alam@broc.com”;S:8:“密码”;S:7:“test123”;} 实际字符串A:2:{S:5:“email”;S:

  • -IV是相同的,因为目前它是静态变量,用于测试目的。 -密码设置为AES/CBC/PKCS5Padding -键设置为AES 编辑 添加IV发生器方法

  • 我正在Android中进行AES加密和解密,我使用下面的Android代码片段发布请求。 申请职位 我成功地从上述请求中获得了Base64加密响应字符串,但当我尝试使用以下代码段解密响应字符串时,它会返回无法读取的字符串,如字符和方框。 解密 解密的输出 ��]ة*�]��O Z Q2_ 响应应为JSON格式,但实际输出如上所述。 请使用Base 64共享用于使用AES 256位安全密钥解密数据的

  • 问题内容: 我正在编写一个从控制台输入的程序- 一个zip文件的名称,一个将包含从第一个zip文件生成的(解密)加密文件的zip文件的名称以及一个包含公钥的文件。解密时出现异常: 无法弄清楚为什么会出现此异常? 公钥: 私钥: 该程序的代码如下。任何帮助都很好:) PS:更新了方法。仍然给出相同的错误。 问题答案: 约瑟夫是对的。 使用默认参数创建密码时,默认密码为“ RSA / ECB / PK

  • 我尝试获得一对密钥(公共和私有)来加密/解密文本。对于加密没有问题。对于解密来说,我从一天开始就犯了一个错误,我不明白为什么。 这是代码的相关部分:

  • 问题内容: 我有一个正在下载xml并将其解析为sql数据库的应用程序。我的问题是,一旦部署了应用程序,xml中的数据就很容易被抓取,其他人可能将我辛苦赚来的数据用于自己的邪恶目的/应用程序。基本上我需要使用php加密xml,然后使用android解密。我已经看过几个php类,它们可以很容易地加密,但是我不完全确定哪种加密方法与android兼容。 解决后编辑: 起初,我认为出于某种原因我不得不忽略