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))); }
/// <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); }
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); }
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); }
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))); } }