private static string Decrypt(string cryptedMessage) { byte[] message = Convert.FromBase64String(cryptedMessage); // BouncyCastle version var Hmac = new Org.BouncyCastle.Crypto.Digests.Sha512Digest(); var keyToHash = Encoding.UTF8.GetBytes("Vg*b51^_! j4a\"I-d73j"); Hmac.BlockUpdate(keyToHash, 0, keyToHash.Length); byte[] result = new byte[Hmac.GetDigestSize()]; Hmac.DoFinal(result, 0); var array = new byte[24]; Array.Copy(result, array, array.Length); var DesEngine = new PaddedBufferedBlockCipher(new DesEdeEngine()); DesEngine.Init(false, new KeyParameter(array)); byte[] output = new byte[message.Length]; DesEngine.DoFinal(message, output, 0); return(Encoding.UTF8.GetString(output, 0, output.Length)); // PCLCrypto version //var hashEngine = WinRTCrypto.HashAlgorithmProvider.OpenAlgorithm(HashAlgorithm.Sha512); //var hash = hashEngine.HashData(Encoding.UTF8.GetBytes("Vg*b51^_! j4a\"I-d73j")); //var desEngine = WinRTCrypto.SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithm.TripleDesEcb); //var key = new byte[24]; //Array.Copy(hash, key, key.Length); //var cryptoKey = desEngine.CreateSymmetricKey(key); //var bytes = WinRTCrypto.CryptographicEngine.Decrypt(cryptoKey, message); //return Encoding.UTF8.GetString(bytes, 0, bytes.Length); }
public static byte[] SHA512(string text) { byte[] bytes = System.Text.Encoding.UTF8.GetBytes(text); Org.BouncyCastle.Crypto.Digests.Sha512Digest digester = new Org.BouncyCastle.Crypto.Digests.Sha512Digest(); byte[] retValue = new byte[digester.GetDigestSize()]; digester.BlockUpdate(bytes, 0, bytes.Length); digester.DoFinal(retValue, 0); return(retValue); }
public static string ConvertStringToHash(string password, string salt) { byte[] data = Encoding.UTF8.GetBytes(password + "" + salt); Org.BouncyCastle.Crypto.Digests.Sha512Digest hash = new Org.BouncyCastle.Crypto.Digests.Sha512Digest(); hash.BlockUpdate(data, 0, data.Length); byte[] result = new byte[hash.GetDigestSize()]; hash.DoFinal(result, 0); StringBuilder sb = new StringBuilder(); for (int i = 0; i < result.Length; i++) { sb.Append(result[i].ToString("x2")); } string res = sb.ToString(); return(res); }
public byte[] generateChildKey(byte[] parentKey, int seed = 0) { RSACryptoServiceProvider origRsa = rsaKeyFromBytes(parentKey); if (origRsa.PublicOnly) { Logging.error("Child key cannot be generated from a public key! Private key is also required."); return(null); } RSAParameters origKey = origRsa.ExportParameters(true); RsaKeyPairGenerator kpGenerator = new RsaKeyPairGenerator(); int seed_len = origKey.P.Length + origKey.Q.Length; if (seed != 0) { seed_len += 4; } byte[] child_seed = new byte[seed_len]; Array.Copy(origKey.P, 0, child_seed, 0, origKey.P.Length); Array.Copy(origKey.Q, 0, child_seed, origKey.P.Length, origKey.Q.Length); if (seed != 0) { Array.Copy(BitConverter.GetBytes(seed), 0, child_seed, origKey.P.Length + origKey.Q.Length, 4); } Org.BouncyCastle.Crypto.Digests.Sha512Digest key_digest = new Org.BouncyCastle.Crypto.Digests.Sha512Digest(); Org.BouncyCastle.Crypto.Prng.DigestRandomGenerator digest_rng = new Org.BouncyCastle.Crypto.Prng.DigestRandomGenerator(key_digest); digest_rng.AddSeedMaterial(child_seed); // TODO: Check if certainty of 80 is good enough for us RsaKeyGenerationParameters keyParams = new RsaKeyGenerationParameters(BigInteger.ValueOf(0x10001), new SecureRandom(digest_rng), 4096, 80); RsaKeyPairGenerator keyGen = new RsaKeyPairGenerator(); keyGen.Init(keyParams); AsymmetricCipherKeyPair keyPair = keyGen.GenerateKeyPair(); // RSACryptoServiceProvider newRsa = (RSACryptoServiceProvider)DotNetUtilities.ToRSA((RsaPrivateCrtKeyParameters)keyPair.Private); return(rsaKeyToBytes(newRsa, true, false)); }
public IActionResult CreateReviewerAddressAsync([FromBody] CreateReviewerAddressRequest request) { Guard.NotNull(request, nameof(request)); // checks the request is valid if (!this.ModelState.IsValid) { return(ModelStateErrors.BuildErrorResponse(this.ModelState)); } try { // calculate the Manager password hash byte[] binaryPassword = System.Text.Encoding.ASCII.GetBytes(request.RsaPassword); Org.BouncyCastle.Crypto.Digests.Sha512Digest sha = new Org.BouncyCastle.Crypto.Digests.Sha512Digest(); sha.BlockUpdate(binaryPassword, 0, binaryPassword.Length); byte[] shaOutput = new byte[512 / 8]; sha.DoFinal(shaOutput, 0); NBitcoin.DataEncoders.HexEncoder he = new NBitcoin.DataEncoders.HexEncoder(); string rsaPasswordHashHex = he.EncodeData(shaOutput); // create the multisig address PubKey[] groupMemberKeys = request.SignaturePubKeys.Select(pubKeyHex => new PubKey(pubKeyHex)).ToArray(); var scriptPubKey = PayToMultiSigTemplate .Instance .GenerateScriptPubKey(request.RequeiredSignatureCount, groupMemberKeys); PublicReviewerAddressModel model = new PublicReviewerAddressModel { PublicApiUrl = request.PublicApiUrl }; // check if the API is reachable and the address can be added to the watch list Uri apiRequestUri = new Uri(new Uri(model.PublicApiUrl), $"/api/WatchOnlyWallet/watch?address={scriptPubKey.Hash.GetAddress(this.network).ToString()}"); try { HttpWebRequest apiRequest = (HttpWebRequest)WebRequest.Create(apiRequestUri); ASCIIEncoding encoding = new ASCIIEncoding(); string postData = ""; byte[] data = encoding.GetBytes(postData); apiRequest.Method = "POST"; apiRequest.ContentType = "application/x-www-form-urlencoded"; apiRequest.ContentLength = data.Length; using (Stream stream = apiRequest.GetRequestStream()) { stream.Write(data, 0, data.Length); } HttpWebResponse apiResponse = (HttpWebResponse)apiRequest.GetResponse(); string responseString = new StreamReader(apiResponse.GetResponseStream()).ReadToEnd(); if (apiResponse.StatusCode != HttpStatusCode.OK) { throw new Exception($"The API request '{apiRequestUri.ToString()}' returned the status code '{apiResponse.StatusCode}'."); } } catch (Exception e) { throw new Exception($"The API request '{apiRequestUri.ToString()}' returned an error '{e.Message}'."); } // generate the RSA keypair for the address AsymmetricCipherKeyPair rsaKeyPair = GetRSAKeyPairFromSeed(request.RsaPassword + scriptPubKey.Hash.GetAddress(this.network).ToString()); RsaKeyParameters rsaPublicKey = rsaKeyPair.Public as RsaKeyParameters; RsaPublicKey pbk = new RsaPublicKey() { Exponent = rsaPublicKey.Exponent.ToByteArrayUnsigned(), Modulus = rsaPublicKey.Modulus.ToByteArrayUnsigned() }; RsaPrivateCrtKeyParameters rsaPrivateKey = rsaKeyPair.Private as RsaPrivateCrtKeyParameters; RsaPrivateKey prk = new RsaPrivateKey() { DP = rsaPrivateKey.DP.ToByteArrayUnsigned(), DQ = rsaPrivateKey.DQ.ToByteArrayUnsigned(), Exponent = rsaPrivateKey.Exponent.ToByteArrayUnsigned(), Modulus = rsaPrivateKey.Modulus.ToByteArrayUnsigned(), P = rsaPrivateKey.P.ToByteArrayUnsigned(), PublicExponent = rsaPrivateKey.PublicExponent.ToByteArrayUnsigned(), Q = rsaPrivateKey.Q.ToByteArrayUnsigned(), QInv = rsaPrivateKey.QInv.ToByteArrayUnsigned() }; // return all the information we have model = new PublicReviewerAddressModel { Network = this.network.ToString(), Address = scriptPubKey.Hash.GetAddress(this.network).ToString(), PublicName = request.PublicName, GroupName = request.GroupName, ValidFrom = request.ValidFrom.ToString("o"), ValidUntil = request.ValidUntil.ToString("o"), ScriptPubKeyHex = scriptPubKey.ToHex(), RsaPublicKeyHex = pbk.ToHex(), RsaPrivateKeyHex = prk.ToHex(), RsaPasswordHashHex = rsaPasswordHashHex, PublicApiUrl = request.PublicApiUrl }; ((WalletManager)this.walletManager).AddReviewerAddressToReviewerStore(model); return(this.Json(model)); } catch (Exception e) { this.logger.LogError("Exception occurred: {0}", e.ToString()); return(ErrorHelpers.BuildErrorResponse(HttpStatusCode.BadRequest, e.Message, e.ToString())); } }