diff --git a/C-Sharp/CryptLib.cs b/C-Sharp/CryptLib.cs index e37a0cb..fd22a04 100644 --- a/C-Sharp/CryptLib.cs +++ b/C-Sharp/CryptLib.cs @@ -1,213 +1,82 @@ using System; -using System.Text; +using System.Collections.Generic; using System.Security.Cryptography; +using System.Text; namespace com.pakhee.common { - /***************************************************************** - * CrossPlatform CryptLib - * - *

- * This cross platform CryptLib uses AES 256 for encryption. This library can - * be used for encryptoion and de-cryption of string on iOS, Android and Windows - * platform.
- * Features:
- * 1. 256 bit AES encryption - * 2. Random IV generation. - * 3. Provision for SHA256 hashing of key. - *

- * - * @since 1.0 - * @author navneet - *****************************************************************/ public class CryptLib - { - UTF8Encoding _enc; - RijndaelManaged _rcipher; - byte[] _key, _pwd, _ivBytes, _iv; - - /*** - * Encryption mode enumeration - */ - private enum EncryptMode {ENCRYPT, DECRYPT}; - - static readonly char[] CharacterMatrixForRandomIVStringGeneration = { - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', - 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', - 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_' - }; - - /** - * This function generates random string of the given input length. - * - * @param _plainText - * Plain text to be encrypted - * @param _key - * Encryption Key. You'll have to use the same key for decryption - * @return returns encrypted (cipher) text - */ - internal static string GenerateRandomIV(int length) { - char[] _iv = new char[length]; - byte[] randomBytes = new byte[length]; - - using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider()) { - rng.GetBytes(randomBytes); - } - - for (int i = 0; i < _iv.Length; i++) { - int ptr = randomBytes[i] % CharacterMatrixForRandomIVStringGeneration.Length; - _iv[i] = CharacterMatrixForRandomIVStringGeneration[ptr]; - } - - return new string(_iv); - } - - - - public CryptLib() - { - _enc = new UTF8Encoding(); - _rcipher = new RijndaelManaged(); - _rcipher.Mode = CipherMode.CBC; - _rcipher.Padding = PaddingMode.PKCS7; - _rcipher.KeySize = 256; - _rcipher.BlockSize = 128; - _key = new byte[32]; - _iv = new byte[_rcipher.BlockSize/8]; //128 bit / 8 = 16 bytes - _ivBytes = new byte[16]; - } - - /** - * - * @param _inputText - * Text to be encrypted or decrypted - * @param _encryptionKey - * Encryption key to used for encryption / decryption - * @param _mode - * specify the mode encryption / decryption - * @param _initVector - * initialization vector - * @return encrypted or decrypted string based on the mode - */ - private String encryptDecrypt (string _inputText, string _encryptionKey, EncryptMode _mode, string _initVector) - { - - string _out = "";// output string - //_encryptionKey = MD5Hash (_encryptionKey); - _pwd = Encoding.UTF8.GetBytes(_encryptionKey); - _ivBytes = Encoding.UTF8.GetBytes (_initVector); - - int len = _pwd.Length; - if (len > _key.Length) - { - len = _key.Length; - } - int ivLenth = _ivBytes.Length; - if (ivLenth > _iv.Length) - { - ivLenth = _iv.Length; - } - - Array.Copy(_pwd, _key, len); - Array.Copy (_ivBytes, _iv, ivLenth); - _rcipher.Key = _key; - _rcipher.IV = _iv; - - if (_mode.Equals (EncryptMode.ENCRYPT)) { - //encrypt - byte[] plainText = _rcipher.CreateEncryptor().TransformFinalBlock(_enc.GetBytes(_inputText) , 0, _inputText.Length); - _out = Convert.ToBase64String(plainText); - } - if (_mode.Equals (EncryptMode.DECRYPT)) { - //decrypt - byte[] plainText = _rcipher.CreateDecryptor().TransformFinalBlock(Convert.FromBase64String(_inputText), 0, Convert.FromBase64String(_inputText).Length); - _out = _enc.GetString(plainText); - } - _rcipher.Dispose(); - return _out;// return encrypted/decrypted string - } - - /** - * This function encrypts the plain text to cipher text using the key - * provided. You'll have to use the same key for decryption - * - * @param _plainText - * Plain text to be encrypted - * @param _key - * Encryption Key. You'll have to use the same key for decryption - * @return returns encrypted (cipher) text - */ - public string encrypt (string _plainText, string _key, string _initVector) - { - return encryptDecrypt(_plainText, _key, EncryptMode.ENCRYPT, _initVector); - } - - /*** - * This funtion decrypts the encrypted text to plain text using the key - * provided. You'll have to use the same key which you used during - * encryprtion - * - * @param _encryptedText - * Encrypted/Cipher text to be decrypted - * @param _key - * Encryption key which you used during encryption - * @return encrypted value - */ - - public string decrypt(string _encryptedText, string _key, string _initVector) - { - return encryptDecrypt(_encryptedText, _key, EncryptMode.DECRYPT, _initVector); - } - - /*** - * This function decrypts the encrypted text to plain text using the key - * provided. You'll have to use the same key which you used during - * encryption - * - * @param _encryptedText - * Encrypted/Cipher text to be decrypted - * @param _key - * Encryption key which you used during encryption - */ - public static string getHashSha256(string text, int length) - { - byte[] bytes = Encoding.UTF8.GetBytes(text); - SHA256Managed hashstring = new SHA256Managed(); - byte[] hash = hashstring.ComputeHash(bytes); - string hashString = string.Empty; - foreach (byte x in hash) - { - hashString += String.Format("{0:x2}", x); //covert to hex string - } - if (length > hashString.Length) - return hashString; - else - return hashString.Substring (0, length); - } - - //this function is no longer used. - private static string MD5Hash(string text) - { - MD5 md5 = new MD5CryptoServiceProvider(); - - //compute hash from the bytes of text - md5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(text)); - - //get hash result after compute it - byte[] result = md5.Hash; - - StringBuilder strBuilder = new StringBuilder(); - for (int i = 0; i < result.Length; i++) - { - //change it into 2 hexadecimal digits - //for each byte - strBuilder.Append(result[i].ToString("x2")); - } - Console.WriteLine ("md5 hash of they key=" + strBuilder.ToString ()); - return strBuilder.ToString(); - } - - } + { + private readonly RijndaelManaged _cipher; + + public CryptLib(string key, string iv) + { + string hashedKey = GenerateSha256Hash(key, 32); + string hashedIv = GenerateMd5Hash(iv, 16); + + _cipher = new RijndaelManaged + { + Mode = CipherMode.CBC, + Padding = PaddingMode.PKCS7, + KeySize = 256, + BlockSize = 128, + Key = Encoding.UTF8.GetBytes(hashedKey), + IV = Encoding.UTF8.GetBytes(hashedIv) + }; + } + + public string Decrypt(string content) + { + byte[] encryptedText = Convert.FromBase64String(content); + byte[] decryptedText = _cipher.CreateDecryptor().TransformFinalBlock(encryptedText, 0, encryptedText.Length); + + return Encoding.UTF8.GetString(decryptedText); + } + + public string Encrypt(string content) + { + byte[] encryptedText = _cipher.CreateEncryptor().TransformFinalBlock(Encoding.UTF8.GetBytes(content), 0, content.Length); + return Convert.ToBase64String(encryptedText); + } + + private static string ConvertHashBytesToString(IEnumerable hashBytes) + { + StringBuilder result = new StringBuilder(); + + // Convert hash byte array to string + foreach (byte passwordByte in hashBytes) + { + result.Append(passwordByte.ToString("x2")); + } + + // Return hash as string + return result.ToString(); + } + + private static string GenerateMd5Hash(string content) + { + byte[] inputBytes = Encoding.UTF8.GetBytes(content); + byte[] hashBytes = new MD5CryptoServiceProvider().ComputeHash(inputBytes); + + return ConvertHashBytesToString(hashBytes); + } + + private static string GenerateMd5Hash(string content, int length) + { + return GenerateMd5Hash(content).Substring(0, length); + } + + private static string GenerateSha256Hash(string content) + { + byte[] inputBytes = Encoding.UTF8.GetBytes(content); + byte[] hashedStringBytes = new SHA256CryptoServiceProvider().ComputeHash(inputBytes); + + return ConvertHashBytesToString(hashedStringBytes); + } + + private static string GenerateSha256Hash(string content, int length) + { + return GenerateSha256Hash(content).Substring(0, length); + } + } } diff --git a/C-Sharp/HowToUse.cs b/C-Sharp/HowToUse.cs index 52d32e1..0600019 100644 --- a/C-Sharp/HowToUse.cs +++ b/C-Sharp/HowToUse.cs @@ -1,15 +1,15 @@ - public class test { - public static void Main (String []args) - { - CryptLib _crypt = new CryptLib (); - string plainText = "This is the text to be encrypted"; - String iv = CryptLib.GenerateRandomIV (16); //16 bytes = 128 bits - string key = CryptLib.getHashSha256("my secret key", 31); //32 bytes = 256 bits - String cypherText = _crypt.encrypt (plainText, key, iv); - Console.WriteLine ("iv="+iv); - Console.WriteLine ("key=" + key); - Console.WriteLine("Cypher text=" + cypherText); - Console.WriteLine ("Plain text =" + _crypt.decrypt (cypherText, key, iv)); - } + internal class Program + { + private static void Main(string[] args) + { + CryptLib crypt = new CryptLib("password", "iv"); - } + string encryptedText = crypt.Encrypt("this is a secret message"); + Console.WriteLine(encryptedText); + + string decryptedText = crypt.Decrypt(encryptedText); + Console.WriteLine(decryptedText); + + Console.ReadLine(); + } + } \ No newline at end of file