使用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,在我看来这不是一个选项。
有没有人有线索?
答案 0 :(得分:2)
Bouncy Castle军团是Android固件的一部分,但不是SDK的一部分。您无法可靠地添加自己的JAR实现。通过javax.crypto
API使用Castle,或者找到另一个可以使用的加密库。
答案 1 :(得分:1)
只需将RSACoreEngine重命名为RSACoreEngine2即可正常运行。 当然你需要Bouncy Castle的源代码。