双重添加总是+标量盲

时间:2016-01-25 08:49:37

标签: java cryptography ecdsa

我在投影坐标(x,y,z)中使用double add always +标量盲法进行pointMultiplication。

poinMultiplication Class

public pointMultiplication Scalar(BigInteger kin, pointMultiplication point)
{
    //Pilih sebuahh bilangan acak r dengan panjang 20 bit.
    SecureRandom sr = new SecureRandom();
    BigInteger r = new BigInteger (20, sr);
    // Hitung k = kin+r*N (N adalah orde G);
    BigInteger k = kin.add(r.multiply(ECDSA.key.N));
    // Berikut dibawah ini menghitung k*G=(kin+r*N)*G=kin*G
    //Mengubah BigInteger K menjadi basis 2
    String K = k.toString(2);
    pointMultiplication[] q = new pointMultiplication[2];
    //Inisialisasi q
    q[0]= new pointMultiplication(zero,zero,null);
    q[1]= new pointMultiplication(zero,zero,null);
    //Jika nilai substring dari K adalah 1 maka q[0] adalah point
    if (K.substring(0,1).equals("1")) {
            q[0] = point;
        }
    //Metode double and add always
    //Untuk integer i mulai dari 1 sampai dengan panjang K, maka double point untuk q[0] dan addpoint untuk q[1]
    for (int i=1; i < K.length();i++) {
        q[0] = q[0].DoublePoint();
        q[1] = q[0].AddPoint(point);
        int di = Integer.parseInt(K.substring(i, i + 1));
        q[0]= q[di];
}
    return q[0];
}

ECDSA课程

public BigInteger[] Sign(byte[] m, BigInteger privatekey) 
        throws NoSuchAlgorithmException {
    Long startTime = System.currentTimeMillis();
    BigInteger K = SelectK();
    BigInteger dm = SHA1(m);
    // Hitung kunci publik dari titik kurva Q
    pointMultiplication q = new pointMultiplication();
    q = PM.Scalar(K, q);

    BigInteger R;
    R = q.getX().mod(N);

    //Hitung S=k^-1(dm + R*privateKey) mod N
    BigInteger Kin = K.modInverse(N);
    BigInteger mm = dm.add(privatekey.multiply(R));
    BigInteger S = (Kin.multiply(mm)).mod(N);
    // Jika R atau S sama dengan 0 , tandatangan ulang pesan
    if (R.equals(zero)|| S.equals(zero)) {

        K = SelectK();
        q = PM.Scalar(K, q);
        R = q.getX().mod(N);
        Kin = K.modInverse(N);
        mm = dm.add(privatekey.multiply(R));
        S = (Kin.multiply(mm)).mod(N);
    }

    BigInteger[] Signature = { R, S };
    Long endTime = System.currentTimeMillis();
    Long totalTime = endTime - startTime;
    System.out.println("Waktu untuk tandatangan ECDSA:"+totalTime*1000 + "us");
    return Signature;  

结果 Result

问题:为什么R值为0?

0 个答案:

没有答案