Java Android上的ECC内存溢出

Java Android上的ECC内存溢出,java,android,Java,Android,我正在尝试在Android上使用一些Eligistic cureve加密代码。(). 它在计算机上运行良好,但在安卓系统上我得到了一个StackOverflower错误 问题发生在哪里取决于Android设备。在一个expmod()上,它位于scalarmult()中,在另一个expmod()上。调试器显示它工作了一段时间,然后突然死亡。有什么想法吗?记忆问题 static BigInteger[] scalarmult(BigInteger[] P, BigInteger e) {

我正在尝试在Android上使用一些Eligistic cureve加密代码。(). 它在计算机上运行良好,但在安卓系统上我得到了一个StackOverflower错误

问题发生在哪里取决于Android设备。在一个expmod()上,它位于scalarmult()中,在另一个expmod()上。调试器显示它工作了一段时间,然后突然死亡。有什么想法吗?记忆问题

    static BigInteger[] scalarmult(BigInteger[] P, BigInteger e) {
    //System.out.println("scalarmult open with e = " + e);
    if (e.equals(BigInteger.ZERO)) {
        System.out.println("scalarmult close with Q = 0,1");
        return new BigInteger[]{BigInteger.ZERO, BigInteger.ONE};
    }
    BigInteger[] Q = scalarmult(P, e.divide(BigInteger.valueOf(2)));
    //System.out.println("scalarmult asQ = " + Q[0] + "," + Q[1]);
    Q = edwards(Q, Q);
    //System.out.println("scalarmult aeQ = " + Q[0] + "," + Q[1] + " e="+e+" testbit="+(e.testBit(0)?1:0));
    if (e.testBit(0)) Q = edwards(Q, P);
    //System.out.println("scalarmult close with Q = " + Q[0] + "," + Q[1]);
    return Q;
}


static BigInteger expmod(BigInteger b, BigInteger e, BigInteger m) {
    //System.out.println("expmod open with b=" + b + " e=" + e + " m=" + m);
    if (e.equals(BigInteger.ZERO)) {
        //System.out.println("expmod close with 1z");
        return BigInteger.ONE;
    }
    BigInteger t = expmod(b, e.divide(BigInteger.valueOf(2)), m).pow(2).mod(m);
    //System.out.println("expmod 1/2 t="+t+" e="+e+" testbit="+(e.testBit(0)?1:0));
    if (e.testBit(0)) {
        t = t.multiply(b).mod(m);
    }
    //System.out.println("expmod close with " + t);
    return t;
}
堆栈跟踪(最后一部分的剪切,因为它只是自己重复):

10-06 19:00:17.855:E/AndroidRuntime(749):致命异常:主
10-06 19:00:17.855:E/AndroidRuntime(749):java.lang.StackOverflower错误
10-06 19:00:17.855:E/AndroidRuntime(749):位于java.lang.ref.FinalizerReference。(FinalizerReference.java:34)
10-06 19:00:17.855:E/AndroidRuntime(749):在java.lang.ref.FinalizerReference.add(FinalizerReference.java:48)
10-06 19:00:17.855:E/AndroidRuntime(749):在java.math.BigInt.(BigInt.java:24)
10-06 19:00:17.855:E/AndroidRuntime(749):在java.math.biginger.divide(biginger.java:903)中
10-06 19:00:17.855:E/AndroidRuntime(749):位于com.test.crypto.Curve25519.expmod(Curve25519.java:45)
10-06 19:00:17.855:E/AndroidRuntime(749):位于com.test.crypto.Curve25519.expmod(Curve25519.java:45)
10-06 19:00:17.855:E/AndroidRuntime(749):位于com.test.crypto.Curve25519.expmod(Curve25519.java:45)
10-06 19:00:17.855:E/AndroidRuntime(749):位于com.test.crypto.Curve25519.expmod(Curve25519.java:45)
10-06 19:00:17.855:E/AndroidRuntime(749):位于com.test.crypto.Curve25519.expmod(Curve25519.java:45)
10-06 19:00:17.855:E/AndroidRuntime(749):位于com.test.crypto.Curve25519.expmod(Curve25519.java:45)

请从logcat中提供Stacktrace。递归调用expmod方法时,只有当
e等于零时才会跳出。看起来不是这样,所以您得到了StackOverflow,但它不应该在计算机上工作??这取决于环境,我想您的计算机上使用了带有JVM的标准Java。当您在Android设备上运行这些代码时,您是在Dalvik VM上运行代码,该VM具有不同的配置-->不同的堆栈大小限制(可能比您计算机上的小)。由于这些方法并不复杂,您可以将它们转换为使用循环,这将解决您的问题
10-06 19:00:17.855: E/AndroidRuntime(749): FATAL EXCEPTION: main
10-06 19:00:17.855: E/AndroidRuntime(749): java.lang.StackOverflowError
10-06 19:00:17.855: E/AndroidRuntime(749):  at java.lang.ref.FinalizerReference.<init>(FinalizerReference.java:34)
10-06 19:00:17.855: E/AndroidRuntime(749):  at java.lang.ref.FinalizerReference.add(FinalizerReference.java:48)
10-06 19:00:17.855: E/AndroidRuntime(749):  at java.math.BigInt.<init>(BigInt.java:24)
10-06 19:00:17.855: E/AndroidRuntime(749):  at java.math.BigInteger.divide(BigInteger.java:903)
10-06 19:00:17.855: E/AndroidRuntime(749):  at com.test.crypto.Curve25519.expmod(Curve25519.java:45)
10-06 19:00:17.855: E/AndroidRuntime(749):  at com.test.crypto.Curve25519.expmod(Curve25519.java:45)
10-06 19:00:17.855: E/AndroidRuntime(749):  at com.test.crypto.Curve25519.expmod(Curve25519.java:45)
10-06 19:00:17.855: E/AndroidRuntime(749):  at com.test.crypto.Curve25519.expmod(Curve25519.java:45)
10-06 19:00:17.855: E/AndroidRuntime(749):  at com.test.crypto.Curve25519.expmod(Curve25519.java:45)
10-06 19:00:17.855: E/AndroidRuntime(749):  at com.test.crypto.Curve25519.expmod(Curve25519.java:45)