Android系统。找不到KeyFactory RSA实现

时间:2012-04-19 14:50:05

标签: android

我有一个扩展Application的类。在onCreate()方法中,我启动一些线程,调用:

KeyFactory.getInstance("RSA")

通常它完美无缺,但有时(非常罕见)我得到了这样的例外:

W/System.err(24537): java.security.NoSuchAlgorithmException: KeyFactory RSA implementation not found
W/System.err(24537):    at org.apache.harmony.security.fortress.Engine.notFound(Engine.java:177)
W/System.err(24537):    at org.apache.harmony.security.fortress.Engine.getInstance(Engine.java:151)
W/System.err(24537):    at java.security.KeyFactory.getInstance(KeyFactory.java:81)

它看起来像一场比赛...我认为安全系统在我的线程呼叫“RSA”时没有初始化。

这是一个已知问题吗?任何人都可以给我一些提示吗?

我在4.0.3设备上遇到此问题(不了解其他版本)。

更多详情:

我尝试过这样的代码:

Provider providers[] = Security.getProviders();

try {
    k1 = KeyFactory.getInstance("RSA");
}
catch(Exception e) {
    e1 = e;
}

try {
    k2 = KeyFactory.getInstance("RSA", "BC");
}
catch(Exception e) {
    e2 = e;
}

try {
    k3 = KeyFactory.getInstance("RSA");
}
catch(Exception e) {
    e3 = e;
}

if(k1 == null || k2 == null || k3 == null) {
    if(e1 != null)
        e1.printStackTrace();

    if(e2 != null)
        e2.printStackTrace();

    if(e3 != null)
        e3.printStackTrace();
}

for(Provider provider : providers) {
    System.out.println(provider.getName());
}

这就是我不时得到的:

k1 is null
k2 is <key>
k3 is null


e1.printStackTrace();

    04-20 22:09:33.322: W/System.err(17249): java.security.NoSuchAlgorithmException: KeyFactory RSA implementation not found
    04-20 22:09:33.322: W/System.err(17249):    at org.apache.harmony.security.fortress.Engine.notFound(Engine.java:177)
    04-20 22:09:33.322: W/System.err(17249):    at org.apache.harmony.security.fortress.Engine.getInstance(Engine.java:151)
    04-20 22:09:33.322: W/System.err(17249):    at java.security.KeyFactory.getInstance(KeyFactory.java:81)
    ...

e2 
    null

e3.printStackTrace();
    04-20 22:10:08.512: W/System.err(17249): java.security.NoSuchAlgorithmException: KeyFactory RSA implementation not found
    04-20 22:10:08.532: W/System.err(17249):    at org.apache.harmony.security.fortress.Engine.notFound(Engine.java:177)
    04-20 22:10:08.532: W/System.err(17249):    at org.apache.harmony.security.fortress.Engine.getInstance(Engine.java:151)
    04-20 22:10:08.542: W/System.err(17249):    at java.security.KeyFactory.getInstance(KeyFactory.java:81)
    ...


providers

    AndroidOpenSSL
    DRLCertFactory
    BC
    Crypto
    HarmonyJSSE
    MyProvider

虽然大多数时候我得到所有k1,k2,k3初始化......

听起来像getInstance(“RSA”,“BC”)是一个解决方案(虽然我不明白为什么),但问题是在某些Android设备上可能会错过BouncyCastle(据我所知),所以我不应该在这个电话中指定“BC”......所以,我有一个问题。

1 个答案:

答案 0 :(得分:1)

这是什么设备?这不是一场竞赛,Harmony提供商根本就没有RSA实施。但是BouncyCastle提供商确实如此,所以应该可以从那里获得它。请尝试明确指定提供程序名称:

KeyFactory kf = KeyFactory.getInstance("RSA", "BC");