示例#1
0
        public bool Verify(byte[] signature, byte[] data, uint160 nonce)
        {
            byte[]       output    = new byte[256];
            var          msg       = Utils.Combine(nonce.ToBytes(), data);
            Sha512Digest sha512    = new Sha512Digest();
            var          generator = new Mgf1BytesGenerator(sha512);

            generator.Init(new MgfParameters(msg));
            generator.GenerateBytes(output, 0, output.Length);
            var input = new BigInteger(1, output);

            if (input.CompareTo(_Key.Modulus) >= 0)
            {
                return(false);
            }
            if (signature.Length > 256)
            {
                return(false);
            }
            var signatureInt = new BigInteger(1, signature);

            if (signatureInt.CompareTo(_Key.Modulus) >= 0)
            {
                return(false);
            }
            var engine = new RsaBlindedEngine();

            engine.Init(false, _Key);
            return(input.Equals(engine.ProcessBlock(signatureInt)));
        }
示例#2
0
        /// <summary>
        /// MGF1 Mask Generation Function based on the SHA-256 hash function
        /// </summary>
        /// <param name="data">Input to process</param>
        /// <param name="keySize">The size of the RSA key in bits</param>
        /// <returns>Hashed result as a 256 Bytes array (2048 Bits)</returns>
        internal static byte[] MGF1_SHA256(byte[] data, int keySize)
        {
            byte[]       output    = new byte[GetByteLength(keySize)];
            Sha256Digest sha256    = new Sha256Digest();
            var          generator = new Mgf1BytesGenerator(sha256);

            generator.Init(new MgfParameters(data));
            generator.GenerateBytes(output, 0, output.Length);
            return(output);
        }
示例#3
0
        public override BigInteger CalculateSessionKey()
        {
            if (S == null)
            {
                throw new CryptoException("Impossible to compute Key: some data are missing from the previous operations (S)");
            }

            byte[]             output    = new byte[40];
            Mgf1BytesGenerator generator = new Mgf1BytesGenerator(digest);

            generator.Init(new MgfParameters(S.ToByteArrayUnsigned()));
            generator.GenerateBytes(output, 0, output.Length);
            Key = new BigInteger(1, output);
            return(Key);
        }
示例#4
0
        public byte[] XOR(byte[] data)
        {
            byte[]       keyBytes  = ToBytes();
            Sha512Digest sha512    = new Sha512Digest();
            var          generator = new Mgf1BytesGenerator(sha512);

            generator.Init(new MgfParameters(keyBytes));
            var keyHash = new byte[data.Length];

            generator.GenerateBytes(keyHash, 0, keyHash.Length);
            var encrypted = new byte[data.Length];

            for (int i = 0; i < encrypted.Length; i++)
            {
                encrypted[i] = (byte)(data[i] ^ keyHash[i]);
            }
            return(encrypted);
        }
示例#5
0
 public byte[] Sign(byte[] data, out uint160 nonce)
 {
     while (true)
     {
         byte[] output = new byte[256];
         nonce = new uint160(RandomUtils.GetBytes(20));
         Sha512Digest sha512    = new Sha512Digest();
         var          msg       = Utils.Combine(nonce.ToBytes(), data);
         var          generator = new Mgf1BytesGenerator(sha512);
         generator.Init(new MgfParameters(msg));
         generator.GenerateBytes(output, 0, output.Length);
         var input = new BigInteger(1, output);
         if (input.CompareTo(_Key.Modulus) >= 0)
         {
             continue;
         }
         var engine = new RsaCoreEngine();
         engine.Init(true, _Key);
         return(engine.ConvertOutput(engine.ProcessBlock(input)));
     }
 }