java.security.InvalidKeyException:传递给RSA的未知密钥类型

时间:2016-11-27 14:23:48

标签: java android encryption cryptography sharedpreferences

我使用共享首选项来存储用户名和密码,以实现一次性用户身份验证。我正在加密并将数据存储在共享的pref文件中。我再次解密它们并在每次用户打开应用程序时验证值。它正常运行,直到应用程序在后台运行。

如果用户从后台关闭应用程序,我将再次获得要求输入用户凭据的登录屏幕。 以下是错误:

W/System.err: java.security.InvalidKeyException: unknown key type passed to RSA

W/System.err:     at com.android.org.bouncycastle.jcajce.provider.asymmetric.rsa.CipherSpi.engineInit(CipherSpi.java:275)

W/System.err:     at com.android.org.bouncycastle.jcajce.provider.asymmetric.rsa.CipherSpi.engineInit(CipherSpi.java:379)

W/System.err:     at javax.crypto.Cipher.init(Cipher.java:661)

W/System.err:     at javax.crypto.Cipher.init(Cipher.java:621)

以下是我的加密算法。我在将数据输入共享pref文件并加密数据然后提交数据之前调用genereteKey()方法。

    private final static String RSA = "RSA";
public static PublicKey uk;
public static PrivateKey rk;

public static void generateKey() throws Exception {
    KeyPairGenerator gen = KeyPairGenerator.getInstance(RSA);

    gen.initialize(512, new SecureRandom());
    KeyPair keyPair = gen.generateKeyPair();
    uk = keyPair.getPublic();
    rk = keyPair.getPrivate();
}

private static byte[] encrypt(String text, PublicKey pubRSA) throws Exception {
    Cipher cipher = Cipher.getInstance(RSA);
    cipher.init(Cipher.ENCRYPT_MODE, pubRSA);
    return cipher.doFinal(text.getBytes());
}

public final static String encrypt(String text) {
    try {
        return byte2hex(encrypt(text, uk));
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

public final static String decrypt(String data) {
    try {
        return new String(decrypt(hex2byte(data.getBytes())));
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

private static byte[] decrypt(byte[] src) throws Exception {
    Cipher cipher = Cipher.getInstance(RSA);
    cipher.init(Cipher.DECRYPT_MODE, rk);
    return cipher.doFinal(src);
}

public static String byte2hex(byte[] b) {
    String hs = "";
    String stmp = "";
    for (int n = 0; n < b.length; n++) {
        stmp = Integer.toHexString(b[n] & 0xFF);
        if (stmp.length() == 1) hs += ("0" + stmp);
        else
            hs += stmp;
    }
    return hs.toUpperCase();
}


public static byte[] hex2byte(byte[] b) {
    if ((b.length % 2) != 0) throw new IllegalArgumentException("hello");
    byte[] b2 = new byte[b.length / 2];
    for (int n = 0; n < b.length; n += 2) {
        String item = new String(b, n, 2);
        b2[n / 2] = (byte) Integer.parseInt(item, 16);
    }
    return b2;
}

0 个答案:

没有答案