Android:CyanogenMod 7(Android 2.3)+ BouncyCastle加密库:IllegalAccessError

时间:2011-04-28 09:14:58

标签: android encryption bouncycastle android-sdk-2.3 cyanogenmod

使用bouncycastle库时出现了一个奇怪的错误:

ERROR/AndroidRuntime(1226): FATAL EXCEPTION: Thread-10
ERROR/AndroidRuntime(1226): java.lang.IllegalAccessError: tried to access class org.bouncycastle.crypto.engines.RSACoreEngine from class org.bouncycastle.crypto.engines.RSAEngine
ERROR/AndroidRuntime(1226):     at org.bouncycastle.crypto.engines.RSAEngine.init(Unknown Source)
ERROR/AndroidRuntime(1226):     at org.bouncycastle.crypto.encodings.PKCS1Encoding.init(PKCS1Encoding.java:90)

我已将bouncycastle jar文件( bcprov145.jar )添加到eclipse项目中。

生成此异常的代码是:

public int encrypt(byte[] source, int sourceLength, byte[] destination,
            int destinationLength) throws CryptoError
{                   
        int offset = 0;
        byte[] encrypted;

        org.bouncycastle.crypto.AsymmetricBlockCipher engine = 
            new org.bouncycastle.crypto.engines.RSAEngine();

        engine = new org.bouncycastle.crypto.encodings.PKCS1Encoding(engine);

        BigInteger mod = publicKey.getModulus();
        BigInteger exp = publicKey.getPublicExponent();

        org.bouncycastle.crypto.params.RSAKeyParameters keyParams = 
            new org.bouncycastle.crypto.params.RSAKeyParameters(false, mod, exp);

        //When running the following line, the sh*t hits the fan....
        engine.init(true, keyParams);

        try
        {
            encrypted = engine.processBlock(source, offset, source.length);
        }
        catch (org.bouncycastle.crypto.InvalidCipherTextException e)
        {
            throw new CryptoError(e);
        }

        int length = Math.min(encrypted.length, destinationLength);
        BufferTools.copyByteArray(encrypted, destination, length);
        return length;
}

有趣的是:它在未经修改的Android 2.2手机上完美运行,但我的手机上出现此错误,使用CyanogenMod 7.0.2.1(Android 2.3?)进行修改。改装手机和未修改手机都是HTC Desire。

该项目是针对Android 2.2库构建的。那是问题吗?如果是,我应该创建不同的构建项目来区分这些版本吗?那会非常不愉快......

我已经在这里检查了类似的问题:IllegalAccessError with Android and BouncyCastle但他们决定放弃bouncycastle libs,在我看来这不是一个选项。

有没有人有线索?

2 个答案:

答案 0 :(得分:2)

Bouncy Castle军团是Android固件的一部分,但不是SDK的一部分。您无法可靠地添加自己的JAR实现。通过javax.crypto API使用Castle,或者找到另一个可以使用的加密库。

答案 1 :(得分:1)

只需将RSACoreEngine重命名为RSACoreEngine2即可正常运行。 当然你需要Bouncy Castle的源代码。