using System; using System.Numerics; namespace Common.Helper { public static class BigIntegerHelper { public static BigInteger RandBigInteger(int byteNum) { var bigIntegerBytes = new byte[byteNum]; var random = new Random(); random.NextBytes(bigIntegerBytes); var bigInteger = new BigInteger(bigIntegerBytes); return bigInteger; } public static BigInteger RandUnsignedBigInteger(int byteNum) { var bigIntegerBytes = new byte[byteNum]; var random = new Random(); random.NextBytes(bigIntegerBytes); //bigIntegerBytes = "C6DFEDA1EAAC7417A191EE5EC6062CE9546614".HexToBytes().Reverse(); return bigIntegerBytes.ToUBigInteger(); } public static BigInteger ToBigInteger(this byte[] bytes) { return new BigInteger(bytes); } public static BigInteger ToUBigInteger(this byte[] bytes) { var dst = new byte[bytes.Length + 1]; Array.Copy(bytes, dst, bytes.Length); return new BigInteger(dst); } public static byte[] ToUBigIntegerArray(this BigInteger bigInteger) { var result = bigInteger.ToByteArray(); if (result[result.Length - 1] == 0 && (result.Length % 0x10) != 0) { Array.Resize(ref result, result.Length - 1); } return result; } public static byte[] ToUBigIntegerArray(this BigInteger bigInteger, int length) { var result = bigInteger.ToByteArray(); if (result[result.Length - 1] == 0 && (result.Length % 0x10) != 0) { Array.Resize(ref result, result.Length - 1); } if (length > result.Length) { Array.Resize(ref result, length); } return result; } /// /// 返回非负值 /// /// /// /// /// public static BigInteger UModPow(BigInteger value, BigInteger exponent, BigInteger modulus) { BigInteger result = BigInteger.ModPow(value, exponent, modulus); if (result < 0) { result += modulus; } return result; } } }