using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string strVal= Decrypt(@"fgfgfgfgm", "Pas5pr@se", "s@1tValue", "MD5", 2,"@1B2c3D4e5F6g7H8", 256);
Console.ReadLine();
}
static public string Decrypt(string cipherText,
string passPhrase,
string saltValue,
string hashAlgorithm,
int passwordIterations,
string initVector,
int keySize)
{
//' Convert strings defining encryption key characteristics into byte
//' arrays. Let us assume that strings only contain ASCII codes.
//' If strings include Unicode characters, use Unicode, UTF7, or UTF8
//' encoding.
byte[] initVectorBytes;
initVectorBytes = Encoding.ASCII.GetBytes(initVector);
byte[] saltValueBytes;
saltValueBytes = Encoding.ASCII.GetBytes(saltValue);
//' Convert our ciphertext into a byte array.
byte[] cipherTextBytes;
cipherTextBytes = Convert.FromBase64String(cipherText);
//' First, we must create a password, from which the key will be
//' derived. This password will be generated from the specified
//' passphrase and salt value. The password will be created using
//' the specified hash algorithm. Password creation can be done in
//' several iterations.
PasswordDeriveBytes password;
password = new PasswordDeriveBytes(passPhrase,
saltValueBytes,
hashAlgorithm,
passwordIterations);
//' Use the password to generate pseudo-random bytes for the encryption
//' key. Specify the size of the key in bytes (instead of bits).
byte[] keyBytes;
keyBytes = password.GetBytes(keySize / 8);
//' Create uninitialized Rijndael encryption object.
RijndaelManaged symmetricKey;
symmetricKey = new RijndaelManaged();
//' It is reasonable to set encryption mode to Cipher Block Chaining
//' (CBC). Use default options for other symmetric key parameters.
symmetricKey.Mode = CipherMode.CBC;
//' Generate decryptor from the existing key bytes and initialization
//' vector. Key size will be defined based on the number of the key
//' bytes.
ICryptoTransform decryptor;
decryptor = symmetricKey.CreateDecryptor(keyBytes, initVectorBytes);
//' Define memory stream which will be used to hold encrypted data.
MemoryStream memoryStream;
memoryStream = new MemoryStream(cipherTextBytes);
//' Define memory stream which will be used to hold encrypted data.
CryptoStream cryptoStream;
cryptoStream = new CryptoStream(memoryStream,
decryptor,
CryptoStreamMode.Read);
//' Since at this point we don't know what the size of decrypted data
//' will be, allocate the buffer long enough to hold ciphertext;
//' plaintext is never longer than ciphertext.
byte[] plainTextBytes;
plainTextBytes = new byte[cipherTextBytes.Length];
//' Start decrypting.
int decryptedByteCount;
decryptedByteCount = cryptoStream.Read(plainTextBytes,
0,
plainTextBytes.Length);
//' Close both streams.
memoryStream.Close();
cryptoStream.Close();
//' Convert decrypted data into a string.
//' Let us assume that the original plaintext string was UTF8-encoded.
string plainText;
plainText = Encoding.UTF8.GetString(plainTextBytes,
0,
decryptedByteCount);
//' Return decrypted string.
return plainText;
}
}
}
No comments:
Post a Comment