📄 ecdsasigner.java
字号:
// Decompiled by Jad v1.5.8e2. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://kpdus.tripod.com/jad.html
// Decompiler options: packimports(3) fieldsfirst ansi space
// Source File Name: ECDSASigner.java
package org.bouncycastle.crypto.signers;
import java.math.BigInteger;
import java.security.SecureRandom;
import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.DSA;
import org.bouncycastle.crypto.params.*;
import org.bouncycastle.math.ec.*;
public class ECDSASigner
implements ECConstants, DSA
{
ECKeyParameters key;
SecureRandom random;
public ECDSASigner()
{
}
public void init(boolean forSigning, CipherParameters param)
{
if (forSigning)
{
if (param instanceof ParametersWithRandom)
{
ParametersWithRandom rParam = (ParametersWithRandom)param;
random = rParam.getRandom();
key = (ECPrivateKeyParameters)rParam.getParameters();
} else
{
random = new SecureRandom();
key = (ECPrivateKeyParameters)param;
}
} else
{
key = (ECPublicKeyParameters)param;
}
}
public BigInteger[] generateSignature(byte message[])
{
BigInteger e = new BigInteger(1, message);
BigInteger n = key.getParameters().getN();
BigInteger r = null;
BigInteger s = null;
do
{
BigInteger k = null;
int nBitLength = n.bitLength();
do
{
do
k = new BigInteger(nBitLength, random);
while (k.equals(ZERO));
ECPoint p = key.getParameters().getG().multiply(k);
BigInteger x = p.getX().toBigInteger();
r = x.mod(n);
} while (r.equals(ZERO));
BigInteger d = ((ECPrivateKeyParameters)key).getD();
s = k.modInverse(n).multiply(e.add(d.multiply(r))).mod(n);
} while (s.equals(ZERO));
BigInteger res[] = new BigInteger[2];
res[0] = r;
res[1] = s;
return res;
}
public boolean verifySignature(byte message[], BigInteger r, BigInteger s)
{
BigInteger e = new BigInteger(1, message);
BigInteger n = key.getParameters().getN();
if (r.compareTo(ONE) < 0 || r.compareTo(n) >= 0)
return false;
if (s.compareTo(ONE) < 0 || s.compareTo(n) >= 0)
{
return false;
} else
{
BigInteger c = s.modInverse(n);
BigInteger u1 = e.multiply(c).mod(n);
BigInteger u2 = r.multiply(c).mod(n);
ECPoint G = key.getParameters().getG();
ECPoint Q = ((ECPublicKeyParameters)key).getQ();
ECPoint point = G.multiply(u1).add(Q.multiply(u2));
BigInteger v = point.getX().toBigInteger().mod(n);
return v.equals(r);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -