Android: CyanogenMod 7 (Android 2.3) + библиотеки шифрования BouncyCastle: IllegalAccessError - PullRequest
0 голосов
/ 28 апреля 2011

При использовании библиотек 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)

Я добавил файл jar bouncycastle ( 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.Это проблема?Если это так, я должен создавать разные build-проекты, чтобы различать эти версии?Это было бы очень неприятно ....

Я уже проверял подобную проблему здесь: IllegalAccessError с Android и BouncyCastle , но они решили отказаться от библиотек bouncycastle, которые в моем случаеэто не вариант.

У кого-нибудь есть подсказка?

Ответы [ 2 ]

2 голосов
/ 28 апреля 2011

Legion of the Bouncy Castle является частью прошивки Android, но не частью SDK. Вы не можете надежно добавить свою собственную реализацию JAR. Либо используйте Castle через javax.crypto API, либо найдите другую крипто-библиотеку, которую вы можете использовать.

1 голос
/ 21 февраля 2012

Просто переименуйте RSACoreEngine в RSACoreEngine2, и теперь это работает.Конечно, вам нужен исходный код Bouncy Castle.

...