【问题标题】:Android BigInteger ArithmeticExceptionAndroid BigInteger 算术异常
【发布时间】:2014-12-16 19:48:22
【问题描述】:

我正在尝试在 Android 应用程序中实现 RSA 算法。我正在使用java.math.BigInteger.modPow() 函数进行加密/解密,它适用于我的计算机(Windows 和 Xubuntu)和我的 Raspberry Pi(也是 Debian)。 当在我的手机 (Android 4.4.4) 上执行相同的代码时,在第二次调用 modPow() 时会引发以下异常:

java.jang.ArithmeticException: error:0306B06B:bignum routines:BN_div:not initialized
    at java.math.NativeBN.BN_mod_exp(NativeMethod)
    at java.math.BigInt.modExp(BigInt.java:327)
    at java.math.BigInteger.modPow(BigInteger.java:997)
    at "where I call java.math.BigInteger.modPow()"

我检查了指数和模数:两者都是正数,因此文档并没有真正的帮助。减小键的大小(指数和模数)也没有改变任何东西。不幸的是,我找不到本机函数的源代码,并且不知道会发生什么。

你知道为什么会抛出这个异常或者错误代码应该是什么意思吗?

【问题讨论】:

  • 出于好奇,尝试使用旧版本的 Android(例如 4.2.2) - 4.4 中有很多变化,也有不少错误。
  • 这看起来像是来自底层 openssl 本机代码的错误,这表明这是一个 Android 错误。
  • @qwerty:我知道,但在底层,Java 的 BigIntegers 的 Android 实现使用了 openssl 库。这不是你可以控制的。
  • 我同意,这肯定是某种错误,您永远不能仅从 Java 代码生成BN_div:not initialized。 BN 函数当然是 OpenSSL 的一部分。
  • 忽略这是否是错误,如果没有重现问题的示例代码,我们将无法帮助诊断您的问题。请将其添加到您的问题中。

标签: java android rsa biginteger arithmeticexception


【解决方案1】:

因为它告诉你没有初始化,所以 BigInteger 的创建一定是失败了。

截至libcrypto

BIGNUM 库通常存在于 OpenSSL 附带的 libcrypto 中。它的 API 在 openssl/bn.h 中定义。该库导出 BIGNUM 类型。 BIGNUM 对象总是需要在使用前进行初始化,即使它们是静态声明的。

因此请检查您是否可以从代码中初始化它或尝试较低的 api 版本,因为我对此并不深入。

还要检查捆绑的库是否与您的 32/64 位平台架构相对应。

另一个猜测:如果 SSL 错误队列不为空,Android 4.4.4 在创建 BigIntegers 时可能存在 [bug] (code.google.com/p/android/issues/detail?id=77262),也许就是这样你碰到了。

【讨论】:

    猜你喜欢
    • 2021-03-29
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-22
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多