private byte[] GenerateMask(byte[] seed, int outputLength) { if (outputLength > (Math.Pow(2, 32))) { throw new ArgumentException("Mask cannot exceed 2^32."); } else { var result = new List <byte>(); for (var i = 0; i <= outputLength / _rsaConfig.hLen; i++) { var data = new List <byte>(); data.AddRange(seed); data.AddRange(RSAHelper.I2OSP(i, 4, false)); result.AddRange(_rsaConfig.ComputeHash(data.ToArray())); } if (outputLength <= result.Count) { return(result.GetRange(0, outputLength).ToArray()); } else { throw new ArgumentException("mask length invalid."); } } }
public byte[] CrunchRSA(byte[] plainText, bool usePrivate) { if (usePrivate && (!_rsaConfig.Has_PRIVATE_Info)) { throw new CryptographicException("No private key"); } if ((usePrivate == false) && (!_rsaConfig.Has_PUBLIC_Info)) { throw new CryptographicException("No public key"); } BigInteger e; if (usePrivate) { e = _rsaConfig.D; } else { e = _rsaConfig.E; } var PT = RSAHelper.OS2IP(plainText, false); var M = BigInteger.ModPow(PT, e, _rsaConfig.N); return(M.Sign == -1 ? RSAHelper.I2OSP(M + _rsaConfig.N, _rsaConfig.OctetsInModulus, false) : RSAHelper.I2OSP(M, _rsaConfig.OctetsInModulus, false)); }
public byte[] PrivateDecryptFast(byte[] data) { if (!_rsaConfig.Has_PRIVATE_Info || !_rsaConfig.HasCRTInfo) { throw new CryptographicException("No private key"); } else { var c = RSAHelper.OS2IP(data, false); var m1 = BigInteger.ModPow(c, _rsaConfig.DP, _rsaConfig.P); var m2 = BigInteger.ModPow(c, _rsaConfig.DQ, _rsaConfig.Q); var h = ((m1 - m2) * _rsaConfig.InverseQ) % _rsaConfig.P; var m = (m2 + (_rsaConfig.Q * h)); return(m.Sign == -1 ? RSAHelper.I2OSP(m + _rsaConfig.N, _rsaConfig.OctetsInModulus, false) : RSAHelper.I2OSP(m, _rsaConfig.OctetsInModulus, false)); } }