我在投影坐标(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;
问题:为什么R值为0?