#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
using System.Text;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Digests;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Engines;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Generators;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Modes;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Paddings;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Parameters;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Security;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Encoders;
namespace crypto
{
public class Security
{
// USAGE
//var key = Security.GenerateText(32);
//var iv = Security.GenerateText(16);
//var encrypted = Security.Encrypt("MY SECRET", key, iv);
//var decrypted = Security.Decrypt(encrypted, key, iv);
///
/// Return a salted hash based on PBKDF2 for the UTF-8 encoding of the argument text.
///
/// Provided key text
/// Base64 encoded string representing the salt
///
public static string ComputeHash(string text, string salt)
{
byte[] data = Encoding.UTF8.GetBytes(text);
Sha512Digest sha = new Sha512Digest();
Pkcs5S2ParametersGenerator gen = new Pkcs5S2ParametersGenerator(sha);
gen.Init(data, Base64.Decode(salt), 2048);
return Base64.ToBase64String(((KeyParameter)gen.GenerateDerivedParameters(sha.GetDigestSize() * 8)).GetKey());
}
public static string Decrypt(string cipherText, string key, string iv)
{
IBufferedCipher cipher = CreateCipher(false, key, iv);
byte[] textAsBytes = cipher.DoFinal(Base64.Decode(cipherText));
return Encoding.UTF8.GetString(textAsBytes, 0, textAsBytes.Length);
}
public static string Encrypt(string plainText, string key, string iv)
{
IBufferedCipher cipher = CreateCipher(true, key, iv);
return Base64.ToBase64String(cipher.DoFinal(Encoding.UTF8.GetBytes(plainText)));
}
public static string GenerateText(int size)
{
byte[] textAsBytes = new byte[size];
SecureRandom secureRandom = SecureRandom.GetInstance("SHA256PRNG", true);
secureRandom.NextBytes(textAsBytes);
return Base64.ToBase64String(textAsBytes);
}
private static IBufferedCipher CreateCipher(bool isEncryption, string key, string iv)
{
IBufferedCipher cipher = new PaddedBufferedBlockCipher(new CbcBlockCipher(new RijndaelEngine()), new ISO10126d2Padding());
KeyParameter keyParam = new KeyParameter(Base64.Decode(key));
ICipherParameters cipherParams = (null == iv || iv.Length < 1)
? (ICipherParameters)keyParam
: new ParametersWithIV(keyParam, Base64.Decode(iv));
cipher.Init(isEncryption, cipherParams);
return cipher;
}
}
}
#pragma warning restore
#endif