public static bool VerifySignature(BigInteger[] publicKey, byte[] hash, BigInteger r, BigInteger s) { if (r >= Secp256k1.q || r.IsZero || s >= Secp256k1.q || s.IsZero) { return(false); } var z = Bytes32.ConvetToBigInteger(hash);; var w = s.ModInverse(Secp256k1.q); var u1 = (z * w) % Secp256k1.q; var u2 = (r * w) % Secp256k1.q; bool isZero; var pt = Calculate.pointPlus(Calculate.getPublicByPrivate(u1), Calculate.getMulValue(u2, publicKey), out isZero);// (publicKey.Multiply(u2)); if (pt == null) { return(false); } else { var pmod = pt[0] % Secp256k1.q; return(pmod == r); } }
public static BigInteger[] GenerateSignature(BigInteger privateKey, byte[] hash) { BigInteger?k = null; for (int i = 0; i < 100; i++) { byte[] kBytes = new byte[33]; rngCsp.GetBytes(kBytes); kBytes[32] = 0; k = new BigInteger(kBytes); var z = Bytes32.ConvetToBigInteger(hash); if (k.Value.IsZero || k >= Secp256k1.q) { continue; } var r = Calculate.getPublicByPrivate(k.Value)[0] % Secp256k1.q; if (r.IsZero) { continue; } var ss = (z + r * privateKey); var s = (ss * (k.Value.ModInverse(Secp256k1.q))) % Secp256k1.q; if (s.IsZero) { continue; } return(new BigInteger[] { r, s }); } throw new Exception("Unable to generate signature"); }
public static void SecretFileF() { while (true) { Console.WriteLine($"输入助记词!"); SHA256 sha256 = new SHA256Managed(); byte[] hash = sha256.ComputeHash(Encoding.UTF8.GetBytes(Console.ReadLine())); // var privateKey = HexToBigInteger.inputHex("e8d96a53e9c597e5a1e2ceaddd0b5ebe75588b26e71846b46a9b5f3666409355"); //var inputSting = "e8d96a53e9c597e5a1e2ceaddd0b5ebe75588b26e71846b46a9b5f3666409355"; //var inputSting = ; var privateKey = Bytes32.ConvetToBigInteger(hash); privateKey = privateKey % Secp256k1.q; var privateByte = hash; { var resultAdd = Calculate.BiteSplitJoint(new byte[] { 0x80 }, privateByte); resultAdd = Calculate.BiteSplitJoint(resultAdd, new byte[] { 0x01 }); byte[] chechHash = Calculate.GetCheckSum(resultAdd); resultAdd = Calculate.BiteSplitJoint(resultAdd, chechHash); var privateKey1 = Calculate.Encode(resultAdd); Console.WriteLine($"您压缩后的私钥为{privateKey1}"); } { var resultAdd = Calculate.BiteSplitJoint(new byte[] { 0x80 }, privateByte); byte[] chechHash = Calculate.GetCheckSum(resultAdd); resultAdd = Calculate.BiteSplitJoint(resultAdd, chechHash); var privateKey1 = Calculate.Encode(resultAdd); Console.WriteLine($"您压缩前的私钥为{privateKey1}"); } var publicKey = Calculate.getPublicByPrivate(privateKey); if (publicKey != null) { var walletOfcompressed = PublicKeyF.GetAddressOfcompressed(publicKey); Console.WriteLine($"压缩钱包地址为:{walletOfcompressed}"); var walletOfUncompressed = PublicKeyF.GetAddressOfUncompressed(publicKey); Console.WriteLine($"非压缩钱包地址为:{walletOfUncompressed}"); } else { Console.WriteLine($"您输入了零元!"); } Console.WriteLine("E/Exit,退出当前"); if (Console.ReadLine().ToUpper() == "E") { break; } } //Console.WriteLine($"您的非私钥为80{HexToBigInteger.bigIntergetToHex(publicKey[0])}01"); //var publicKeyName = getPublicKeyName(publicKey); //Console.WriteLine($"您的公钥16进制为{publicKeyName}"); //if (publicKey != null) // Console.WriteLine($"您的公钥10进制为:{publicKey[0]},{publicKey[1]}"); //Random rm = new Random(DateTime.Now.GetHashCode()); //for (var i = 1; i <= 256 * 256; i++) //{ // var M = getPublicByPrivate(new BigInteger(i)); //} // throw new NotImplementedException(); }
public static string verify_message(string signature, string message, int addrtype) { byte[] sig; //try { sig = Convert.FromBase64String(signature); } //catch (err) //{ // return false; //} if (sig.Length != 65) { return("Error e"); } // extract r,s from signature var r = Bytes32.ConvetToBigInteger(sig.Skip(1).Take(32).ToArray()); var s = Bytes32.ConvetToBigInteger(sig.Skip(33).Take(32).ToArray()); // var s = BigInteger.fromByteArrayUnsigned(sig.slice(33, 33 + 32)); // get recid // var compressed = false; var nV = Convert.ToInt32(sig[0]); if (nV < 27 || nV >= 35) { return("Error e"); } if (nV >= 31) { // compressed = true; nV -= 4; } var recid = new BigInteger(nV - 27); { //var z = Bytes32.ConvetToBigInteger(hash); ; //var w = s.ModInverse(Secp256k1.q); //var u1 = (z * w) % Secp256k1.q; //var u2 = (r * w) % Secp256k1.q; //bool isZero; //var pt = Calculate.pointPlus(Calculate.getPublicByPrivate(u1), Calculate.getMulValue(u2, publicKey), out isZero);// (publicKey.Multiply(u2)); //if (pt == null) //{ // return false; //} //else //{ // var pmod = pt[0] % Secp256k1.q; // return pmod == r; //} } //var ecparams = getSECCurveByName("secp256k1"); //var curve = ecparams.getCurve(); //var a = curve.getA().toBigInteger(); //var b = curve.getB().toBigInteger(); //var p = curve.getQ(); //var G = ecparams.getG(); //var order = ecparams.getN(); //var x = r.add(order.multiply(recid.divide(BigInteger.valueOf(2)))); var x = recid / 2 * Secp256k1.q + r; //Calculate.getMulValue(,recid / 2); // var alpha = x.multiply(x).multiply(x).add(a.multiply(x)).add(b).mod(p); var alpha = (x * x * x + Secp256k1.a * x + Secp256k1.b) % Secp256k1.p; //var beta = alpha.modPow(p.add(BigInteger.ONE).divide(BigInteger.valueOf(4)), p); var beta = BigInteger.ModPow(alpha, (Secp256k1.p + 1) / 4, Secp256k1.p);//Calculate.Pow((Secp256k1.p + 1) / 4, alpha); var y = (beta - recid).IsEven ? beta : (Secp256k1.p - beta); //var y = beta.subtract(recid).isEven() ? beta : p.subtract(beta); // var R = new ECPointFp(curve, curve.fromBigInteger(x), curve.fromBigInteger(y)); // var e = BigInteger.fromByteArrayUnsigned(msg_digest(message)); var e = Bytes32.ConvetToBigInteger(msg_digest(message)); // var minus_e = BigInteger.Negate(e)+ % Secp256k1.q; var minus_e = ((Secp256k1.q - e) % Secp256k1.q + Secp256k1.q) % Secp256k1.q; var inv_r = ECCMain.Inverse.ex_gcd(r, Secp256k1.q);////BigInteger.mo r.modInverse(order); //var Q = (R.multiply(s).add(G.multiply(minus_e))).multiply(inv_r); bool isZero; var Q__ = Calculate.pointPlus(Calculate.getMulValue(s, new BigInteger[] { x, y }), Calculate.getPublicByPrivate(minus_e), out isZero); if (isZero) { return("Error e"); } else { var Q = Calculate.getMulValue(inv_r, Q__); var public_key = PublicKeyF.GetAddressOfcompressed(Q); if (addrtype == 0) { return(PublicKeyF.GetAddressOfUncompressed(Q)); } else if (addrtype == 1) { return(PublicKeyF.GetAddressOfcompressed(Q)); } else { return("Error e"); } } }