1

Javaで岡本内山暗号を実装しています。アルゴリズムはこちら

公開鍵の場合、パラメータhの値は次のように計算されます。

h = g^n mod n

どこ、

gは素数pの原始根(340 ビット)

n = p^2 * q (1024bits)

gh、およびnにBigInteger 型を使用しました。コードを実行すると、終了しません。これがコードです。hの計算方法を教えてください。

import java.math.BigInteger;
import java.util.Random;

public class KeyPairGeneration {

    PrimeGenerator PrimeGeneratorObject = new PrimeGenerator();
    BigInteger PrivateFields[] = new BigInteger[2];
    BigInteger PublicFields[] = new BigInteger[4];
    BigInteger ONE = new BigInteger("1");
    BigInteger DECREMENT = new BigInteger("-1");

    /**
     * Generate Private Key with two large primes
     */
    public BigInteger[] PrivateKeyGenerator() {
        PrivateFields[0] = PrimeGeneratorObject.RandomPrime();      // p
        PrivateFields[1] = PrimeGeneratorObject.RandomPrime();      // q

        if(PrivateFields[0] != PrivateFields[1])
            return PrivateFields;
        else
            return PrivateKeyGenerator();
    }

    /**
     * Generate Public Key from Private Key
     */
    public BigInteger[] PublicKeyGenerator() {

        PublicFields[0] = PrivateFields[0].multiply(PrivateFields[0]).multiply(PrivateFields[1]);   // n = p*p*q

        BigInteger g = new BigInteger("1");
        Random randomGenerator = new Random();
        for (int idx = 1; idx <= PrivateFields[0].intValue(); ++idx){
          int randomInt = randomGenerator.nextInt(100);
          if (primitiveRoot(randomInt, PrivateFields[0].intValue())) {
              BigInteger primitiveRoot = new BigInteger(String.valueOf(randomInt));

              PublicFields[1] = g.multiply(primitiveRoot);                                          // g = primitive root of P
              break;
          }
        }

        int randomizationValue = randomGenerator.nextInt(100);
        PublicFields[2] = BigInteger.valueOf(randomizationValue);                                   // r < n

        PublicFields[3] = PublicFields[1].modPow(PublicFields[0],PublicFields[0]);                  // h = g^n mod n

        return PublicFields;
    }

     public static boolean primitiveRoot(int a, int p) {
            int val = a, i;
            // Calculate each modular exponent a^2, a^3... mod p.
            for (i=2; i<p; i++) {
                val = val*a%p;
                if (val == 1)
                    break;
            }
            // If the exponent is p-1, it's a primitive root!
                return (i == p-1);
        }

}
4

1 に答える 1

1

pは int に収まらないため、PrivateFields[0].intValue()間違っているに違いありません。あなたのprimitiveRootアルゴリズムは、 ではBigIntegerなく を取る必要がありintます。

于 2015-01-04T13:26:17.450 に答える