Code example for BigInteger

Methods: bitLength, mod, modInverse

0
     */ 
    public BigInteger revealPrivKey(BigInteger n, BigInteger r, BigInteger s1, BigInteger s2, byte[] message1, byte[] message2) {
        BigInteger z1 = calculateE(n, message1);
        BigInteger z2 = calculateE(n, message2);
         
        BigInteger k = z1.subtract(z2).multiply(
                                            s1.subtract(s2).modInverse(n)
                ).mod(n);
         
        BigInteger dA = s1.multiply(k).subtract(z1).multiply(r.modInverse(n)).mod(n);
        return dA;
    } 
     
    public BigInteger[] generateSignature(
            byte[] message, BigInteger k) {
        BigInteger n = key.getParameters().getN();
        BigInteger e = calculateE(n, message);
        BigInteger r = null;
        BigInteger s = null;
 
        // 5.3.2 
        // generate s 
 
        if (k.equals(ZERO) || k.compareTo(n) >= 0) {
            return null; 
        } 
 
        ECPoint p = key.getParameters().getG().multiply(k);
 
        // 5.3.3 
        BigInteger x = p.getX().toBigInteger();
 
        r = x.mod(n);
 
        if (r.equals(ZERO)) {
            return null; 
        } 
 
        BigInteger d = ((ECPrivateKeyParameters) key).getD();
 
        s = k.modInverse(n).multiply(e.add(d.multiply(r))).mod(n);
 
        if (s.equals(ZERO)) {
            return null; 
        } 
 
        BigInteger[] res = new BigInteger[2];
 
        res[0] = r;
        res[1] = s;
 
        return res;
    } 
 
    private BigInteger calculateE(BigInteger n, byte[] message) {
        if (n.bitLength() > message.length * 8) {
            return new BigInteger(1, message);
        } else { 
            int messageBitLength = message.length * 8;
            BigInteger trunc = new BigInteger(1, message);
 
            if (messageBitLength - n.bitLength() > 0) {
                trunc = trunc.shiftRight(messageBitLength - n.bitLength());
            } 
 
            return trunc;
        } 
    }