📄 ecdsasigner.java
字号:
// Decompiled by Jad v1.5.7g. Copyright 2000 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/SiliconValley/Bridge/8617/jad.html
// Decompiler options: packimports(3) fieldsfirst ansi
// Source File Name: ECDSASigner.java
package jit.crypto.signers;
import jit.asn1.*;
import jit.crypto.CipherParameters;
import jit.crypto.DSA;
import jit.crypto.digests.SHA1Digest;
import jit.crypto.params.*;
import jit.math.BigInteger;
import jit.math.ec.*;
import jit.security.SecureRandom;
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;
do
{
do
{
k = new BigInteger(n.bitLength(), random);
k = k.mod(n);
} while(k.equals(ECConstants.ZERO));
ECPoint p = key.getParameters().getG().multiply(k);
BigInteger x = p.getX().toBigInteger();
r = x.mod(n);
} while(r.equals(ECConstants.ZERO));
BigInteger d = ((ECPrivateKeyParameters)key).getD();
s = k.modInverse(n).multiply(e.add(d.multiply(r))).mod(n);
} while(s.equals(ECConstants.ZERO));
BigInteger res[] = new BigInteger[2];
res[0] = r;
res[1] = s;
return res;
}
public DERObject signatureWithSHA(byte message[])
{
SHA1Digest sha = new SHA1Digest();
byte digestedData[] = new byte[sha.getDigestSize()];
sha.update(message, 0, message.length);
sha.doFinal(digestedData, 0);
BigInteger signedData[] = generateSignature(digestedData);
ASN1EncodableVector v = new ASN1EncodableVector();
v.add(new DERInteger(signedData[0]));
v.add(new DERInteger(signedData[1]));
return new DERSequence(v);
}
public boolean verifySignature(byte message[], BigInteger r, BigInteger s)
{
BigInteger e = new BigInteger(1, message);
BigInteger n = key.getParameters().getN();
if(r.compareTo(ECConstants.ONE) < 0 || r.compareTo(n) >= 0)
return false;
if(s.compareTo(ECConstants.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);
}
}
public boolean verifySignature(byte message[], DERObject obj)
{
if(!(obj instanceof DERSequence))
{
throw new IllegalArgumentException("unknown object in creat object");
} else
{
DERSequence seq = (DERSequence)obj;
DERInteger derR = (DERInteger)seq.getObjectAt(0);
BigInteger r = derR.getValue();
DERInteger derS = (DERInteger)seq.getObjectAt(1);
BigInteger s = derS.getValue();
return verifySignature(message, r, s);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -