Advertisement
AyrA

C# crypt.cs

Jun 20th, 2014
337
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.16 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.IO;
  5. using System.Security.Cryptography;
  6.  
  7. namespace Signer
  8. {
  9.     public enum HashType
  10.     {
  11.         SHA1,
  12.         SHA256,
  13.         SHA512
  14.     }
  15.  
  16.     public static class Crypt
  17.     {
  18.         private static Random R = null;
  19.  
  20.         private const int BUFFER = 1024 * 1024;
  21.  
  22.         /// <summary>
  23.         /// Generates a random Password
  24.         /// </summary>
  25.         /// <param name="Length">Password Length</param>
  26.         /// <returns>new password</returns>
  27.         public static string randomPassword(int Length)
  28.         {
  29.             StringBuilder SB = new StringBuilder(Length);
  30.             if (R == null)
  31.             {
  32.                 R = new Random();
  33.             }
  34.             for (int i = 0; i < Length; i++)
  35.             {
  36.                 SB.Append(Base.SYM_PWDMAP[R.Next(Base.SYM_PWDMAP.Length)]);
  37.             }
  38.             return SB.ToString();
  39.         }
  40.  
  41.         /// <summary>
  42.         /// Generates random bytes
  43.         /// </summary>
  44.         /// <param name="Length">Number of bytes</param>
  45.         /// <returns>What do you expect?</returns>
  46.         public static byte[] randomBytes(int Length)
  47.         {
  48.             byte[] b = new byte[Length];
  49.             if (R == null)
  50.             {
  51.                 R = new Random();
  52.             }
  53.             R.NextBytes(b);
  54.             return b;
  55.         }
  56.  
  57.         /// <summary>
  58.         /// creates a stream from a byte array
  59.         /// </summary>
  60.         /// <param name="b">byte array</param>
  61.         /// <returns>Memory stream</returns>
  62.         public static MemoryStream ToStream(byte[] b)
  63.         {
  64.             return new MemoryStream(b);
  65.         }
  66.  
  67.         /// <summary>
  68.         /// Signs data from a stream
  69.         /// </summary>
  70.         /// <param name="In">Input data</param>
  71.         /// <param name="K">Key to sign (must have private key)</param>
  72.         /// <returns>sign block</returns>
  73.         public static byte[] Sign(Stream In, Key K)
  74.         {
  75.             var RCSP = K.GetRCSP();
  76.             byte[] hash = GetHash(In);
  77.             byte[] sig = RCSP.SignHash(hash, HashType.SHA512.ToString());
  78.             RCSP.Clear();
  79.             return sig;
  80.         }
  81.  
  82.         /// <summary>
  83.         /// Verifies a Signature
  84.         /// </summary>
  85.         /// <param name="In">Input data</param>
  86.         /// <param name="signature">Signature</param>
  87.         /// <param name="K">Key to verify against</param>
  88.         /// <returns>true, if verified duccessfully</returns>
  89.         public static bool Verify(Stream In, byte[] signature, Key K)
  90.         {
  91.             var RCSP = K.GetRCSP();
  92.             byte[] hash = GetHash(In);
  93.             bool ok = RCSP.VerifyHash(hash, HashType.SHA512.ToString(), signature);
  94.             RCSP.Clear();
  95.             return ok;
  96.         }
  97.  
  98.         /// <summary>
  99.         /// Encrypts a stream into another
  100.         /// </summary>
  101.         /// <param name="In">Input data (unencrypted)</param>
  102.         /// <param name="Out">Output data (encrypted, writeable)</param>
  103.         /// <param name="K">Encryption key (must have private key)</param>
  104.         /// <returns>password for decryption</returns>
  105.         public static void Encrypt(Stream In, Stream Out, Key K)
  106.         {
  107.             var RCSP=K.GetRCSP();
  108.             In.Seek(0, SeekOrigin.Begin);
  109.             byte[] dec = new byte[BUFFER];
  110.  
  111.             byte[] PWD = randomBytes(Base.SYM_PW);
  112.             byte[] IV = randomBytes(Base.SYM_IV);
  113.  
  114.             RijndaelManaged RM = new RijndaelManaged();
  115.  
  116.             byte[] tmp = RCSP.Encrypt(PWD, true);
  117.             Out.Write(tmp, 0, Base.ASYM_RSASIZE);
  118.             tmp = RCSP.Encrypt(IV, true);
  119.             Out.Write(tmp, 0, Base.ASYM_RSASIZE);
  120.  
  121.             RCSP.Clear();
  122.             CryptoStream CS = new CryptoStream(Out, RM.CreateEncryptor(PWD, IV), CryptoStreamMode.Write);
  123.  
  124.             for (int i = 0; i < In.Length; i += BUFFER)
  125.             {
  126.                 int readed = In.Read(dec, 0, BUFFER);
  127.                 if(readed<BUFFER)
  128.                 {
  129.                     Array.Resize<byte>(ref dec, readed);
  130.                 }
  131.                 CS.Write(dec, 0, dec.Length);
  132.             }
  133.             CS.Close();
  134.             CS.Dispose();
  135.         }
  136.  
  137.         /// <summary>
  138.         /// Decrypts a stream into another
  139.         /// </summary>
  140.         /// <param name="In">Input data (encrypted)</param>
  141.         /// <param name="Out">Output data (unencrypted, writeable)</param>
  142.         /// <param name="K">Decryption key</param>
  143.         public static bool Decrypt(Stream In, Stream Out, Key K)
  144.         {
  145.             var RCSP = K.GetRCSP();
  146.             byte[] enc = new byte[BUFFER];
  147.             byte[] PWD = new byte[Base.ASYM_RSASIZE];
  148.             byte[] IV = new byte[Base.ASYM_RSASIZE];
  149.             int readed;
  150.             CryptoStream CS;
  151.             RijndaelManaged RM = new RijndaelManaged();
  152.  
  153.             //do not even try for pubkey only
  154.             if (RCSP.PublicOnly)
  155.             {
  156.                 return false;
  157.             }
  158.  
  159.             In.Seek(0, SeekOrigin.Begin);
  160.  
  161.             In.Read(PWD, 0, Base.ASYM_RSASIZE);
  162.             In.Read(IV, 0, Base.ASYM_RSASIZE);
  163.             try
  164.             {
  165.                 PWD = RCSP.Decrypt(PWD, true);
  166.                 IV = RCSP.Decrypt(IV, true);
  167.                 CS = new CryptoStream(In, RM.CreateDecryptor(PWD, IV), CryptoStreamMode.Read);
  168.             }
  169.             catch(Exception ex)
  170.             {
  171.                 Console.WriteLine(ex.Message);
  172.                 return false;
  173.             }
  174.  
  175.             CS = new CryptoStream(In, RM.CreateDecryptor(PWD, IV), CryptoStreamMode.Read);
  176.  
  177.  
  178.             RCSP.Clear();
  179.  
  180.             for (int i = 0; i < In.Length; i += BUFFER)
  181.             {
  182.                 try
  183.                 {
  184.                     readed = CS.Read(enc, 0, BUFFER);
  185.                 }
  186.                 catch
  187.                 {
  188.                     CS.Close();
  189.                     CS.Clear();
  190.                     return false;
  191.                 }
  192.                 if (readed < BUFFER)
  193.                 {
  194.                     Array.Resize<byte>(ref enc, readed);
  195.                 }
  196.                 Out.Write(enc, 0, enc.Length);
  197.             }
  198.             Out.Close();
  199.             CS.Close();
  200.             CS.Dispose();
  201.             return true;
  202.         }
  203.  
  204.         /// <summary>
  205.         /// Generates a SHA-512 hash from data in a stream
  206.         /// </summary>
  207.         /// <param name="In">Input stream</param>
  208.         /// <returns>hash</returns>
  209.         public static byte[] GetHash(Stream In)
  210.         {
  211.             return GetHash(In, Base.CRYPT_HASH);
  212.         }
  213.  
  214.         /// <summary>
  215.         /// Generates a hash from data in a stream
  216.         /// </summary>
  217.         /// <param name="In">Input stream</param>
  218.         /// <param name="Algorithm">Hash algorithm to use</param>
  219.         /// <returns>hash</returns>
  220.         public static byte[] GetHash(Stream In, HashType Algorithm)
  221.         {
  222.             var H = HashAlgorithm.Create(Algorithm.ToString());
  223.             In.Seek(0, SeekOrigin.Begin);
  224.             byte[] yay = H.ComputeHash(In);
  225.             H.Clear();
  226.             return yay;
  227.         }
  228.     }
  229. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement