C # তে একটি স্ট্রিং এনক্রিপ্ট করুন এবং ডিক্রিপ্ট করবেন?


694

আমি কীভাবে সি # তে একটি স্ট্রিং এনক্রিপ্ট এবং ডিক্রিপ্ট করতে পারি?



3
কিছু সাধারণ প্রয়োজন ... এই লিঙ্কটি আমার জন্য কাজ করেছে saipanyam.net/2010/03/encrypt-query-strings.html
মিঃ এম

6
আমি উচ্চতরভাবে 3DES বাদ দেওয়ার এবং AES-GCM ব্যবহার করার পরামর্শ দিচ্ছি। AES-GCM .NET 4.5 crypto libs এ পাওয়া যায় না এবং 'সাধারন AES' (= AES-CBC মোড সাধারণত) থেকে পৃথক হয়। ক্রিপ্টোগ্রাফিক কারণে আমি won'tুকব না বলেই 'এএসএস-জিসিএম' 'স্বাভাবিক' এর চেয়ে অনেক ভাল। সুতরাং jbtuleএই অধীনে নিচে সেরা উত্তর আছে Bouncy Castle AES-GCMউপধারা। আপনি তো আমাদেরকে বিশ্বাস না থাকে, তাহলে অন্তত ট্রাস্ট এ এনএসএ বিশেষজ্ঞদের (NSA স্যুট B @ nsa.gov/ia/programs/suiteb_cryptography/index.shtml : The Galois/Counter Mode (GCM) is the preferred AES mode.)
DeepSpace101

1
@ সিড ব্যক্তিগতভাবে আমি বেশিরভাগ পরিস্থিতিতে এএস-সিবিসি + এইচএমএসি-এসএএপি 2 এর চেয়ে বেশি পছন্দ করতাম C আপনি যদি কোনও ননস পুনরায় ব্যবহার করেন তবে জিসিএম বিপর্যয়করভাবে ব্যর্থ হয়।
কোডসইনচাউস

2
@ সিড নোনস পুনঃব্যবহার একটি খারাপ ধারণা, হ্যাঁ। তবে আমি এটি দেখেছি এমনকি সক্ষম প্রোগ্রামার / ক্রিপ্টোগ্রাফারদের সাথেও। যদি এটি হয়, জিসিএম সম্পূর্ণভাবে বিচ্ছিন্ন হয়ে যায়, যেখানে সিবিসি + এইচএমএসি কেবল কিছু ছোট্ট দুর্বলতা বিকাশ করে। প্রোটোকলের মতো কোনও এসএসএল দিয়ে জিসিএম ঠিক আছে, তবে আমি এটি স্ট্যান্ডার্ড "এনক্রিপ্ট এবং প্রমাণীকরণকারী" API হিসাবে আরামদায়ক নই।
কোডসইনচাউস

উত্তর:


415

সম্পাদনা 2013-অক্টোবর : যদিও আমি এই উত্তরটি স্বল্পতাগুলি সমাধান করার জন্য সময়ের সাথে সাথে সম্পাদনা করেছি, দয়া করে আরও শক্তিশালী, অবহিত সমাধানের জন্য jbtule এর উত্তর দেখুন।

https://stackoverflow.com/a/10366194/188474

আসল উত্তর:

"রিজান্ডেল ম্যানেজড ক্লাস" ডকুমেন্টেশন এবং এমসিটিএস প্রশিক্ষণ কিট থেকে প্রাপ্ত একটি কার্যকরী উদাহরণ এখানে ।

সম্পাদনা 2012-এপ্রিল : এই উত্তরটি Jbtule এর পরামর্শ অনুসারে IV প্রাক-দুলাতে সম্পাদিত হয়েছিল এবং এখানে চিত্রিত হিসাবে:

http://msdn.microsoft.com/en-us/library/system.security.cryptography.aesmanaged%28v=vs.95%29.aspx

শুভকামনা!

public class Crypto
{

    //While an app specific salt is not the best practice for
    //password based encryption, it's probably safe enough as long as
    //it is truly uncommon. Also too much work to alter this answer otherwise.
    private static byte[] _salt = __To_Do__("Add a app specific salt here");

    /// <summary>
    /// Encrypt the given string using AES.  The string can be decrypted using 
    /// DecryptStringAES().  The sharedSecret parameters must match.
    /// </summary>
    /// <param name="plainText">The text to encrypt.</param>
    /// <param name="sharedSecret">A password used to generate a key for encryption.</param>
    public static string EncryptStringAES(string plainText, string sharedSecret)
    {
        if (string.IsNullOrEmpty(plainText))
            throw new ArgumentNullException("plainText");
        if (string.IsNullOrEmpty(sharedSecret))
            throw new ArgumentNullException("sharedSecret");

        string outStr = null;                       // Encrypted string to return
        RijndaelManaged aesAlg = null;              // RijndaelManaged object used to encrypt the data.

        try
        {
            // generate the key from the shared secret and the salt
            Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(sharedSecret, _salt);

            // Create a RijndaelManaged object
            aesAlg = new RijndaelManaged();
            aesAlg.Key = key.GetBytes(aesAlg.KeySize / 8);

            // Create a decryptor to perform the stream transform.
            ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

            // Create the streams used for encryption.
            using (MemoryStream msEncrypt = new MemoryStream())
            {
                // prepend the IV
                msEncrypt.Write(BitConverter.GetBytes(aesAlg.IV.Length), 0, sizeof(int));
                msEncrypt.Write(aesAlg.IV, 0, aesAlg.IV.Length);
                using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                {
                    using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                    {
                        //Write all data to the stream.
                        swEncrypt.Write(plainText);
                    }
                }
                outStr = Convert.ToBase64String(msEncrypt.ToArray());
            }
        }
        finally
        {
            // Clear the RijndaelManaged object.
            if (aesAlg != null)
                aesAlg.Clear();
        }

        // Return the encrypted bytes from the memory stream.
        return outStr;
    }

    /// <summary>
    /// Decrypt the given string.  Assumes the string was encrypted using 
    /// EncryptStringAES(), using an identical sharedSecret.
    /// </summary>
    /// <param name="cipherText">The text to decrypt.</param>
    /// <param name="sharedSecret">A password used to generate a key for decryption.</param>
    public static string DecryptStringAES(string cipherText, string sharedSecret)
    {
        if (string.IsNullOrEmpty(cipherText))
            throw new ArgumentNullException("cipherText");
        if (string.IsNullOrEmpty(sharedSecret))
            throw new ArgumentNullException("sharedSecret");

        // Declare the RijndaelManaged object
        // used to decrypt the data.
        RijndaelManaged aesAlg = null;

        // Declare the string used to hold
        // the decrypted text.
        string plaintext = null;

        try
        {
            // generate the key from the shared secret and the salt
            Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(sharedSecret, _salt);

            // Create the streams used for decryption.                
            byte[] bytes = Convert.FromBase64String(cipherText);
            using (MemoryStream msDecrypt = new MemoryStream(bytes))
            {
                // Create a RijndaelManaged object
                // with the specified key and IV.
                aesAlg = new RijndaelManaged();
                aesAlg.Key = key.GetBytes(aesAlg.KeySize / 8);
                // Get the initialization vector from the encrypted stream
                aesAlg.IV = ReadByteArray(msDecrypt);
                // Create a decrytor to perform the stream transform.
                ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
                using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                {
                    using (StreamReader srDecrypt = new StreamReader(csDecrypt))

                        // Read the decrypted bytes from the decrypting stream
                        // and place them in a string.
                        plaintext = srDecrypt.ReadToEnd();
                }
            }
        }
        finally
        {
            // Clear the RijndaelManaged object.
            if (aesAlg != null)
                aesAlg.Clear();
        }

        return plaintext;
    }

    private static byte[] ReadByteArray(Stream s)
    {
        byte[] rawLength = new byte[sizeof(int)];
        if (s.Read(rawLength, 0, rawLength.Length) != rawLength.Length)
        {
            throw new SystemException("Stream did not contain properly formatted byte array");
        }

        byte[] buffer = new byte[BitConverter.ToInt32(rawLength, 0)];
        if (s.Read(buffer, 0, buffer.Length) != buffer.Length)
        {
            throw new SystemException("Did not read byte array properly");
        }

        return buffer;
    }
}

3
ব্রেট - হাই উদাহরণস্বরূপ আপনার উদাহরণের জন্য। মায়বাই একজন ভাবেন - আমি কী লেং নিয়ে সমস্যা পেয়েছি - আমি MD5 দিয়ে পরিবর্তন করেছি, সুতরাং কেউ যদি আপনার উদাহরণটিতে বৈশিষ্ট্যটি ব্যবহার করেন তবে কী সাধারণীকরণের জন্য এটি ব্যবহার করুন (বা আপনি অন্যান্য হ্যাশ অ্যালগরিটম ব্যবহার করতে পারেন: হাশআলগোরিদম হ্যাশ = নতুন এমডি 5 ক্রাইপ্টোস্রোসাইভ্রোয়েডার (); ইউনিকোডইনকোডিং ইউই = নতুন ইউনিকোডইনকোডিং (); বাইট [] কী = হ্যাশ.কম্পিউট হ্যাশ (ইউই.গেটবাইটস (এনক্রিপ্ট_প্যাসওয়ার্ড)); পিএস: আমার ইংলিশের জন্য দুঃখিত :) slinti

18
উপরের কোডটি সুরক্ষিত নয়, এটি এসের সাথে অর্থগত সুরক্ষার সর্বাধিক প্রাথমিক নিয়ম ভেঙে দেয়, আপনার একই চাবির সাথে একই আইভি একবারে একবার ব্যবহার করা উচিত নয়। আপনি যখন একবার একই কী ব্যবহার করেন এটি সর্বদা অভিন্ন আইভি দেয়।
jbtule

7
কী-ডেরাইভেশন প্রক্রিয়ায় একটি লবণ ব্যবহার করলে কোনও ক্ষতি হবে না। ধ্রুবক একটি ভাল লবণ নয়, যেমন ধ্রুবক ভাল IV হয় না।
কোডসইনচাউস

5
এইএস বনাম রিজান্ডেল বিভ্রান্তি সম্পর্কিত: এইএস হ'ল রিজান্ডেলের একটি উপসেট। আপনি যদি 128 বিট ব্লক এবং 128, 192 বা 256 বিট কী ব্যবহার করে রিজান্ডেল ব্যবহার করেন তবে আপনি এএস ব্যবহার করছেন।
কোডসইনচাউস

3
লবণ ক্র্যাকিং প্রতিরোধের জন্য একটি ডিগ্রি অবলম্বন যুক্ত করে। আপনি নীচে jbtule উদাহরণ পড়তে পরামর্শ দিন যেখানে লবণ উত্পন্ন হয়।
ব্রেট

360

একটি স্ট্রিংয়ের প্রতিসৃত প্রমাণীকৃত এনক্রিপশনের আধুনিক উদাহরণ।

প্রতিসম এনক্রিপশনের জন্য সাধারণ সেরা অনুশীলন হ'ল অ্যাসোসিয়েটেড ডেটা (এইএডি) সহ প্রমাণীকৃত এনক্রিপশন ব্যবহার করা, তবে এটি স্ট্যান্ডার্ড। নেট ক্রিপ্টো লাইব্রেরির অংশ নয়। সুতরাং প্রথম উদাহরণটি AES256 এবং তারপরে HMAC256 ব্যবহার করে , একটি দুই ধাপের এনক্রিপ্ট তারপর MAC , যার জন্য আরও ওভারহেড এবং আরও কীগুলি প্রয়োজন।

দ্বিতীয় উদাহরণ AES256- এর সহজ অনুশীলন ব্যবহার জিসিএম ওপেন সোর্স bouncy দুর্গ (মাধ্যমে nuget) ব্যবহার করে।

উভয় উদাহরণের একটি প্রধান ফাংশন রয়েছে যা গোপন বার্তার স্ট্রিং, কী (গুলি) এবং একটি alচ্ছিক নন-সিক্রেট পেওলোড এবং রিটার্ন এবং প্রমাণীকরণযুক্ত এনক্রিপ্টড স্ট্রিংটিকে অ গোপনীয় ডেটাগুলির সাথে বৈকল্পিকভাবে চাপিয়ে দেয়। আদর্শভাবে আপনি এলোমেলোভাবে উত্পাদিত 256 বিট কী (গুলি) দিয়ে এগুলি ব্যবহার করবেন NewKey()

উভয় উদাহরণের একটি সহায়ক পদ্ধতি রয়েছে যা কী উত্পন্ন করতে স্ট্রিং পাসওয়ার্ড ব্যবহার করে। এই সহায়ক পদ্ধতিগুলি অন্যান্য উদাহরণগুলির সাথে মিলে যাওয়ার সুবিধার্থে সরবরাহ করা হয় তবে এগুলি অনেক কম সুরক্ষিত কারণ পাসওয়ার্ডটির শক্তি 256 বিট কী-এর চেয়ে অনেক দূর্বল হতে চলেছে ।

আপডেট করুন: যোগ করা হয়েছে byte[]overloads, এবং শুধুমাত্র সারকথা 4 শূণ্যস্থান ইন্ডেন্ট এবং API ডক্স Stackoverflow উত্তর সীমাবদ্ধতা থাকার কারণে সঙ্গে পূর্ণ বিন্যাস হয়েছে।


.NET বিল্ট-ইন এনক্রিপ্ট (এইএস) -তখন-ম্যাক (এইচএমএসি) [সংক্ষেপে]

/*
 * This work (Modern Encryption of a String C#, by James Tuley), 
 * identified by James Tuley, is free of known copyright restrictions.
 * https://gist.github.com/4336842
 * http://creativecommons.org/publicdomain/mark/1.0/ 
 */

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

namespace Encryption
{
  public static class AESThenHMAC
  {
    private static readonly RandomNumberGenerator Random = RandomNumberGenerator.Create();

    //Preconfigured Encryption Parameters
    public static readonly int BlockBitSize = 128;
    public static readonly int KeyBitSize = 256;

    //Preconfigured Password Key Derivation Parameters
    public static readonly int SaltBitSize = 64;
    public static readonly int Iterations = 10000;
    public static readonly int MinPasswordLength = 12;

    /// <summary>
    /// Helper that generates a random key on each call.
    /// </summary>
    /// <returns></returns>
    public static byte[] NewKey()
    {
      var key = new byte[KeyBitSize / 8];
      Random.GetBytes(key);
      return key;
    }

    /// <summary>
    /// Simple Encryption (AES) then Authentication (HMAC) for a UTF8 Message.
    /// </summary>
    /// <param name="secretMessage">The secret message.</param>
    /// <param name="cryptKey">The crypt key.</param>
    /// <param name="authKey">The auth key.</param>
    /// <param name="nonSecretPayload">(Optional) Non-Secret Payload.</param>
    /// <returns>
    /// Encrypted Message
    /// </returns>
    /// <exception cref="System.ArgumentException">Secret Message Required!;secretMessage</exception>
    /// <remarks>
    /// Adds overhead of (Optional-Payload + BlockSize(16) + Message-Padded-To-Blocksize +  HMac-Tag(32)) * 1.33 Base64
    /// </remarks>
    public static string SimpleEncrypt(string secretMessage, byte[] cryptKey, byte[] authKey,
                       byte[] nonSecretPayload = null)
    {
      if (string.IsNullOrEmpty(secretMessage))
        throw new ArgumentException("Secret Message Required!", "secretMessage");

      var plainText = Encoding.UTF8.GetBytes(secretMessage);
      var cipherText = SimpleEncrypt(plainText, cryptKey, authKey, nonSecretPayload);
      return Convert.ToBase64String(cipherText);
    }

    /// <summary>
    /// Simple Authentication (HMAC) then Decryption (AES) for a secrets UTF8 Message.
    /// </summary>
    /// <param name="encryptedMessage">The encrypted message.</param>
    /// <param name="cryptKey">The crypt key.</param>
    /// <param name="authKey">The auth key.</param>
    /// <param name="nonSecretPayloadLength">Length of the non secret payload.</param>
    /// <returns>
    /// Decrypted Message
    /// </returns>
    /// <exception cref="System.ArgumentException">Encrypted Message Required!;encryptedMessage</exception>
    public static string SimpleDecrypt(string encryptedMessage, byte[] cryptKey, byte[] authKey,
                       int nonSecretPayloadLength = 0)
    {
      if (string.IsNullOrWhiteSpace(encryptedMessage))
        throw new ArgumentException("Encrypted Message Required!", "encryptedMessage");

      var cipherText = Convert.FromBase64String(encryptedMessage);
      var plainText = SimpleDecrypt(cipherText, cryptKey, authKey, nonSecretPayloadLength);
      return plainText == null ? null : Encoding.UTF8.GetString(plainText);
    }

    /// <summary>
    /// Simple Encryption (AES) then Authentication (HMAC) of a UTF8 message
    /// using Keys derived from a Password (PBKDF2).
    /// </summary>
    /// <param name="secretMessage">The secret message.</param>
    /// <param name="password">The password.</param>
    /// <param name="nonSecretPayload">The non secret payload.</param>
    /// <returns>
    /// Encrypted Message
    /// </returns>
    /// <exception cref="System.ArgumentException">password</exception>
    /// <remarks>
    /// Significantly less secure than using random binary keys.
    /// Adds additional non secret payload for key generation parameters.
    /// </remarks>
    public static string SimpleEncryptWithPassword(string secretMessage, string password,
                             byte[] nonSecretPayload = null)
    {
      if (string.IsNullOrEmpty(secretMessage))
        throw new ArgumentException("Secret Message Required!", "secretMessage");

      var plainText = Encoding.UTF8.GetBytes(secretMessage);
      var cipherText = SimpleEncryptWithPassword(plainText, password, nonSecretPayload);
      return Convert.ToBase64String(cipherText);
    }

    /// <summary>
    /// Simple Authentication (HMAC) and then Descryption (AES) of a UTF8 Message
    /// using keys derived from a password (PBKDF2). 
    /// </summary>
    /// <param name="encryptedMessage">The encrypted message.</param>
    /// <param name="password">The password.</param>
    /// <param name="nonSecretPayloadLength">Length of the non secret payload.</param>
    /// <returns>
    /// Decrypted Message
    /// </returns>
    /// <exception cref="System.ArgumentException">Encrypted Message Required!;encryptedMessage</exception>
    /// <remarks>
    /// Significantly less secure than using random binary keys.
    /// </remarks>
    public static string SimpleDecryptWithPassword(string encryptedMessage, string password,
                             int nonSecretPayloadLength = 0)
    {
      if (string.IsNullOrWhiteSpace(encryptedMessage))
        throw new ArgumentException("Encrypted Message Required!", "encryptedMessage");

      var cipherText = Convert.FromBase64String(encryptedMessage);
      var plainText = SimpleDecryptWithPassword(cipherText, password, nonSecretPayloadLength);
      return plainText == null ? null : Encoding.UTF8.GetString(plainText);
    }

    public static byte[] SimpleEncrypt(byte[] secretMessage, byte[] cryptKey, byte[] authKey, byte[] nonSecretPayload = null)
    {
      //User Error Checks
      if (cryptKey == null || cryptKey.Length != KeyBitSize / 8)
        throw new ArgumentException(String.Format("Key needs to be {0} bit!", KeyBitSize), "cryptKey");

      if (authKey == null || authKey.Length != KeyBitSize / 8)
        throw new ArgumentException(String.Format("Key needs to be {0} bit!", KeyBitSize), "authKey");

      if (secretMessage == null || secretMessage.Length < 1)
        throw new ArgumentException("Secret Message Required!", "secretMessage");

      //non-secret payload optional
      nonSecretPayload = nonSecretPayload ?? new byte[] { };

      byte[] cipherText;
      byte[] iv;

      using (var aes = new AesManaged
      {
        KeySize = KeyBitSize,
        BlockSize = BlockBitSize,
        Mode = CipherMode.CBC,
        Padding = PaddingMode.PKCS7
      })
      {

        //Use random IV
        aes.GenerateIV();
        iv = aes.IV;

        using (var encrypter = aes.CreateEncryptor(cryptKey, iv))
        using (var cipherStream = new MemoryStream())
        {
          using (var cryptoStream = new CryptoStream(cipherStream, encrypter, CryptoStreamMode.Write))
          using (var binaryWriter = new BinaryWriter(cryptoStream))
          {
            //Encrypt Data
            binaryWriter.Write(secretMessage);
          }

          cipherText = cipherStream.ToArray();
        }

      }

      //Assemble encrypted message and add authentication
      using (var hmac = new HMACSHA256(authKey))
      using (var encryptedStream = new MemoryStream())
      {
        using (var binaryWriter = new BinaryWriter(encryptedStream))
        {
          //Prepend non-secret payload if any
          binaryWriter.Write(nonSecretPayload);
          //Prepend IV
          binaryWriter.Write(iv);
          //Write Ciphertext
          binaryWriter.Write(cipherText);
          binaryWriter.Flush();

          //Authenticate all data
          var tag = hmac.ComputeHash(encryptedStream.ToArray());
          //Postpend tag
          binaryWriter.Write(tag);
        }
        return encryptedStream.ToArray();
      }

    }

    public static byte[] SimpleDecrypt(byte[] encryptedMessage, byte[] cryptKey, byte[] authKey, int nonSecretPayloadLength = 0)
    {

      //Basic Usage Error Checks
      if (cryptKey == null || cryptKey.Length != KeyBitSize / 8)
        throw new ArgumentException(String.Format("CryptKey needs to be {0} bit!", KeyBitSize), "cryptKey");

      if (authKey == null || authKey.Length != KeyBitSize / 8)
        throw new ArgumentException(String.Format("AuthKey needs to be {0} bit!", KeyBitSize), "authKey");

      if (encryptedMessage == null || encryptedMessage.Length == 0)
        throw new ArgumentException("Encrypted Message Required!", "encryptedMessage");

      using (var hmac = new HMACSHA256(authKey))
      {
        var sentTag = new byte[hmac.HashSize / 8];
        //Calculate Tag
        var calcTag = hmac.ComputeHash(encryptedMessage, 0, encryptedMessage.Length - sentTag.Length);
        var ivLength = (BlockBitSize / 8);

        //if message length is to small just return null
        if (encryptedMessage.Length < sentTag.Length + nonSecretPayloadLength + ivLength)
          return null;

        //Grab Sent Tag
        Array.Copy(encryptedMessage, encryptedMessage.Length - sentTag.Length, sentTag, 0, sentTag.Length);

        //Compare Tag with constant time comparison
        var compare = 0;
        for (var i = 0; i < sentTag.Length; i++)
          compare |= sentTag[i] ^ calcTag[i]; 

        //if message doesn't authenticate return null
        if (compare != 0)
          return null;

        using (var aes = new AesManaged
        {
          KeySize = KeyBitSize,
          BlockSize = BlockBitSize,
          Mode = CipherMode.CBC,
          Padding = PaddingMode.PKCS7
        })
        {

          //Grab IV from message
          var iv = new byte[ivLength];
          Array.Copy(encryptedMessage, nonSecretPayloadLength, iv, 0, iv.Length);

          using (var decrypter = aes.CreateDecryptor(cryptKey, iv))
          using (var plainTextStream = new MemoryStream())
          {
            using (var decrypterStream = new CryptoStream(plainTextStream, decrypter, CryptoStreamMode.Write))
            using (var binaryWriter = new BinaryWriter(decrypterStream))
            {
              //Decrypt Cipher Text from Message
              binaryWriter.Write(
                encryptedMessage,
                nonSecretPayloadLength + iv.Length,
                encryptedMessage.Length - nonSecretPayloadLength - iv.Length - sentTag.Length
              );
            }
            //Return Plain Text
            return plainTextStream.ToArray();
          }
        }
      }
    }

    public static byte[] SimpleEncryptWithPassword(byte[] secretMessage, string password, byte[] nonSecretPayload = null)
    {
      nonSecretPayload = nonSecretPayload ?? new byte[] {};

      //User Error Checks
      if (string.IsNullOrWhiteSpace(password) || password.Length < MinPasswordLength)
        throw new ArgumentException(String.Format("Must have a password of at least {0} characters!", MinPasswordLength), "password");

      if (secretMessage == null || secretMessage.Length ==0)
        throw new ArgumentException("Secret Message Required!", "secretMessage");

      var payload = new byte[((SaltBitSize / 8) * 2) + nonSecretPayload.Length];

      Array.Copy(nonSecretPayload, payload, nonSecretPayload.Length);
      int payloadIndex = nonSecretPayload.Length;

      byte[] cryptKey;
      byte[] authKey;
      //Use Random Salt to prevent pre-generated weak password attacks.
      using (var generator = new Rfc2898DeriveBytes(password, SaltBitSize / 8, Iterations))
      {
        var salt = generator.Salt;

        //Generate Keys
        cryptKey = generator.GetBytes(KeyBitSize / 8);

        //Create Non Secret Payload
        Array.Copy(salt, 0, payload, payloadIndex, salt.Length);
        payloadIndex += salt.Length;
      }

      //Deriving separate key, might be less efficient than using HKDF, 
      //but now compatible with RNEncryptor which had a very similar wireformat and requires less code than HKDF.
      using (var generator = new Rfc2898DeriveBytes(password, SaltBitSize / 8, Iterations))
      {
        var salt = generator.Salt;

        //Generate Keys
        authKey = generator.GetBytes(KeyBitSize / 8);

        //Create Rest of Non Secret Payload
        Array.Copy(salt, 0, payload, payloadIndex, salt.Length);
      }

      return SimpleEncrypt(secretMessage, cryptKey, authKey, payload);
    }

    public static byte[] SimpleDecryptWithPassword(byte[] encryptedMessage, string password, int nonSecretPayloadLength = 0)
    {
      //User Error Checks
      if (string.IsNullOrWhiteSpace(password) || password.Length < MinPasswordLength)
        throw new ArgumentException(String.Format("Must have a password of at least {0} characters!", MinPasswordLength), "password");

      if (encryptedMessage == null || encryptedMessage.Length == 0)
        throw new ArgumentException("Encrypted Message Required!", "encryptedMessage");

      var cryptSalt = new byte[SaltBitSize / 8];
      var authSalt = new byte[SaltBitSize / 8];

      //Grab Salt from Non-Secret Payload
      Array.Copy(encryptedMessage, nonSecretPayloadLength, cryptSalt, 0, cryptSalt.Length);
      Array.Copy(encryptedMessage, nonSecretPayloadLength + cryptSalt.Length, authSalt, 0, authSalt.Length);

      byte[] cryptKey;
      byte[] authKey;

      //Generate crypt key
      using (var generator = new Rfc2898DeriveBytes(password, cryptSalt, Iterations))
      {
        cryptKey = generator.GetBytes(KeyBitSize / 8);
      }
      //Generate auth key
      using (var generator = new Rfc2898DeriveBytes(password, authSalt, Iterations))
      {
        authKey = generator.GetBytes(KeyBitSize / 8);
      }

      return SimpleDecrypt(encryptedMessage, cryptKey, authKey, cryptSalt.Length + authSalt.Length + nonSecretPayloadLength);
    }
  }
}

বাউন্সি ক্যাসেল এইএস-জিসিএম [সংক্ষেপে]

/*
 * This work (Modern Encryption of a String C#, by James Tuley), 
 * identified by James Tuley, is free of known copyright restrictions.
 * https://gist.github.com/4336842
 * http://creativecommons.org/publicdomain/mark/1.0/ 
 */

using System;
using System.IO;
using System.Text;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Generators;
using Org.BouncyCastle.Crypto.Modes;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Security;
namespace Encryption
{

  public static class AESGCM
  {
    private static readonly SecureRandom Random = new SecureRandom();

    //Preconfigured Encryption Parameters
    public static readonly int NonceBitSize = 128;
    public static readonly int MacBitSize = 128;
    public static readonly int KeyBitSize = 256;

    //Preconfigured Password Key Derivation Parameters
    public static readonly int SaltBitSize = 128;
    public static readonly int Iterations = 10000;
    public static readonly int MinPasswordLength = 12;


    /// <summary>
    /// Helper that generates a random new key on each call.
    /// </summary>
    /// <returns></returns>
    public static byte[] NewKey()
    {
      var key = new byte[KeyBitSize / 8];
      Random.NextBytes(key);
      return key;
    }

    /// <summary>
    /// Simple Encryption And Authentication (AES-GCM) of a UTF8 string.
    /// </summary>
    /// <param name="secretMessage">The secret message.</param>
    /// <param name="key">The key.</param>
    /// <param name="nonSecretPayload">Optional non-secret payload.</param>
    /// <returns>
    /// Encrypted Message
    /// </returns>
    /// <exception cref="System.ArgumentException">Secret Message Required!;secretMessage</exception>
    /// <remarks>
    /// Adds overhead of (Optional-Payload + BlockSize(16) + Message +  HMac-Tag(16)) * 1.33 Base64
    /// </remarks>
    public static string SimpleEncrypt(string secretMessage, byte[] key, byte[] nonSecretPayload = null)
    {
      if (string.IsNullOrEmpty(secretMessage))
        throw new ArgumentException("Secret Message Required!", "secretMessage");

      var plainText = Encoding.UTF8.GetBytes(secretMessage);
      var cipherText = SimpleEncrypt(plainText, key, nonSecretPayload);
      return Convert.ToBase64String(cipherText);
    }


    /// <summary>
    /// Simple Decryption & Authentication (AES-GCM) of a UTF8 Message
    /// </summary>
    /// <param name="encryptedMessage">The encrypted message.</param>
    /// <param name="key">The key.</param>
    /// <param name="nonSecretPayloadLength">Length of the optional non-secret payload.</param>
    /// <returns>Decrypted Message</returns>
    public static string SimpleDecrypt(string encryptedMessage, byte[] key, int nonSecretPayloadLength = 0)
    {
      if (string.IsNullOrEmpty(encryptedMessage))
        throw new ArgumentException("Encrypted Message Required!", "encryptedMessage");

      var cipherText = Convert.FromBase64String(encryptedMessage);
      var plainText = SimpleDecrypt(cipherText, key, nonSecretPayloadLength);
      return plainText == null ? null : Encoding.UTF8.GetString(plainText);
    }

    /// <summary>
    /// Simple Encryption And Authentication (AES-GCM) of a UTF8 String
    /// using key derived from a password (PBKDF2).
    /// </summary>
    /// <param name="secretMessage">The secret message.</param>
    /// <param name="password">The password.</param>
    /// <param name="nonSecretPayload">The non secret payload.</param>
    /// <returns>
    /// Encrypted Message
    /// </returns>
    /// <remarks>
    /// Significantly less secure than using random binary keys.
    /// Adds additional non secret payload for key generation parameters.
    /// </remarks>
    public static string SimpleEncryptWithPassword(string secretMessage, string password,
                             byte[] nonSecretPayload = null)
    {
      if (string.IsNullOrEmpty(secretMessage))
        throw new ArgumentException("Secret Message Required!", "secretMessage");

      var plainText = Encoding.UTF8.GetBytes(secretMessage);
      var cipherText = SimpleEncryptWithPassword(plainText, password, nonSecretPayload);
      return Convert.ToBase64String(cipherText);
    }


    /// <summary>
    /// Simple Decryption and Authentication (AES-GCM) of a UTF8 message
    /// using a key derived from a password (PBKDF2)
    /// </summary>
    /// <param name="encryptedMessage">The encrypted message.</param>
    /// <param name="password">The password.</param>
    /// <param name="nonSecretPayloadLength">Length of the non secret payload.</param>
    /// <returns>
    /// Decrypted Message
    /// </returns>
    /// <exception cref="System.ArgumentException">Encrypted Message Required!;encryptedMessage</exception>
    /// <remarks>
    /// Significantly less secure than using random binary keys.
    /// </remarks>
    public static string SimpleDecryptWithPassword(string encryptedMessage, string password,
                             int nonSecretPayloadLength = 0)
    {
      if (string.IsNullOrWhiteSpace(encryptedMessage))
        throw new ArgumentException("Encrypted Message Required!", "encryptedMessage");

      var cipherText = Convert.FromBase64String(encryptedMessage);
      var plainText = SimpleDecryptWithPassword(cipherText, password, nonSecretPayloadLength);
      return plainText == null ? null : Encoding.UTF8.GetString(plainText);
    }

    public static byte[] SimpleEncrypt(byte[] secretMessage, byte[] key, byte[] nonSecretPayload = null)
    {
      //User Error Checks
      if (key == null || key.Length != KeyBitSize / 8)
        throw new ArgumentException(String.Format("Key needs to be {0} bit!", KeyBitSize), "key");

      if (secretMessage == null || secretMessage.Length == 0)
        throw new ArgumentException("Secret Message Required!", "secretMessage");

      //Non-secret Payload Optional
      nonSecretPayload = nonSecretPayload ?? new byte[] { };

      //Using random nonce large enough not to repeat
      var nonce = new byte[NonceBitSize / 8];
      Random.NextBytes(nonce, 0, nonce.Length);

      var cipher = new GcmBlockCipher(new AesFastEngine());
      var parameters = new AeadParameters(new KeyParameter(key), MacBitSize, nonce, nonSecretPayload);
      cipher.Init(true, parameters);

      //Generate Cipher Text With Auth Tag
      var cipherText = new byte[cipher.GetOutputSize(secretMessage.Length)];
      var len = cipher.ProcessBytes(secretMessage, 0, secretMessage.Length, cipherText, 0);
      cipher.DoFinal(cipherText, len);

      //Assemble Message
      using (var combinedStream = new MemoryStream())
      {
        using (var binaryWriter = new BinaryWriter(combinedStream))
        {
          //Prepend Authenticated Payload
          binaryWriter.Write(nonSecretPayload);
          //Prepend Nonce
          binaryWriter.Write(nonce);
          //Write Cipher Text
          binaryWriter.Write(cipherText);
        }
        return combinedStream.ToArray();
      }
    }

    public static byte[] SimpleDecrypt(byte[] encryptedMessage, byte[] key, int nonSecretPayloadLength = 0)
    {
      //User Error Checks
      if (key == null || key.Length != KeyBitSize / 8)
        throw new ArgumentException(String.Format("Key needs to be {0} bit!", KeyBitSize), "key");

      if (encryptedMessage == null || encryptedMessage.Length == 0)
        throw new ArgumentException("Encrypted Message Required!", "encryptedMessage");

      using (var cipherStream = new MemoryStream(encryptedMessage))
      using (var cipherReader = new BinaryReader(cipherStream))
      {
        //Grab Payload
        var nonSecretPayload = cipherReader.ReadBytes(nonSecretPayloadLength);

        //Grab Nonce
        var nonce = cipherReader.ReadBytes(NonceBitSize / 8);

        var cipher = new GcmBlockCipher(new AesFastEngine());
        var parameters = new AeadParameters(new KeyParameter(key), MacBitSize, nonce, nonSecretPayload);
        cipher.Init(false, parameters);

        //Decrypt Cipher Text
        var cipherText = cipherReader.ReadBytes(encryptedMessage.Length - nonSecretPayloadLength - nonce.Length);
        var plainText = new byte[cipher.GetOutputSize(cipherText.Length)];  

        try
        {
          var len = cipher.ProcessBytes(cipherText, 0, cipherText.Length, plainText, 0);
          cipher.DoFinal(plainText, len);

        }
        catch (InvalidCipherTextException)
        {
          //Return null if it doesn't authenticate
          return null;
        }

        return plainText;
      }

    }

    public static byte[] SimpleEncryptWithPassword(byte[] secretMessage, string password, byte[] nonSecretPayload = null)
    {
      nonSecretPayload = nonSecretPayload ?? new byte[] {};

      //User Error Checks
      if (string.IsNullOrWhiteSpace(password) || password.Length < MinPasswordLength)
        throw new ArgumentException(String.Format("Must have a password of at least {0} characters!", MinPasswordLength), "password");

      if (secretMessage == null || secretMessage.Length == 0)
        throw new ArgumentException("Secret Message Required!", "secretMessage");

      var generator = new Pkcs5S2ParametersGenerator();

      //Use Random Salt to minimize pre-generated weak password attacks.
      var salt = new byte[SaltBitSize / 8];
      Random.NextBytes(salt);

      generator.Init(
        PbeParametersGenerator.Pkcs5PasswordToBytes(password.ToCharArray()),
        salt,
        Iterations);

      //Generate Key
      var key = (KeyParameter)generator.GenerateDerivedMacParameters(KeyBitSize);

      //Create Full Non Secret Payload
      var payload = new byte[salt.Length + nonSecretPayload.Length];
      Array.Copy(nonSecretPayload, payload, nonSecretPayload.Length);
      Array.Copy(salt,0, payload,nonSecretPayload.Length, salt.Length);

      return SimpleEncrypt(secretMessage, key.GetKey(), payload);
    }

    public static byte[] SimpleDecryptWithPassword(byte[] encryptedMessage, string password, int nonSecretPayloadLength = 0)
    {
      //User Error Checks
      if (string.IsNullOrWhiteSpace(password) || password.Length < MinPasswordLength)
        throw new ArgumentException(String.Format("Must have a password of at least {0} characters!", MinPasswordLength), "password");

      if (encryptedMessage == null || encryptedMessage.Length == 0)
        throw new ArgumentException("Encrypted Message Required!", "encryptedMessage");

      var generator = new Pkcs5S2ParametersGenerator();

      //Grab Salt from Payload
      var salt = new byte[SaltBitSize / 8];
      Array.Copy(encryptedMessage, nonSecretPayloadLength, salt, 0, salt.Length);

      generator.Init(
        PbeParametersGenerator.Pkcs5PasswordToBytes(password.ToCharArray()),
        salt,
        Iterations);

      //Generate Key
      var key = (KeyParameter)generator.GenerateDerivedMacParameters(KeyBitSize);

      return SimpleDecrypt(encryptedMessage, key.GetKey(), salt.Length + nonSecretPayloadLength);
    }
  }
}

7
কোড পর্যালোচনাতে এই নমুনাগুলি পোস্ট করুন ।
jbtule

3
এটি একটি ভাল প্রশ্ন, এগুলি প্রমাণীকরণযুক্ত এনক্রিপশন উদাহরণগুলি ব্যবহার করছে , এনক্রিপ্ট করার পাশাপাশি তাদের কাছে ম্যাক রয়েছে যাচাই করার জন্য মাইক্রো টেক্সট অন্য কারও দ্বারা সংশোধিত হয়নি, এটি প্রাথমিকভাবে নির্বাচিত-সিফেরেক্সটেক্স আক্রমণকে ব্যর্থ করার জন্য । সুতরাং এটি ডিক্রিপ্ট করার সময় ম্যাক গণনা করে এটি অনুমোদনের জন্য সংযুক্ত ব্যক্তির বিরুদ্ধে পরীক্ষা করতে ম্যাক গণনা করে, যদি এটি ডিক্রিপটসকে সত্যতা দেয় এবং যদি এটি বাতিল হয় না।
jbtule

3
ম্যাকের অ্যারে চেকটি প্রতিটি সূচক করে, কারণ একটি টাইমিং অ্যাটাকটি একটি নকল সিফারেক্সটসে নতুন ম্যাক গণনা করতে ব্যবহার করা যেতে পারে যদি এটি মেলে না এমন প্রথম বাইট ফেরত দেয়।
jbtule

5
এটি একটি ভাল বই এবং তুলনামূলকভাবে সাম্প্রতিক। আমি আরও কি সুপারিশ করব তা হল ড্যান বোনেহ- র বিনামূল্যে অনলাইন কোর্স ক্রিপ্টোগ্রাফি । সত্যই ভাল ভিডিও, সত্যই ভাল কোয়েস এবং সত্যই ভাল মেশিন সমস্যাগুলি যা ক্রিপ্টোগ্রাফি ব্যবহারের জন্য একটি ভাল ব্যবহারিক ভিত্ত সরবরাহ করে। AesCryptoServiceProvider এর ক্ষেত্রে আপনি যেটি সবচেয়ে বেশি স্বাচ্ছন্দ্যযুক্ত তা ব্যবহার করা উচিত।
jbtule

8
একটি সুন্দরভাবে বর্ণিত ব্যবহার বিভাগটি অত্যন্ত সহায়ক হবে।
রকলান

108

এখানে আরএসএ ব্যবহার করে একটি উদাহরণ দেওয়া হয়েছে।

গুরুত্বপূর্ণ: আপনি আরএসএ এনক্রিপশন দিয়ে এনক্রিপ্ট করতে পারেন এমন ডেটার আকারের সীমা রয়েছে KeySize - MinimumPaddingযেমন 256 বাইট (2048 বিট কী ধরে) - 42 বাইট (ন্যূনতম OEAP প্যাডিং) = 214 বাইট (সর্বাধিক প্লেইনেক্সট আকার)

আপনার আরএসএ কী দিয়ে আপনার_আরসা_কি প্রতিস্থাপন করুন।

var provider = new System.Security.Cryptography.RSACryptoServiceProvider();
provider.ImportParameters(your_rsa_key);

var encryptedBytes = provider.Encrypt(
    System.Text.Encoding.UTF8.GetBytes("Hello World!"), true);

string decryptedTest = System.Text.Encoding.UTF8.GetString(
    provider.Decrypt(encryptedBytes, true));

আরও তথ্যের জন্য, এমএসডিএন - আরএসএক্রিপ্টোসোসভারপ্রোভিডার দেখুন


7
এই জাতীয় একটি সহজ প্রশ্ন জিজ্ঞাসা করার জন্য দুঃখিত তবে কেউ কি আমাকে বলতে পারেন যে আমি আরএসএ কী পাই বা আমি কীভাবে এটি তৈরি করতে পারি?
আকাশ কাভা

11
আরএসএ কেন? আরএসএর ব্যবহার রয়েছে, তবে কিছুই তাদের কাছে এটি নির্দেশ করে নি।
CodeInChaos

38
এমনকি মূল প্রশ্নে এমন কোনও ইঙ্গিত নেই যা RSAভাল ফিট হতে পারে। অসমমিতিক এনক্রিপশনের এর ব্যবহার রয়েছে তবে এটি ডিফল্ট এনক্রিপশন হিসাবে সঠিক পছন্দ নয়। আপনার উদাহরণ কোডটি দীর্ঘতর স্ট্রিংয়ের জন্য ব্যর্থ হবে কারণ আরএসএ শ্রেণি সাধারণ উদ্দেশ্য এনক্রিপশনের জন্য ডিজাইন করা হয়নি। যদি আপনার অসম বৈশিষ্ট্যগুলির প্রয়োজন হয় তবে আপনার আরএসএ সহ একটি প্রতিসম কীটি এনক্রিপ্ট করতে হবে এবং সেই প্রতিসৃত কী সহ প্রকৃত ডেটা এনক্রিপ্ট করা উচিত। সুতরাং আমি এখনও আপনার উত্তরটি খারাপ পরামর্শ বলে বিশ্বাস করি।
কোডসইনচাউস

9
আমি মুগ্ধ, ভুল উত্তরের জন্য votes০ টি ভোট !!!, কোডস ইন চ্যাওস যেমন এই ধরণের এনক্রিপশনের জন্য বলেছিলেন আপনার একটি সিমিমেট্রিক কী দরকার, একটি এসিমেট্রিক নয়।
অটো ক্যানেলিস

5
এটি একটি ভুল উত্তর নয়, কেবলমাত্র একটি বিশাল ওভারহেড নিয়ে অতি-জটিল ... আরও ভাল ফলাফলের জন্য এইএস / অন্য কোনও প্রতিসামান্য পদ্ধতি ব্যবহার করুন।
টোমর ডব্লু

54

আপনি যদি এএসপি.নেট ব্যবহার করে থাকেন তবে আপনি এখন নেট নেট 4.0.০ এ কার্যক্ষমতায় অন্তর্নির্মিত ব্যবহার করতে পারেন।

System.Web.Security.MachineKey

। নেট 4.5 আছে MachineKey.Protect()এবং MachineKey.Unprotect()

.NET 4.0 এর আছে MachineKey.Encode()এবং MachineKey.Decode()। আপনার কেবলমাত্র 'সমস্ত' এ মেশিনকি প্রোটেকশন সেট করা উচিত।

এএসপি-র বাইরে এই শ্রেণিটি মনে হয় যে প্রতিটি অ্যাপ্লিকেশন রিস্টার্ট দিয়ে কোনও নতুন কী তৈরি হয় যাতে কাজ হয় না। আইএলএসপি-তে একটি তাত্ক্ষণিকভাবে উঁকি দেওয়ার সাথে এটি আমার কাছে দেখে মনে হচ্ছে এটি যথাযথ অ্যাপ্লিকেশন.সেটিংসগুলি অনুপস্থিত থাকলে এটি নিজের ডিফল্ট তৈরি করে। সুতরাং আপনি সম্ভবত এটি এএসপি.নেটের বাইরে সেট আপ করতে সক্ষম হতে পারেন।

আমি সিস্টেমের বাইরে একটি নন-এসএসপি. নেট সমতুল্য খুঁজে পাইনি। ওয়েব নামস্থান।


হুম কেউ আমাকে বলতে পারে কেন এই উত্তরে এত কম ভোট রয়েছে? এটি এএসপি.এনইটি অ্যাপ্লিকেশনগুলির জন্য খুব সুবিধাজনক পদ্ধতির মতো দেখায়
ডার্ক বোয়ার

@ ডার্কবোয়ার প্রশ্নটি জিজ্ঞাসা করার কয়েক বছর পরে কার্যকারিতা যুক্ত হয়েছিল, আমি আজ এই আরও সহজ উপায় আছে তা লোকদের জানাতে এই উত্তরটিতে আমার উত্তর যুক্ত করেছি। এটি কেবলমাত্র এএসপি.নেটের সাথে কিছু অ্যাপ.config-fu ছাড়াও কাজ করে যা আপনি কী করছেন তা যদি না জানেন তবে মোটামুটি বিপজ্জনক।
mattmanser

3
আমার অজ্ঞতা ক্ষমা করুন তবে ওয়েব পৃষ্ঠা থেকে আমি আমার উত্তরটি বের করতে পারি না। যদি আমি একটি মেশিনে একটি স্ট্রিং এনক্রিপ্ট করি তবে এটি একটি ডাটাবেজে লিখুন এবং অন্য মেশিনের সাথে এটি পড়লে আমি কি প্যারামিটারগুলির একই মান হিসাবে দীর্ঘক্ষণ এটিকে ডিক্রিপ্ট করতে সক্ষম হব? সম্ভবত আমি "মেশিনকি" ক্লাস নামটি দ্বারা বিভ্রান্ত হয়েছি
অ্যাড্রিয়ান দাভেল

আরেকটি প্রশ্ন, আমি কি ডাব্লুপিএফ অ্যাপ্লিকেশনটিতে এটি ব্যবহার করতে পারি? এটির কোনও ওয়েব রেফারেন্স নেই, রেফারেন্সটি System.Web এ যুক্ত করা ঠিক কি?
অ্যাড্রিয়ান দাভেল

2
@ অ্যাড্রিয়ানাডাভেল লিঙ্কযুক্ত ডকগুলি অনুসারে, "মেশিনকি এপিআইগুলি কেবলমাত্র একটি এএসপি.নেট অ্যাপ্লিকেশনটিতে ব্যবহার করা উচিত A রাশিয়ান রুলেট
মার্ক সোওল

47

বাউনিসিস্টল .NET- র জন্য একটি দুর্দান্ত ক্রিপ্টো লাইব্রেরি, এটি আপনার প্রকল্পগুলিতে ইনস্টল করার জন্য একটি নুগেট প্যাকেজ হিসাবে উপলব্ধ । সিস্টেম.সিকিউরিটি.ক্রিপ্টোগ্রাফি লাইব্রেরিতে বর্তমানে যা পাওয়া যায় তার থেকে আমার এটি অনেক বেশি পছন্দ হয়। এটি আপনাকে উপলভ্য অ্যালগরিদমের ক্ষেত্রে অনেক বেশি বিকল্প দেয় এবং সেই অ্যালগোরিদমগুলির জন্য আরও মোড সরবরাহ করে।

এটি টু ফিশ বাস্তবায়নের একটি উদাহরণ , যা ব্রুস শ্নিয়েয়ার লিখেছিলেন (সেখানে আমাদের মধ্যে সমস্ত বিড়ম্বনার লোকের নায়ক)। এটি রিজান্ডেল (ওরফে এইএস) এর মতো একটি প্রতিসম অ্যালগরিদম। এটি এইএস স্ট্যান্ডার্ডের জন্য তিনটি ফাইনালের একজন এবং ব্রুস শ্নিয়ারের ব্লোফিশ নামে একটি বিখ্যাত বিখ্যাত অ্যালগরিদমকে সহোদর করেছিলেন।

বাউন্সিস্টলের প্রথম জিনিস হ'ল একটি এনক্রিপ্টর শ্রেণি তৈরি করা, এটি লাইব্রেরির মধ্যে অন্যান্য ব্লক সাইফারগুলি প্রয়োগ করা সহজ করে তুলবে। নিম্নলিখিত এনক্রিপটার শ্রেণি একটি জেনেরিক আর্গুমেন্ট টি গ্রহণ করে যেখানে টি আইব্লকসিফার প্রয়োগ করে এবং এতে একটি ডিফল্ট নির্মাতা রয়েছে।

আপডেট: জনপ্রিয় চাহিদার কারণে আমি সিদ্ধান্ত নিয়েছি যে এলোমেলো চতুর্থ উত্পাদন করার পাশাপাশি এইচএমএএকে এই শ্রেণিতে অন্তর্ভুক্ত করব। যদিও শৈলীর দৃষ্টিকোণ থেকে এটি একক দায়বদ্ধতার নীতিবিরোধী, এই শ্রেণীটি এখন দুটি জেনেরিক পরামিতি নেবে, একটি সাইফারের জন্য এবং একটি হজমের জন্য। এটি স্বয়ংক্রিয়ভাবে ভাল আরএনজি এনট্রপি সরবরাহের জন্য আরএনজিক্রিপ্টো সার্ভিসপ্রোভাডার ব্যবহার করে আইভি উত্পন্ন করে এবং ম্যাক জেনারেট করতে বাউরেন্স্যাসল থেকে আপনি যা ডাইজেস্ট অ্যালগরিদম চান তা ব্যবহার করার অনুমতি দেয়।

using System;
using System.Security.Cryptography;
using System.Text;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Macs;
using Org.BouncyCastle.Crypto.Modes;
using Org.BouncyCastle.Crypto.Paddings;
using Org.BouncyCastle.Crypto.Parameters;

public sealed class Encryptor<TBlockCipher, TDigest>
    where TBlockCipher : IBlockCipher, new()
    where TDigest : IDigest, new()
{
    private Encoding encoding;

    private IBlockCipher blockCipher;

    private BufferedBlockCipher cipher;

    private HMac mac;

    private byte[] key;

    public Encryptor(Encoding encoding, byte[] key, byte[] macKey)
    {
        this.encoding = encoding;
        this.key = key;
        this.Init(key, macKey, new Pkcs7Padding());
    }

    public Encryptor(Encoding encoding, byte[] key, byte[] macKey, IBlockCipherPadding padding)
    {
        this.encoding = encoding;
        this.key = key;
        this.Init(key, macKey, padding);
    }

    private void Init(byte[] key, byte[] macKey, IBlockCipherPadding padding)
    {
        this.blockCipher = new CbcBlockCipher(new TBlockCipher());
        this.cipher = new PaddedBufferedBlockCipher(this.blockCipher, padding);
        this.mac = new HMac(new TDigest());
        this.mac.Init(new KeyParameter(macKey));
    }

    public string Encrypt(string plain)
    {
        return Convert.ToBase64String(EncryptBytes(plain));
    }

    public byte[] EncryptBytes(string plain)
    {
        byte[] input = this.encoding.GetBytes(plain);

        var iv = this.GenerateIV();

        var cipher = this.BouncyCastleCrypto(true, input, new ParametersWithIV(new KeyParameter(key), iv));
        byte[] message = CombineArrays(iv, cipher);

        this.mac.Reset();
        this.mac.BlockUpdate(message, 0, message.Length);
        byte[] digest = new byte[this.mac.GetUnderlyingDigest().GetDigestSize()];
        this.mac.DoFinal(digest, 0);

        var result = CombineArrays(digest, message);
        return result;
    }

    public byte[] DecryptBytes(byte[] bytes)
    {
        // split the digest into component parts
        var digest = new byte[this.mac.GetUnderlyingDigest().GetDigestSize()];
        var message = new byte[bytes.Length - digest.Length];
        var iv = new byte[this.blockCipher.GetBlockSize()];
        var cipher = new byte[message.Length - iv.Length];

        Buffer.BlockCopy(bytes, 0, digest, 0, digest.Length);
        Buffer.BlockCopy(bytes, digest.Length, message, 0, message.Length);
        if (!IsValidHMac(digest, message))
        {
            throw new CryptoException();
        }

        Buffer.BlockCopy(message, 0, iv, 0, iv.Length);
        Buffer.BlockCopy(message, iv.Length, cipher, 0, cipher.Length);

        byte[] result = this.BouncyCastleCrypto(false, cipher, new ParametersWithIV(new KeyParameter(key), iv));
        return result;
    }

    public string Decrypt(byte[] bytes)
    {
        return this.encoding.GetString(DecryptBytes(bytes));
    }

    public string Decrypt(string cipher)
    {
        return this.Decrypt(Convert.FromBase64String(cipher));
    }

    private bool IsValidHMac(byte[] digest, byte[] message)
    {
        this.mac.Reset();
        this.mac.BlockUpdate(message, 0, message.Length);
        byte[] computed = new byte[this.mac.GetUnderlyingDigest().GetDigestSize()];
        this.mac.DoFinal(computed, 0);

        return AreEqual(digest,computed);
    }

    private static bool AreEqual(byte [] digest, byte[] computed)
    {
        if(digest.Length != computed.Length)
        {
            return false;
        }

        int result = 0;
        for (int i = 0; i < digest.Length; i++)
        {
            // compute equality of all bytes before returning.
            //   helps prevent timing attacks: 
            //   https://codahale.com/a-lesson-in-timing-attacks/
            result |= digest[i] ^ computed[i];
        }

        return result == 0;
    }

    private byte[] BouncyCastleCrypto(bool forEncrypt, byte[] input, ICipherParameters parameters)
    {
        try
        {
            cipher.Init(forEncrypt, parameters);

            return this.cipher.DoFinal(input);
        }
        catch (CryptoException)
        {
            throw;
        }
    }

    private byte[] GenerateIV()
    {
        using (var provider = new RNGCryptoServiceProvider())
        {
            // 1st block
            byte[] result = new byte[this.blockCipher.GetBlockSize()];
            provider.GetBytes(result);

            return result;
        }
    }

    private static byte[] CombineArrays(byte[] source1, byte[] source2)
    {
        byte[] result = new byte[source1.Length + source2.Length];
        Buffer.BlockCopy(source1, 0, result, 0, source1.Length);
        Buffer.BlockCopy(source2, 0, result, source1.Length, source2.Length);

        return result;
    }
}

এরপরে নতুন ক্লাসে এনক্রিপ্ট এবং ডিক্রিপ্ট পদ্ধতিগুলি কল করুন, এখানে টোফিশ ব্যবহার করে উদাহরণ দেওয়া হল:

var encrypt = new Encryptor<TwofishEngine, Sha1Digest>(Encoding.UTF8, key, hmacKey);

string cipher = encrypt.Encrypt("TEST");   
string plainText = encrypt.Decrypt(cipher);

ট্রিপলডিএস এর মতো অন্য একটি ব্লক সাইফারকে বিকল্প হিসাবে স্থাপন করা ঠিক তত সহজ:

var des = new Encryptor<DesEdeEngine, Sha1Digest>(Encoding.UTF8, key, hmacKey);

string cipher = des.Encrypt("TEST");
string plainText = des.Decrypt(cipher);

অবশেষে যদি আপনি SHA256 HMAC এর সাথে AES ব্যবহার করতে চান তবে আপনি নিম্নলিখিতটি করতে পারেন:

var aes = new Encryptor<AesEngine, Sha256Digest>(Encoding.UTF8, key, hmacKey);

cipher = aes.Encrypt("TEST");
plainText = aes.Decrypt(cipher);

এনক্রিপশন সম্পর্কে কঠোর অংশটি মূলত কীগুলির সাথে সম্পর্কিত হয় অ্যালগরিদমগুলিতে নয়। আপনার কীগুলি কোথায় সংরক্ষণ করবেন সে সম্পর্কে আপনাকে ভাবতে হবে এবং যদি আপনাকে তা করতে হয় তবে কীভাবে এগুলি বিনিময় করবেন। এই অ্যালগরিদমগুলি সমস্তই সময়ের পরীক্ষার বিরুদ্ধে লড়াই করে, এবং বিরতিতে অত্যন্ত শক্ত। যে কেউ আপনার কাছ থেকে তথ্য চুরি করতে চায় সে আপনার বার্তাগুলিতে ক্রিপ্ট্যানালাইসিস করে অনন্তকাল ব্যয় করবে না, তারা কী বা কোথায় তা বোঝার চেষ্টা করতে চলেছে। সুতরাং # 1 আপনার কীগুলি বুদ্ধিমানের সাথে বেছে নিন, # 2 এগুলিকে একটি নিরাপদ স্থানে সংরক্ষণ করুন, যদি আপনি একটি ওয়েবকনফিগ এবং আইআইএস ব্যবহার করেন তবে আপনি ওয়েবকনফিগের কিছু অংশ এনক্রিপ্ট করতে পারবেন এবং শেষ পর্যন্ত যদি কীগুলি বিনিময় করতে হয় তা নিশ্চিত করে নিন যে আপনার কী এক্সচেঞ্জের জন্য প্রোটোকল নিরাপদ।

সময়োপযোগী আক্রমণগুলির বিরুদ্ধে প্রশমিত করার জন্য আপডেট 2 পরিবর্তিত তুলনা পদ্ধতিটি। এখানে আরও তথ্য দেখুন http://codahale.com/a-lesson-in-timing-attacks/ । এছাড়াও PKCS7 প্যাডিংয়ে ডিফল্ট হিসাবে আপডেট হয়েছে এবং শেষ ব্যবহারকারীকে কোন প্যাডিং ব্যবহার করতে চান তা চয়ন করার সুযোগ দেওয়ার জন্য নতুন কনস্ট্রাক্টর যুক্ত করেছেন। পরামর্শের জন্য @ কোডস ইনচাউসকে ধন্যবাদ।


3
1) এই শ্রেণিটি ব্যবহার করতে বেশ বিরক্তিকর কারণ আপনি চতুর্থ পরিচালনার বোঝা ব্যবহারকারীর উপর চাপিয়ে দিয়েছেন যিনি প্রায় অবশ্যই ভুল হয়ে যাবেন। 2) ম্যাকের অভাব এটিকে প্যাডিং ওরাকলগুলির পক্ষে ঝুঁকিপূর্ণ করে তোলে।
কোডসইনচাউস

3
1) আপনার প্যাডিং আমার কাছে ভাঙা লাগছে। আপনি একটি শূন্য প্যাডিং যুক্ত করুন এবং এটি সরাবেন না। জিরো প্যাডিং একটি খারাপ ধারণা কারণ এটি নির্ভরযোগ্যভাবে সরানো যায় না। পরিবর্তে পিকেসিএস # 7 প্যাডিং ব্যবহার করুন। আমি আশা করি বাউন্সিস্টল এনক্রিপশন / ডিক্রিপশন ফাংশনটি ইতিমধ্যে এটি সমর্থন করে। 2) আপনার ম্যাকটি বৈধ করার জন্য একটি ধ্রুবক সময়ের তুলনা ব্যবহার করা উচিত, না SequenceEqual। এটি এমন একটি সময় পার্শ্ব-চ্যানেল এড়িয়ে যায় যা উপস্থাপিত ম্যাক এবং প্রকৃত ম্যাক ম্যাচের উপসর্গটি কতক্ষণ ফাঁস করে দেয়।
কোডসইনচওস

2
@ কোডস ইনচ্যাওস আমি সম্মত, এটি পরীক্ষা করার জন্য ধন্যবাদ আমি এই দু'টি সমস্যা সমাধানের জন্য একটি সম্পাদনা করেছি। - নার্দিবার্ডো
নার্ডিবার্ডো

দুর্দান্ত উত্তর, কেবল একটি প্রশ্ন .... কী এবং hmacKey হবে, আমি ক্রিপ্টো নতুন ... ধন্যবাদ!
তেরখোস

1
@ টারখোস আপনার আরএনজিক্রিপ্টো সার্ভিস প্রোভাইডারের মতো কী তৈরির জন্য একটি সুরক্ষিত র্যান্ডম নম্বর জেনারেটর ব্যবহার করা উচিত, আপনার কখনও পাসফ্রেজ বা অনুমানযোগ্য কিছু ব্যবহার করা উচিত নয়। আপনার অ্যালগোরিদম যে সর্বাধিক দৈর্ঘ্যটি প্রদান করবে তা ব্যবহার করতে হবে উদাহরণস্বরূপ এএসই 256 এমন একটি মূল আকার ব্যবহার করে যা দৈর্ঘ্যে 256 বিট হয় তাই 32 এলোমেলো বাইট সর্বোত্তম হয়, এইচএমএসি কী আকারগুলি সাধারণত শ্যাও 2 (অ্যালগরিদমের আকারের উপর ভিত্তি করে থাকে) 256) একটি সুরক্ষিত এলোমেলো সংখ্যা জেনারেটর দ্বারা উত্পাদিত একটি 256 বিট কী যথেষ্ট। কীগুলি প্রায়শই পরিবর্তন করুন! আরো প্রায়ই ভাল!
nerdybeardo

18

দাবি অস্বীকার: এই সমাধানটি কেবলমাত্র বিশ্রামে থাকা ডেটার জন্য ব্যবহার করা উচিত যা জনসাধারণের সামনে প্রকাশিত হয় না (উদাহরণস্বরূপ - একটি কনফিগারেশন ফাইল বা ডিবি)। কেবলমাত্র এই দৃশ্যে, দ্রুত এবং নোংরা সমাধান কম রক্ষণাবেক্ষণের কারণে @ jbtule এর সমাধানের চেয়ে ভাল হিসাবে বিবেচনা করা যেতে পারে।

মূল পোস্ট: আমি দ্রুত এবং নোংরা সুরক্ষিত এইএস স্ট্রিং এনক্রিপশনের জন্য জবিটুলের উত্তরটি কিছুটা জটিল পেয়েছি এবং ব্রেটের উত্তর একটি বাগ ছিল যা ইনিশিয়েশন ভেক্টর একটি নির্দিষ্ট মান হিসাবে এটি প্যাডিং আক্রমণগুলির জন্য ঝুঁকিপূর্ণ করে তুলেছে, তাই আমি ব্রেটের কোড এবং সংশোধন করেছি চিপার্ড স্ট্রিংয়ের সাথে যুক্ত একটি এলোমেলো IV যুক্ত করে, একই মানের প্রতিটি এনক্রিপ্ট করা মান তৈরি করে:

জোড়া লাগানো:

public static string Encrypt(string clearText)
{            
    byte[] clearBytes = Encoding.Unicode.GetBytes(clearText);
    using (Aes encryptor = Aes.Create())
    {
        byte[] IV = new byte[15];
        rand.NextBytes(IV);
        Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, IV);
        encryptor.Key = pdb.GetBytes(32);
        encryptor.IV = pdb.GetBytes(16);
        using (MemoryStream ms = new MemoryStream())
        {
            using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write))
            {
                cs.Write(clearBytes, 0, clearBytes.Length);
                cs.Close();
            }
            clearText = Convert.ToBase64String(IV) + Convert.ToBase64String(ms.ToArray());
        }
    }
    return clearText;
}

ডিক্রিপশন:

public static string Decrypt(string cipherText)
{
    byte[] IV = Convert.FromBase64String(cipherText.Substring(0, 20));
    cipherText = cipherText.Substring(20).Replace(" ", "+");
    byte[] cipherBytes = Convert.FromBase64String(cipherText);
    using (Aes encryptor = Aes.Create())
    {
        Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, IV);
        encryptor.Key = pdb.GetBytes(32);
        encryptor.IV = pdb.GetBytes(16);
        using (MemoryStream ms = new MemoryStream())
        {
            using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write))
            {
                cs.Write(cipherBytes, 0, cipherBytes.Length);
                cs.Close();
            }
            cipherText = Encoding.Unicode.GetString(ms.ToArray());
        }
    }
    return cipherText;
}

আপনার কী দিয়ে এনক্রিপশনকিকে প্রতিস্থাপন করুন। আমার বাস্তবায়নে, কীটি কনফিগারেশন ফাইলে সংরক্ষণ করা হচ্ছে (ওয়েবকনফিগ \ অ্যাপ.config) আপনার এটিকে হার্ড কোডড না করে সংরক্ষণ করা উচিত। কনফিগারেশন ফাইলটি এনক্রিপ্ট করা উচিত যাতে কী এতে পরিষ্কার পাঠ্য হিসাবে সংরক্ষণ না হয়।

protected static string _Key = "";
protected static string EncryptionKey
{
    get
    {
        if (String.IsNullOrEmpty(_Key))
        {
            _Key = ConfigurationManager.AppSettings["AESKey"].ToString();
        }

        return _Key;
    }
}

1
আপনার Encryptপদ্ধতিটি একই কলম পাঠ্য সহ প্রতিটি কলের জন্য আলাদা মান উত্পন্ন করার Substring(20)সময়, প্রতিবার একই হবে, তাই না?
ডাব স্টাইলি

"একই" বলতে কী বোঝ? ডিক্রিপ্ট ফাংশন এনক্রিপশন ফাংশন দ্বারা উত্পন্ন প্রতিটি মান গ্রহণ করে, এটি আরম্ভের ভেক্টর এবং এনক্রিপ্ট করা মানকে পৃথক করে এবং ডিক্রিপ্ট করে
গিল কোহেন

1
আমি লক্ষ্য করি না যে Encryptপ্রতিবার উত্পন্ন আলাদা আইভি তৈরি হয়েছে। কিছু কারণে আমি ভেবেছিলাম প্রতিবার আইভি একই ছিল যা মূলত এটি অর্থহীন করে তুলবে।
ডাব স্টাইলি

1
@ গিলকোহেন ভাল এটির উপর একটি বড় দাবি অস্বীকার করুন এবং বিশ্রামে কেবলমাত্র ডেটা ব্যবহারের জন্য বলুন, কোনও পরিষেবা দিয়ে প্রকাশ করবেন না এবং তারপরে আপনি ঝুঁকি ব্যবস্থাপনার দাবি করতে পারেন। তবে আপনার দ্রুত এবং নোংরা কেবল slালু। উদাহরণস্বরূপ আপনি কেন কেবল ডিক্রিপ্টে প্লাস চিহ্নগুলি দিয়ে ফাঁকা স্থানগুলি প্রতিস্থাপন করেন এবং বিপরীতে নয়, এটি পাওয়ার আগেই কি অন্য কিছু সিফারেক্সটকে সংশোধন করছে? কোনও ইউআরএল ক্যোয়ারী স্ট্রিংয়ের মধ্য দিয়ে যাওয়ার মতো, কুকি বা ফর্ম ভেরিয়েবল, এইচএমএম, এটি একটি পরিষেবার মতো শোনাচ্ছে, যা যখন আপনি একটি সাইফার পাঠ্যকে অনুমোদনের প্রয়োজন তখন একেবারে হয় ।
jbtule

2
@jbtule আসলে না, এটি কোনও কারণে বেস 64 ফাংশনের এনকোডিং। এটি প্রকৃতপক্ষে বিশ্রামের ডেটার জন্য ব্যবহৃত হয়েছিল এবং আমি আপনার মন্তব্যের সাথে একমত হই। আমি এটি যুক্ত করব।
গিল কোহেন

12

জোড়া লাগানো

public string EncryptString(string inputString)
{
    MemoryStream memStream = null;
    try
    {
        byte[] key = { };
        byte[] IV = { 12, 21, 43, 17, 57, 35, 67, 27 };
        string encryptKey = "aXb2uy4z"; // MUST be 8 characters
        key = Encoding.UTF8.GetBytes(encryptKey);
        byte[] byteInput = Encoding.UTF8.GetBytes(inputString);
        DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
        memStream = new MemoryStream();
        ICryptoTransform transform = provider.CreateEncryptor(key, IV);
        CryptoStream cryptoStream = new CryptoStream(memStream, transform, CryptoStreamMode.Write);
        cryptoStream.Write(byteInput, 0, byteInput.Length);
        cryptoStream.FlushFinalBlock();
    }
    catch (Exception ex)
    {
        Response.Write(ex.Message);
    }
    return Convert.ToBase64String(memStream.ToArray());
}

ডিক্রিপশন:

public string DecryptString(string inputString)
{
    MemoryStream memStream = null;
    try
    {
        byte[] key = { };
        byte[] IV = { 12, 21, 43, 17, 57, 35, 67, 27 };
        string encryptKey = "aXb2uy4z"; // MUST be 8 characters
        key = Encoding.UTF8.GetBytes(encryptKey);
        byte[] byteInput = new byte[inputString.Length];
        byteInput = Convert.FromBase64String(inputString);
        DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
        memStream = new MemoryStream();
        ICryptoTransform transform = provider.CreateDecryptor(key, IV);
        CryptoStream cryptoStream = new CryptoStream(memStream, transform, CryptoStreamMode.Write);
        cryptoStream.Write(byteInput, 0, byteInput.Length);
        cryptoStream.FlushFinalBlock();
    }
    catch (Exception ex)
    {
        Response.Write(ex.Message);
    }

    Encoding encoding1 = Encoding.UTF8;
    return encoding1.GetString(memStream.ToArray());
}

8
-1 এটি খুব দুর্বল। 1) ডিইএস একটি 56 বিট কী থাকা শক্তিকে জোর করা সহজ। 2) একটি কী বাইনারি, ইউটিএফ 8 নয়। যদি কীটিতে ASCII অক্ষর থাকে (অনুশীলনের ক্ষেত্রে সম্ভবত) থাকে তবে এটি কার্যকর কী আকারটিকে 48 বিটে হ্রাস করে। 3) প্রতিটি বার্তার জন্য একটি IV আলাদা হওয়া উচিত 4) ম্যাকের অভাব আপনাকে প্যাডিং ওরাকলগুলি সহ সক্রিয় আক্রমণগুলিতে উন্মুক্ত করে।
কোডসইনচাউস

9
সর্বাধিক স্ট্রিংহটের প্রয়োজন ছাড়াই +1 ওপির একটি খুব সাধারণ প্রশ্ন ছিল এবং এই উত্তরটি পুরোপুরি তার সাথে মিলে। কমপক্ষে আমি এটি ব্যবহার করতে পারি কারণ এনক্রিপশনের জন্য আমারও সাধারণ ব্যবহার রয়েছে।
Roland

-1 @ রোল্যান্ড কোডসইনহাউস দ্বারা উল্লিখিত হিসাবে প্রতিটি বার্তার জন্য চতুর্থ বারের আলাদা হওয়া দরকার, খুব সহজভাবে, যদি তা না হয় তবে আপনি ভুলভাবে এপিআই ব্যবহার করছেন, সুতরাং এই কোডটি কখনও ব্যবহার করা উচিত নয়। সময়কাল। 48 বিবিট কীটি কেবল একদিনে চাবি ব্যতীত কারও কাছে এই ডিক্রিপ্টযোগ্য করে তোলে, সুতরাং এটি আর এনক্রিপশন নয় এবং এভাবে প্রশ্নের উত্তর দেয় না।
jbtule

@ জেবিটুল ধন্যবাদ, আমার এনক্রিপশন প্রকল্পটি পর্যালোচনা করার সময় আমি অন্যান্য উত্তরগুলি গুরুত্ব সহকারে বিবেচনা করব।
রোল্যান্ড

2
সাধারণ অ্যাপ্লিকেশনগুলির জন্য এটি ব্যবহার করুন আপনি যদি পারমাণবিক গোপনীয়তা রক্ষা করেন তবে অন্য কিছু ব্যবহার করুন। এটি যেমন কাজ করে।
জন পিট্টওয়ে

6

সি # তে এনক্রিপ্ট এবং ডিক্রিপ্ট একটি স্ট্রিংয়ের উল্লেখের সাথে আমি একটি ভাল সমাধান পেয়েছি:

static readonly string PasswordHash = "P@@Sw0rd";
static readonly string SaltKey = "S@LT&KEY";
static readonly string VIKey = "@1B2c3D4e5F6g7H8";

এনক্রিপ্টের জন্য

public static string Encrypt(string plainText)
{
    byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);

    byte[] keyBytes = new Rfc2898DeriveBytes(PasswordHash, Encoding.ASCII.GetBytes(SaltKey)).GetBytes(256 / 8);
    var symmetricKey = new RijndaelManaged() { Mode = CipherMode.CBC, Padding = PaddingMode.Zeros };
    var encryptor = symmetricKey.CreateEncryptor(keyBytes, Encoding.ASCII.GetBytes(VIKey));

    byte[] cipherTextBytes;

    using (var memoryStream = new MemoryStream())
    {
        using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
        {
            cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
            cryptoStream.FlushFinalBlock();
            cipherTextBytes = memoryStream.ToArray();
            cryptoStream.Close();
        }
        memoryStream.Close();
    }
    return Convert.ToBase64String(cipherTextBytes);
}

ডিক্রিপ্টের জন্য

public static string Decrypt(string encryptedText)
{
    byte[] cipherTextBytes = Convert.FromBase64String(encryptedText);
    byte[] keyBytes = new Rfc2898DeriveBytes(PasswordHash, Encoding.ASCII.GetBytes(SaltKey)).GetBytes(256 / 8);
    var symmetricKey = new RijndaelManaged() { Mode = CipherMode.CBC, Padding = PaddingMode.None };

    var decryptor = symmetricKey.CreateDecryptor(keyBytes, Encoding.ASCII.GetBytes(VIKey));
    var memoryStream = new MemoryStream(cipherTextBytes);
    var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read);
    byte[] plainTextBytes = new byte[cipherTextBytes.Length];

    int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
    memoryStream.Close();
    cryptoStream.Close();
    return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount).TrimEnd("\0".ToCharArray());
}

7
হার্ডকোডযুক্ত সল্ট এবং চতুর্থ, এবং তাদের জন্য একটি ASCII উপস্থাপনা ব্যবহার করা, এটি সব ধরণের ভুল।
jbtule

7
সুরক্ষা সতর্কতা: এই কোডটি ব্যবহার করবেন না উপরে আমার মন্তব্য দেখুন।
jbtule

6
আমি ক্ষমা চেয়ে নিচ্ছি যে আমি এটি বানান করি নি। চতুর্থ কোনও চাবিকাঠি নয়, এবং এটি গোপন রাখা শূন্যের সাথে যুক্ত সুরক্ষা সরবরাহ করে এবং এটি অনুমানযোগ্য করে তুলতে বেশ কিছুটা সুরক্ষার ক্ষতি হয়। আইভি-র হার্ডকোডিং সম্পূর্ণরূপে অযৌক্তিক / অযৌক্তিক / যে কেউ আসলে কীভাবে এইএস-সিবিসি এনক্রিপশন ব্যবহার করতে জানে তার পক্ষে ভুল to Encoding.ASCII.GetBytesডেটাগুলির জন্য যা মানুষের পছন্দসই কিছুতে এনট্রপি যুক্ত করার উদ্দেশ্যে করা হয়েছিল, প্রত্যাশার চেয়ে এনট্রপির চেয়ে কম হতে চলেছে এবং এটি একটি খুব আশ্চর্যজনক ভুল। এগুলি এমন সমস্ত জিনিস যা সহজেই সংশোধনযোগ্য, তবে আপনি তা নন, তাই সুরক্ষার জড়িততার কারণে আমার সাহসী সতর্কতা থেকে যায়।
jbtule

4
রাহুল, শীতল! ফিরে বসুন, শিথিল হন এবং ভেবে দেখুন কেন @ জেবিটুলের সমস্ত 3 টি মন্তব্য ভোট পেয়েছে। তিনি আপনাকে সঠিক পথে চালিত করার জন্য বুদ্ধিমান কিছু বলছেন। বিরক্ত লাগার মতো কিছুই নেই। আপনি তাই নতুন। আপনি বুঝতে পারবেন এটি কীভাবে শেষ পর্যন্ত কাজ করে।
নিখিল वर्तক

5

নিম্নলিখিত উদাহরণটি নমুনা ডেটা এনক্রিপ্ট এবং ডিক্রিপ্ট করার পদ্ধতি প্রদর্শন করে:

    // This constant is used to determine the keysize of the encryption algorithm in bits.
    // We divide this by 8 within the code below to get the equivalent number of bytes.
    private const int Keysize = 128;

    // This constant determines the number of iterations for the password bytes generation function.
    private const int DerivationIterations = 1000;

    public static string Encrypt(string plainText, string passPhrase)
    {
        // Salt and IV is randomly generated each time, but is preprended to encrypted cipher text
        // so that the same Salt and IV values can be used when decrypting.  
        var saltStringBytes = GenerateBitsOfRandomEntropy(16);
        var ivStringBytes = GenerateBitsOfRandomEntropy(16);
        var plainTextBytes = Encoding.UTF8.GetBytes(plainText);
        using (var password = new Rfc2898DeriveBytes(passPhrase, saltStringBytes, DerivationIterations))
        {
            var keyBytes = password.GetBytes(Keysize / 8);
            using (var symmetricKey = new RijndaelManaged())
            {
                symmetricKey.BlockSize = 128;
                symmetricKey.Mode = CipherMode.CBC;
                symmetricKey.Padding = PaddingMode.PKCS7;
                using (var encryptor = symmetricKey.CreateEncryptor(keyBytes, ivStringBytes))
                {
                    using (var memoryStream = new MemoryStream())
                    {
                        using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
                        {
                            cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
                            cryptoStream.FlushFinalBlock();
                            // Create the final bytes as a concatenation of the random salt bytes, the random iv bytes and the cipher bytes.
                            var cipherTextBytes = saltStringBytes;
                            cipherTextBytes = cipherTextBytes.Concat(ivStringBytes).ToArray();
                            cipherTextBytes = cipherTextBytes.Concat(memoryStream.ToArray()).ToArray();
                            memoryStream.Close();
                            cryptoStream.Close();
                            return Convert.ToBase64String(cipherTextBytes);
                        }
                    }
                }
            }
        }
    }

    public static string Decrypt(string cipherText, string passPhrase)
    {
        // Get the complete stream of bytes that represent:
        // [32 bytes of Salt] + [32 bytes of IV] + [n bytes of CipherText]
        var cipherTextBytesWithSaltAndIv = Convert.FromBase64String(cipherText);
        // Get the saltbytes by extracting the first 32 bytes from the supplied cipherText bytes.
        var saltStringBytes = cipherTextBytesWithSaltAndIv.Take(Keysize / 8).ToArray();
        // Get the IV bytes by extracting the next 32 bytes from the supplied cipherText bytes.
        var ivStringBytes = cipherTextBytesWithSaltAndIv.Skip(Keysize / 8).Take(Keysize / 8).ToArray();
        // Get the actual cipher text bytes by removing the first 64 bytes from the cipherText string.
        var cipherTextBytes = cipherTextBytesWithSaltAndIv.Skip((Keysize / 8) * 2).Take(cipherTextBytesWithSaltAndIv.Length - ((Keysize / 8) * 2)).ToArray();

        using (var password = new Rfc2898DeriveBytes(passPhrase, saltStringBytes, DerivationIterations))
        {
            var keyBytes = password.GetBytes(Keysize / 8);
            using (var symmetricKey = new RijndaelManaged())
            {
                symmetricKey.BlockSize = 128;
                symmetricKey.Mode = CipherMode.CBC;
                symmetricKey.Padding = PaddingMode.PKCS7;
                using (var decryptor = symmetricKey.CreateDecryptor(keyBytes, ivStringBytes))
                {
                    using (var memoryStream = new MemoryStream(cipherTextBytes))
                    {
                        using (var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read))
                        {
                            var plainTextBytes = new byte[cipherTextBytes.Length];
                            var decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
                            memoryStream.Close();
                            cryptoStream.Close();
                            return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount);
                        }
                    }
                }
            }
        }
    }

    private static byte[] GenerateBitsOfRandomEntropy(int size)
    {
        // 32 Bytes will give us 256 bits.
        // 16 Bytes will give us 128 bits.
        var randomBytes = new byte[size]; 
        using (var rngCsp = new RNGCryptoServiceProvider())
        {
            // Fill the array with cryptographically secure random bytes.
            rngCsp.GetBytes(randomBytes);
        }
        return randomBytes;
    }

ধন্যবাদ @ রেজা .. কিছু হোম প্রকল্পের জন্য এটি ব্যবহার করব যদি আমি পারি?
Arrie

4

Mattmanser উত্তর সমর্থন করতে । URL নিরাপদ মানগুলি এনক্রিপ্ট / ডিক্রিপ্ট করার জন্য মেশিনকি ক্লাস ব্যবহার করে এখানে একটি উদাহরণ Here

কিছু মনে রাখবেন, যেমনটি পূর্বে উল্লিখিত রয়েছে, এটি মেশিন কনফিগারেশন সেটিংস ব্যবহার করবে ( https: //msdn.mic Microsoft.com/en-us/library/ff649308.aspx )। আপনি ওয়েবকনফিগ ফাইলে এনক্রিপশন এবং ডিক্রিপশন কী / অ্যালগরিদম ম্যানুয়ালি সেট করতে পারেন (আপনার সাইটটি যদি একাধিক সার্ভারে চলতে থাকে তবে বিশেষত আপনার এটি প্রয়োজন হতে পারে)। আপনি আইআইএস থেকে কীগুলি তৈরি করতে পারেন (এখানে দেখুন: https://blogs.msdn.microsoft.com/vijaysk/2009/05/13/iis-7-tip-10-you-can-generate-machine-keys-from- -আইআইএস-ম্যানেজার / ) বা কোনও অনলাইন মেশিন কী জেনারেটর ব্যবহার করতে পারেন যেমন: http://www.developerfusion.com/tools/generatemachinekey/

    private static readonly UTF8Encoding Encoder = new UTF8Encoding();

    public static string Encrypt(string unencrypted)
    {
        if (string.IsNullOrEmpty(unencrypted)) 
            return string.Empty;

        try
        {
            var encryptedBytes = MachineKey.Protect(Encoder.GetBytes(unencrypted));

            if (encryptedBytes != null && encryptedBytes.Length > 0)
                return HttpServerUtility.UrlTokenEncode(encryptedBytes);    
        }
        catch (Exception)
        {
            return string.Empty;
        }

        return string.Empty;
    }

    public static string Decrypt(string encrypted)
    {
        if (string.IsNullOrEmpty(encrypted)) 
            return string.Empty;

        try
        {
            var bytes = HttpServerUtility.UrlTokenDecode(encrypted);
            if (bytes != null && bytes.Length > 0)
            {
                var decryptedBytes = MachineKey.Unprotect(bytes);
                if(decryptedBytes != null && decryptedBytes.Length > 0)
                    return Encoder.GetString(decryptedBytes);
            }

        }
        catch (Exception)
        {
            return string.Empty;
        }

        return string.Empty;
    }

3

মৌলিক চলমান অংশগুলি দেখানোর জন্য, এলোমেলো IV এবং HMAC এবং পাসওয়ার্ড-প্রাপ্ত কীগুলি সহ সিএস # তে স্ট্রিংগুলি এনক্রিপ্ট করার একটি সহজ উদাহরণ:

private byte[] EncryptBytes(byte[] key, byte[] plaintext)
{
    using (var cipher = new RijndaelManaged { Key = key })
    {
        using (var encryptor = cipher.CreateEncryptor())
        {
            var ciphertext = encryptor.TransformFinalBlock(plaintext, 0, plaintext.Length);

            // IV is prepended to ciphertext
            return cipher.IV.Concat(ciphertext).ToArray();
        }
    }
}

private byte[] DecryptBytes(byte[] key, byte[] packed)
{
    using (var cipher = new RijndaelManaged { Key = key })
    {
        int ivSize = cipher.BlockSize / 8;

        cipher.IV = packed.Take(ivSize).ToArray();

        using (var encryptor = cipher.CreateDecryptor())
        {
            return encryptor.TransformFinalBlock(packed, ivSize, packed.Length - ivSize);
        }
    }
}

private byte[] AddMac(byte[] key, byte[] data)
{
    using (var hmac = new HMACSHA256(key))
    {
        var macBytes = hmac.ComputeHash(data);

        // HMAC is appended to data
        return data.Concat(macBytes).ToArray();
    }
}

private bool BadMac(byte[] found, byte[] computed)
{
    int mismatch = 0;

    // Aim for consistent timing regardless of inputs
    for (int i = 0; i < found.Length; i++)
    {
        mismatch += found[i] == computed[i] ? 0 : 1;
    }

    return mismatch != 0;
}

private byte[] RemoveMac(byte[] key, byte[] data)
{
    using (var hmac = new HMACSHA256(key))
    {
        int macSize = hmac.HashSize / 8;

        var packed = data.Take(data.Length - macSize).ToArray();

        var foundMac = data.Skip(packed.Length).ToArray();

        var computedMac = hmac.ComputeHash(packed);

        if (this.BadMac(foundMac, computedMac))
        {
            throw new Exception("Bad MAC");
        }

        return packed;
    }            
}

private List<byte[]> DeriveTwoKeys(string password)
{
    var salt = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };

    var kdf = new Rfc2898DeriveBytes(password, salt, 10000);

    var bytes = kdf.GetBytes(32); // Two keys 128 bits each

    return new List<byte[]> { bytes.Take(16).ToArray(), bytes.Skip(16).ToArray() };
}

public byte[] EncryptString(string password, String message)
{
    var keys = this.DeriveTwoKeys(password);

    var plaintext = Encoding.UTF8.GetBytes(message);

    var packed = this.EncryptBytes(keys[0], plaintext);

    return this.AddMac(keys[1], packed);
}

public String DecryptString(string password, byte[] secret)
{
    var keys = this.DeriveTwoKeys(password);

    var packed = this.RemoveMac(keys[1], secret);

    var plaintext = this.DecryptBytes(keys[0], packed);

    return Encoding.UTF8.GetString(plaintext);
}

public void Example()
{
    var password = "correcthorsebatterystaple";

    var secret = this.EncryptString(password, "Hello World");

    Console.WriteLine("secret: " + BitConverter.ToString(secret));

    var recovered = this.DecryptString(password, secret);

    Console.WriteLine(recovered);
}

3
কয়েকটি সমস্যা: ১) আপনি কী ডাইরিভিশনে লবণ ব্যবহার করছেন না, বহু লক্ষ্যবস্তু আক্রমণ সক্ষম করে। ২) আপনার ম্যাক তুলনা কার্যটি সাইড-চ্যানেল / সময় আক্রমণগুলিতে সম্ভাব্য ঝুঁকির মধ্যে থেকে আপনি গোপনীয় ডেটাতে শাখা করেন। mismatch += found[i]^computed[i]পরিবর্তে কিছু ব্যবহার করুন । 3) আপনি পিবিকেডিএফ 2-এইচএমএসি-এসএএচএ -1 এর 20 টিরও বেশি বাইট ব্যবহার করছেন যা কোনও আক্রমণকারীকে ধীর না করে আপনার
কেডিএফকে

1
@ কোডসইন চাওস: ১) এটি মানুষকে সূচনা করার জন্য একটি সাধারণ উদাহরণ হিসাবে বোঝানো হয়েছিল - আমি কেবল স্পষ্টতার জন্য এলোমেলো লবণ বাদ দিই। তবে, ভাল কথা। 2) ভাল, সূক্ষ্ম বিন্দু। 3) আপনি বিশ বাইতে দুটি 16 বাইট কী অর্জন করার পরামর্শ দিচ্ছেন?
জিম বন্যা

সবচেয়ে সহজ উপায়টি SHA-2 এর সাথে ধীর হ্যাশের আউটপুট হ্যাশ করছে। ফ্যানসিয়ার উপায়গুলি হ'ল এইচডিডিএফ বা কেবল আবার পিবিকেডিএফ 2 প্রয়োগ করা হচ্ছে, তবে এবার পুনরাবৃত্তির সাথে 1 সেট করা হয়েছে
কোডসইনচায়োস

@ কোডসনচাওস আমি SHA-2 ব্যবহার করব না। হ্যাশ ফাংশনের কাজ কী ডেরাইভেশন ফাংশনের কাজের মতো নয়। একটি হ্যাশ কেবল অনির্দেশীয় হওয়া প্রয়োজন, এবং ইনপুট পরিবর্তিত হলে পরিবর্তিত হয়। এলোমেলো থেকে একটি কী আলাদা করার প্রয়োজন। আমি কেডিএফ থেকে এখনও 32 বাইট আঁকতে পারি। এই ক্ষেত্রে, আপনি খুব তাড়াতাড়ি অনুকূলিত করছেন এবং ঝুঁকি যুক্ত করছেন।
জিম বন্যা

3

এইএস-জিসিএম এনক্রিপশনের জন্য বাউনিসিস্টেলের বিকল্প হ'ল লাইবসোডিয়াম-নেট । এটি লাইবসোডিয়াম সি লাইব্রেরিটি আবৃত করে। একটি দুর্দান্ত সুবিধা হ'ল এটি খুব দ্রুত এনক্রিপশনের জন্য সিপিইউগুলিতে AES-NI এক্সটেনশন ব্যবহার করে। নীচের দিকটি হ'ল সিপিইউটির এক্সটেনশন না থাকলে এটি কিছুতেই কাজ করবে না। পিছনে কোনও সফ্টওয়্যার নেই।


3

নিম্নলিখিত কোডটি অনুরূপ প্রশ্নের গজলের উত্তরের একটি উন্নত সংস্করণ ।

public class EncryptionHelper
{
    private Aes aesEncryptor;

    public EncryptionHelper()
    {
    }

    private void BuildAesEncryptor(string key)
    {
        aesEncryptor = Aes.Create();
        var pdb = new Rfc2898DeriveBytes(key, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
        aesEncryptor.Key = pdb.GetBytes(32);
        aesEncryptor.IV = pdb.GetBytes(16);
    }

    public string EncryptString(string clearText, string key)
    {
        BuildAesEncryptor(key);
        var clearBytes = Encoding.Unicode.GetBytes(clearText);
        using (var ms = new MemoryStream())
        {
            using (var cs = new CryptoStream(ms, aesEncryptor.CreateEncryptor(), CryptoStreamMode.Write))
            {
                cs.Write(clearBytes, 0, clearBytes.Length);
            }
            var encryptedText = Convert.ToBase64String(ms.ToArray());
            return encryptedText;
        }
    }

    public string DecryptString(string cipherText, string key)
    {
        BuildAesEncryptor(key);
        cipherText = cipherText.Replace(" ", "+");
        var cipherBytes = Convert.FromBase64String(cipherText);
        using (var ms = new MemoryStream())
        {
            using (var cs = new CryptoStream(ms, aesEncryptor.CreateDecryptor(), CryptoStreamMode.Write))
            {
                cs.Write(cipherBytes, 0, cipherBytes.Length);
            }
            var clearText = Encoding.Unicode.GetString(ms.ToArray());
            return clearText;
        }
    }
}

2

এটি ব্রেট দ্বারা এখানে স্থাপন করা হয়েছে যে বর্গ। তবে আমি ইউআরএল স্ট্রিংগুলি এনক্রিপ্ট এবং ডিক্রিপ্ট করার জন্য ব্যবহার করার সময় 'বেস-64৪ চর অ্যারেটির জন্য অবৈধ দৈর্ঘ্য' ত্রুটিটি পাচ্ছি বলে আমি সামান্য সম্পাদনা করেছি।

public class CryptoURL
{
    private static byte[] _salt = Encoding.ASCII.GetBytes("Catto_Salt_Enter_Any_Value99");

    /// <summary>
    /// Encrypt the given string using AES.  The string can be decrypted using 
    /// DecryptStringAES().  The sharedSecret parameters must match. 
    /// The SharedSecret for the Password Reset that is used is in the next line
    ///  string sharedSecret = "OneUpSharedSecret9";
    /// </summary>
    /// <param name="plainText">The text to encrypt.</param>
    /// <param name="sharedSecret">A password used to generate a key for encryption.</param>
    public static string EncryptString(string plainText, string sharedSecret)
    {
        if (string.IsNullOrEmpty(plainText))
            throw new ArgumentNullException("plainText");
        if (string.IsNullOrEmpty(sharedSecret))
            throw new ArgumentNullException("sharedSecret");

        string outStr = null;                       // Encrypted string to return
        RijndaelManaged aesAlg = null;              // RijndaelManaged object used to encrypt the data.

        try
        {
            // generate the key from the shared secret and the salt
            Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(sharedSecret, _salt);

            // Create a RijndaelManaged object
            aesAlg = new RijndaelManaged();
            aesAlg.Key = key.GetBytes(aesAlg.KeySize / 8);

            // Create a decryptor to perform the stream transform.
            ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

            // Create the streams used for encryption.
            using (MemoryStream msEncrypt = new MemoryStream())
            {
                // prepend the IV
                msEncrypt.Write(BitConverter.GetBytes(aesAlg.IV.Length), 0, sizeof(int));
                msEncrypt.Write(aesAlg.IV, 0, aesAlg.IV.Length);
                using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                {
                    using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                    {
                        //Write all data to the stream.
                        swEncrypt.Write(plainText);
                    }
                }

                outStr = HttpServerUtility.UrlTokenEncode(msEncrypt.ToArray());
                //outStr = Convert.ToBase64String(msEncrypt.ToArray());
                // you may need to add a reference. right click reference in solution explorer => "add Reference" => .NET tab => select "System.Web"
            }
        }
        finally
        {
            // Clear the RijndaelManaged object.
            if (aesAlg != null)
                aesAlg.Clear();
        }

        // Return the encrypted bytes from the memory stream.
        return outStr;
    }

    /// <summary>
    /// Decrypt the given string.  Assumes the string was encrypted using 
    /// EncryptStringAES(), using an identical sharedSecret.
    /// </summary>
    /// <param name="cipherText">The text to decrypt.</param>
    /// <param name="sharedSecret">A password used to generate a key for decryption.</param>
    public static string DecryptString(string cipherText, string sharedSecret)
    {
        if (string.IsNullOrEmpty(cipherText))
            throw new ArgumentNullException("cipherText");
        if (string.IsNullOrEmpty(sharedSecret))
            throw new ArgumentNullException("sharedSecret");

        // Declare the RijndaelManaged object
        // used to decrypt the data.
        RijndaelManaged aesAlg = null;

        // Declare the string used to hold
        // the decrypted text.
        string plaintext = null;

        byte[] inputByteArray;

        try
        {
            // generate the key from the shared secret and the salt
            Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(sharedSecret, _salt);

            // Create the streams used for decryption.                
            //byte[] bytes = Convert.FromBase64String(cipherText);
            inputByteArray = HttpServerUtility.UrlTokenDecode(cipherText);

            using (MemoryStream msDecrypt = new MemoryStream(inputByteArray))
            {
                // Create a RijndaelManaged object
                // with the specified key and IV.
                aesAlg = new RijndaelManaged();
                aesAlg.Key = key.GetBytes(aesAlg.KeySize / 8);
                // Get the initialization vector from the encrypted stream
                aesAlg.IV = ReadByteArray(msDecrypt);
                // Create a decrytor to perform the stream transform.
                ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
                using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                {
                    using (StreamReader srDecrypt = new StreamReader(csDecrypt))

                        // Read the decrypted bytes from the decrypting stream
                        // and place them in a string.
                        plaintext = srDecrypt.ReadToEnd();
                }
            }
        }
        catch (System.Exception ex)
        {
            return "ERROR";
            //throw ex;

        }
        finally
        {
            // Clear the RijndaelManaged object.
            if (aesAlg != null)
                aesAlg.Clear();
        }

        return plaintext;
    }

    static string ConvertStringArrayToString(string[] array)
    {
        //
        // Concatenate all the elements into a StringBuilder.
        //
        StringBuilder builder = new StringBuilder();
        foreach (string value in array)
        {
            builder.Append(value);
            builder.Append('.');
        }
        return builder.ToString();
    }

    private static byte[] ReadByteArray(Stream s)
    {
        byte[] rawLength = new byte[sizeof(int)];
        if (s.Read(rawLength, 0, rawLength.Length) != rawLength.Length)
        {
            throw new SystemException("Stream did not contain properly formatted byte array");
        }

        byte[] buffer = new byte[BitConverter.ToInt32(rawLength, 0)];
        if (s.Read(buffer, 0, buffer.Length) != buffer.Length)
        {
            throw new SystemException("Did not read byte array properly");
        }

        return buffer;
    }

}

1
ConvertStringArrayToString()পদ্ধতিটি কীসের জন্য ব্যবহৃত হয়?
abenci

2
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

public class Program
{
    public static void Main()
    {
        var key = Encoding.UTF8.GetBytes("SUkbqO2ycDo7QwpR25kfgmC7f8CoyrZy");
        var data = Encoding.UTF8.GetBytes("testData");

        //Encrypt data
        var encrypted = CryptoHelper.EncryptData(data,key);

        //Decrypt data
        var decrypted = CryptoHelper.DecryptData(encrypted,key);

        //Display result
        Console.WriteLine(Encoding.UTF8.GetString(decrypted));
    }
}

public static class CryptoHelper
{
    public static byte[] EncryptData(byte[] data, byte[] key)
    {
        using (var aesAlg = Aes.Create())
        {
            aesAlg.Mode = CipherMode.CBC;
            using (var encryptor = aesAlg.CreateEncryptor(key, aesAlg.IV))
            {
                using (var msEncrypt = new MemoryStream())
                {
                    msEncrypt.Write(aesAlg.IV, 0, aesAlg.IV.Length);

                    using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                        csEncrypt.Write(data, 0, data.Length);

                    return msEncrypt.ToArray();
                }
            }
        }

    }

    public static byte[] DecryptData(byte[] encrypted, byte[] key)
    {
        var iv = new byte[16];
        Buffer.BlockCopy(encrypted, 0, iv, 0, iv.Length);
        using (var aesAlg = Aes.Create())
        {
            aesAlg.Mode = CipherMode.CBC;
            using (var decryptor = aesAlg.CreateDecryptor(key, iv))
            {
                using (var msDecrypt = new MemoryStream(encrypted, iv.Length, encrypted.Length - iv.Length))
                {
                    using (var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                    {
                        using (var resultStream = new MemoryStream())
                        {
                            csDecrypt.CopyTo(resultStream);
                            return resultStream.ToArray();
                        }
                    }
                }
            }
        }
    }
}

2
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Security.Cryptography;
using System.IO;
using System.Text;  

/// <summary>
/// Summary description for Encryption
/// </summary>
public class Encryption
{
    public TripleDES CreateDES(string key)
    {
        MD5 md5 = new MD5CryptoServiceProvider();
        TripleDES des = new TripleDESCryptoServiceProvider();
        des.Key = md5.ComputeHash(Encoding.Unicode.GetBytes(key));
        des.IV = new byte[des.BlockSize / 8];
        return des;
    }
    public  byte[] Encryptiondata(string PlainText)
    {
        TripleDES des = CreateDES("DreamMLMKey");
        ICryptoTransform ct = des.CreateEncryptor();
        byte[] input = Encoding.Unicode.GetBytes(PlainText);
        return ct.TransformFinalBlock(input, 0, input.Length);
    }

    public string Decryptiondata(string CypherText)
    {
        string stringToDecrypt = CypherText.Replace(" ", "+");
        int len = stringToDecrypt.Length;
        byte[] inputByteArray = Convert.FromBase64String(stringToDecrypt); 

        byte[] b = Convert.FromBase64String(CypherText);
        TripleDES des = CreateDES("DreamMLMKey");
        ICryptoTransform ct = des.CreateDecryptor();
        byte[] output = ct.TransformFinalBlock(b, 0, b.Length);
        return Encoding.Unicode.GetString(output);
    }
    public string Decryptiondataurl(string CypherText)
    {
        string newcyperttext=CypherText.Replace(' ', '+');
        byte[] b = Convert.FromBase64String(newcyperttext);
        TripleDES des = CreateDES("DreamMLMKey");
        ICryptoTransform ct = des.CreateDecryptor();
        byte[] output = ct.TransformFinalBlock(b, 0, b.Length);
        return Encoding.Unicode.GetString(output);
    }


    #region  encryption & Decription
    public  string Encrypt(string input, string key)
    {
        byte[] inputArray = UTF8Encoding.UTF8.GetBytes(input);
        TripleDESCryptoServiceProvider tripleDES = new TripleDESCryptoServiceProvider();
        tripleDES.Key = UTF8Encoding.UTF8.GetBytes(key);
        tripleDES.Mode = CipherMode.ECB;
        tripleDES.Padding = PaddingMode.PKCS7;
        ICryptoTransform cTransform = tripleDES.CreateEncryptor();
        byte[] resultArray = cTransform.TransformFinalBlock(inputArray, 0, inputArray.Length);
        tripleDES.Clear();
        return Convert.ToBase64String(resultArray, 0, resultArray.Length);
    }
    public  string Decrypt(string input, string key)
    {
        byte[] inputArray = Convert.FromBase64String(input);
        TripleDESCryptoServiceProvider tripleDES = new TripleDESCryptoServiceProvider();
        tripleDES.Key = UTF8Encoding.UTF8.GetBytes(key);
        tripleDES.Mode = CipherMode.ECB;
        tripleDES.Padding = PaddingMode.PKCS7;
        ICryptoTransform cTransform = tripleDES.CreateDecryptor();
        byte[] resultArray = cTransform.TransformFinalBlock(inputArray, 0, inputArray.Length);
        tripleDES.Clear();
        return UTF8Encoding.UTF8.GetString(resultArray);
    }

    public string encrypt(string encryptString)
    {
        string EncryptionKey = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        byte[] clearBytes = Encoding.Unicode.GetBytes(encryptString);
        using (Aes encryptor = Aes.Create())
        {
            Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] {
                0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76
            });
            encryptor.Key = pdb.GetBytes(32);
            encryptor.IV = pdb.GetBytes(16);
            using (MemoryStream ms = new MemoryStream())
            {
                using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(clearBytes, 0, clearBytes.Length);
                    cs.Close();
                }
                encryptString = Convert.ToBase64String(ms.ToArray());
            }
        }
        return encryptString;
    }

    public string Decrypt(string cipherText)
    {
        string EncryptionKey = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        cipherText = cipherText.Replace(" ", "+");
        byte[] cipherBytes = Convert.FromBase64String(cipherText);
        using (Aes encryptor = Aes.Create())
        {
            Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] {
                0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76
            });
            encryptor.Key = pdb.GetBytes(32);
            encryptor.IV = pdb.GetBytes(16);
            using (MemoryStream ms = new MemoryStream())
            {
                using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(cipherBytes, 0, cipherBytes.Length);
                    cs.Close();
                }
                cipherText = Encoding.Unicode.GetString(ms.ToArray());
            }
        }
        return cipherText;
    }

    #endregion
}

এমডি 5 স্বল্পতম সুরক্ষিত। এটি সুপারিশ করা হয় না।
vapcguy

1

প্রোগ্রামিংয়ে এনক্রিপশন খুব সাধারণ বিষয়। আমি মনে করি আপনার জন্য টাস্কটি করার জন্য একটি প্যাকেজ ইনস্টল করা ভাল। সাধারন এইস এনক্রিপশনের মতো একটি সাধারণ ওপেন সোর্স নুগেট প্রকল্প project

কীটি কনফিগার ফাইলে রয়েছে এবং তাই উত্পাদন পরিবেশে এটি পরিবর্তন করা সহজ, এবং আমি কোনও ত্রুটি দেখতে পাচ্ছি না

<MessageEncryption>
  <EncryptionKey KeySize="256" Key="3q2+796tvu/erb7v3q2+796tvu/erb7v3q2+796tvu8="/>
</MessageEncryption>

1
বড় অসুবিধা হ'ল এটি অনুমোদিত এনক্রিপশন নয়।
jbtule

0

অনুরূপ প্রশ্ন থেকে আমার উত্তরে এখানে অনুলিপি করা হয়েছে: সি # এর জন্য সহজ দ্বিমুখী এনক্রিপশন

একাধিক উত্তর এবং মন্তব্যের ভিত্তিতে।

  • এলোমেলো সূচনা ভেক্টর ক্রিপ্টো পাঠ্যে সংশোধন করেছে (@ জবিটিউল)
  • মেমোরিস্ট্রিম (@ রেনিপিট) এর পরিবর্তে ট্রান্সফর্মফাইনালব্লক () ব্যবহার করুন
  • দুর্যোগের অনুলিপি বা কাস্টিং কাউকে এড়ানোর জন্য কোনও প্রাক ভরাট কী নেই
  • সঠিক নিষ্পত্তি এবং নিদর্শন ব্যবহার

কোড:

/// <summary>
/// Simple encryption/decryption using a random initialization vector
/// and prepending it to the crypto text.
/// </summary>
/// <remarks>Based on multiple answers in /programming/165808/simple-two-way-encryption-for-c-sharp </remarks>
public class SimpleAes : IDisposable
{
    /// <summary>
    ///     Initialization vector length in bytes.
    /// </summary>
    private const int IvBytes = 16;

    /// <summary>
    ///     Must be exactly 16, 24 or 32 characters long.
    /// </summary>
    private static readonly byte[] Key = Convert.FromBase64String("FILL ME WITH 16, 24 OR 32 CHARS");

    private readonly UTF8Encoding _encoder;
    private readonly ICryptoTransform _encryptor;
    private readonly RijndaelManaged _rijndael;

    public SimpleAes()
    {
        _rijndael = new RijndaelManaged {Key = Key};
        _rijndael.GenerateIV();
        _encryptor = _rijndael.CreateEncryptor();
        _encoder = new UTF8Encoding();
    }

    public string Decrypt(string encrypted)
    {
        return _encoder.GetString(Decrypt(Convert.FromBase64String(encrypted)));
    }

    public void Dispose()
    {
        _rijndael.Dispose();
        _encryptor.Dispose();
    }

    public string Encrypt(string unencrypted)
    {
        return Convert.ToBase64String(Encrypt(_encoder.GetBytes(unencrypted)));
    }

    private byte[] Decrypt(byte[] buffer)
    {
        // IV is prepended to cryptotext
        byte[] iv = buffer.Take(IvBytes).ToArray();
        using (ICryptoTransform decryptor = _rijndael.CreateDecryptor(_rijndael.Key, iv))
        {
            return decryptor.TransformFinalBlock(buffer, IvBytes, buffer.Length - IvBytes);
        }
    }

    private byte[] Encrypt(byte[] buffer)
    {
        // Prepend cryptotext with IV
        byte[] inputBuffer = _rijndael.IV.Concat(buffer).ToArray();
        return _encryptor.TransformFinalBlock(inputBuffer, IvBytes, buffer.Length);
    }
}

1
সক্রিয় আক্রমণগুলি যেমন প্যাডিং ওরাকলগুলি রোধ করতে আপনার একটি ম্যাক যুক্ত করা উচিত।
কোডসইনচাউস 21

আপনি সম্ভবত সঠিক, আমি এই ক্ষেত্রে কোনওভাবেই দক্ষ না। আমি যখন মূলত এই বিষয়টিতে গিয়েছিলাম তখন আমি কেবল এমন কিছু সাধারণ চাই যা কাজ করে এবং মোটামুটি নিরাপদ। আমি খুব সংবেদনশীল ডেটার জন্য অবশ্যই একটি চেষ্টা করা এবং সত্য লাইব্রেরি ব্যবহার করব।
অ্যাঙ্গুলারসেন

0

মূলত এএসপি স্নিপেটস দ্বারা সরল স্নিপেট এখানে

using System.Text;
using System.Security.Cryptography;
using System.IO;


 private string Encrypt(string clearText)
    {
        string EncryptionKey = "yourkey";
        byte[] clearBytes = Encoding.Unicode.GetBytes(clearText);
        using (Aes encryptor = Aes.Create())
        {
            Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
            encryptor.Key = pdb.GetBytes(32);
            encryptor.IV = pdb.GetBytes(16);
            using (MemoryStream ms = new MemoryStream())
            {
                using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(clearBytes, 0, clearBytes.Length);
                    cs.Close();
                }
                clearText = Convert.ToBase64String(ms.ToArray());
            }
        }
        return clearText;
    }

 private string Decrypt(string cipherText)
    {
        string EncryptionKey = "yourkey";
        cipherText = cipherText.Replace(" ", "+");
        byte[] cipherBytes = Convert.FromBase64String(cipherText);
        using (Aes encryptor = Aes.Create())
        {
            Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
            encryptor.Key = pdb.GetBytes(32);
            encryptor.IV = pdb.GetBytes(16);
            using (MemoryStream ms = new MemoryStream())
            {
                using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(cipherBytes, 0, cipherBytes.Length);
                    cs.Close();
                }
                cipherText = Encoding.Unicode.GetString(ms.ToArray());
            }
        }
        return cipherText;
    }

1
আপনি সততা / প্রমাণীকরণ চেক করেন না। আপনার একটি ম্যাক যুক্ত করা উচিত।
আর্টজম বি

উপরের উদাহরণটি যা বলতে চাইছেন তা হ'ল স্ট্রিং ভেরিয়েবল এনক্রিপ্ট / ডিক্রিপ্ট করুন।
বিজয় কুম্ভোজ

3
প্যাডিং ওরাকল আক্রমণ থেকে রক্ষা করার জন্য সিফারেক্সটেক্সটি প্রমাণীকরণ করা উচিত (যেমন এইচএমএসি সহ)। আমি যখন এই কোডটি আবার দেখছি তখন মনে হয় আপনি ইসিবি মোড ব্যবহার করছেন যা কখনই ব্যবহার করা উচিত নয় কারণ এটি শব্দার্থগতভাবে সুরক্ষিত নয়। এছাড়াও, আপনি যখন মাস্টার কী এবং লবণ থেকে চাবি এবং চতুর্থ সংগ্রহ করেন, লবণ স্থির থাকে। এটি একটি স্থির চতুর্থ দিকে নিয়ে যায় যা চতুর্থ ধারণাটির পুরো ধারণাটি ভেঙে দেয় এবং আপনার স্কিমটিকে শব্দার্থগতভাবে আবার নিরাপত্তাহীন করে তোলে।
আর্টজম বি।

ধন্যবাদ ভাই, আপনি এখানে সংশোধিত কোডটি পাস করতে পারলে এটি দুর্দান্ত সাহায্য হবে।
বিজয় কুম্ভোজ

0

এইএস অ্যালগরিদম:

public static class CryptographyProvider
    {
        public static string EncryptString(string plainText, out string Key)
        {
            if (plainText == null || plainText.Length <= 0)
                throw new ArgumentNullException("plainText");

            using (Aes _aesAlg = Aes.Create())
            {
                Key = Convert.ToBase64String(_aesAlg.Key);
                ICryptoTransform _encryptor = _aesAlg.CreateEncryptor(_aesAlg.Key, _aesAlg.IV);

                using (MemoryStream _memoryStream = new MemoryStream())
                {
                    _memoryStream.Write(_aesAlg.IV, 0, 16);
                    using (CryptoStream _cryptoStream = new CryptoStream(_memoryStream, _encryptor, CryptoStreamMode.Write))
                    {
                        using (StreamWriter _streamWriter = new StreamWriter(_cryptoStream))
                        {
                            _streamWriter.Write(plainText);
                        }
                        return Convert.ToBase64String(_memoryStream.ToArray());
                    }
                }
            }
        }
        public static string DecryptString(string cipherText, string Key)
        {

            if (string.IsNullOrEmpty(cipherText))
                throw new ArgumentNullException("cipherText");
            if (string.IsNullOrEmpty(Key))
                throw new ArgumentNullException("Key");

            string plaintext = null;

            byte[] _initialVector = new byte[16];
            byte[] _Key = Convert.FromBase64String(Key);
            byte[] _cipherTextBytesArray = Convert.FromBase64String(cipherText);
            byte[] _originalString = new byte[_cipherTextBytesArray.Length - 16];

            Array.Copy(_cipherTextBytesArray, 0, _initialVector, 0, _initialVector.Length);
            Array.Copy(_cipherTextBytesArray, 16, _originalString, 0, _cipherTextBytesArray.Length - 16);

            using (Aes _aesAlg = Aes.Create())
            {
                _aesAlg.Key = _Key;
                _aesAlg.IV = _initialVector;
                ICryptoTransform decryptor = _aesAlg.CreateDecryptor(_aesAlg.Key, _aesAlg.IV);

                using (MemoryStream _memoryStream = new MemoryStream(_originalString))
                {
                    using (CryptoStream _cryptoStream = new CryptoStream(_memoryStream, decryptor, CryptoStreamMode.Read))
                    {
                        using (StreamReader _streamReader = new StreamReader(_cryptoStream))
                        {
                            plaintext = _streamReader.ReadToEnd();
                        }
                    }
                }
            }
            return plaintext;
        }
    }

1) IV একটি প্যারামিটার হিসাবে পাস করা হয়েছে যার অর্থ বিকাশকারীকে IV পরিচালনা করতে হবে এবং তারা এটির ভুল পাবে। পরিবর্তে, চতুর্থটি এলোমেলোভাবে সিফারেক্সটেক্সটের পাশাপাশি উত্পন্ন এবং সংরক্ষণ করা উচিত। ২) যেহেতু আইভি এবং কীটি একাধিক মৃত্যুদন্ডের মধ্যে পরিবর্তিত হবে Encryptionএবং অবিচল থাকবে না, তাই প্রদর্শনের উদ্দেশ্যে ব্যতীত অন্য কোনও পদ্ধতিতে এই পদ্ধতিটির দরকার নেই। ৩) সাইফারেক্সটেক্সের কোনও প্রমাণীকরণ নেই, সুতরাং আক্রমণকারীরা এটি সনাক্ত না করে এটি চালনা করতে পারে (দেখুন: প্যাডিং ওরাকল অ্যাটাক)।
আর্টজম বি।

হাই @ আর্টজোমবি। বিকাশকারীদের iv পরিচালনার বিষয়ে চিন্তা করার দরকার নেই কারণ এটি এনক্রিপ্ট করা স্ট্রিংয়ের সাথে জেনারেট হয়ে যুক্ত হবে and
খুলি

আমার দ্বিমত আছে আইভি _ivক্লাস ভেরিয়েবলে সংরক্ষণ করা হয় এবং সিফারেক্সটে লেখা হয় না । সুতরাং, আপনি কীভাবে রিসিভার কী এবং চতুর্থটি জানতে পারবেন? এগুলি অন্য কোনও উপায়ে বিতরণ করতে হবে। যেহেতু চতুর্থটি গোপন থাকার কথা নয়, তাই এটি প্রতিটি এনক্রিপশনের জন্য এলোমেলোভাবে তৈরি করা উচিত এবং সিফারেক্সট সহ বন্টন করা উচিত।
আর্টজম বি।


1
1) উপরের লিঙ্কে, আপনি এআইএস প্রয়োগ ছাড়াই উপায় পেতে পারেন, আইভি পরিচালনার বিষয়ে চিন্তা করার দরকার নেই, কারণ iv এছাড়াও স্ট্রিংয়ের সাথে এনক্রিপ্ট করা হয়। ২) যেহেতু আপনি যে ফাংশনটি উল্লেখ করেছেন তাতে ব্যক্তিগত অ্যাক্সেস সংশোধক রয়েছে আপনি এটির বাইরে কল করতে পারবেন না। এনক্রিপ্ট করতে inorder আমরা কেবল Cryptographyclass.Encrytion ( "SAMPLEstring") ব্যবহার করতে পারবেন হতে পারে ফাংশন
মাথার খুলি

0

বাউন্সি দুর্গ প্যাকেজটি ব্যবহার করে কীভাবে এএস-জিসিএম এনক্রিপশন / ডিক্রিপশন করা যেতে পারে তার নমুনা এখানে is

গোলং crypto/aesএপিআই থেকে ডেটা ডিক্রিপ্ট করার সম্ভাবনার জন্য যখন গুগল করা হয়েছিল তখন আমি সেই নমুনাটি পেয়েছি :

const (
    gcmBlockSize         = 16 // this is key size
    gcmTagSize           = 16 // this is mac
    gcmStandardNonceSize = 12 // this is nonce
)

func encrypt(data []byte, passphrase string) []byte {
    block, _ := aes.NewCipher([]byte(createHash(passphrase)))
    gcm, err := cipher.NewGCM(block)
    if err != nil {
        panic(err.Error())
    }
    nonce := make([]byte, gcm.NonceSize())
    if _, err = io.ReadFull(rand.Reader, nonce); err != nil {
        panic(err.Error())
    }
    ciphertext := gcm.Seal(nonce, nonce, data, nil)
    return ciphertext
}

। নেট নমুনা কী (256 বিট), ম্যাক (128 বিট) এবং ননস (bit৯ বিট) দিয়ে একটি কবজির মতো কাজ করে।


-1

PGPCore ব্যবহার করে কীভাবে এটি করতে পারেন তার উদাহরণ উদাহরণ , খুব সহজ সমাধান: https://blog.BScry.com/2018/07/05/pgp-encryption-and-decryption-in-c/

আমি বিভিন্ন সমাধানের চেষ্টা করেছি তবে এটি আমার পক্ষে সবচেয়ে ভাল কাজ করে, কারও কারও কাছে বাগ রয়েছে তবে এটি আমার পক্ষে উপযুক্ত।

using (PGP pgp = new PGP())
{
// Generate keys
pgp.GenerateKey(@"C:\TEMP\keys\public.asc", @"C:\TEMP\keys\private.asc", "email@email.com", "password");
// Encrypt file
pgp.EncryptFile(@"C:\TEMP\keys\content.txt", @"C:\TEMP\keys\content__encrypted.pgp", @"C:\TEMP\keys\public.asc", true, true);
// Encrypt and sign file
pgp.EncryptFileAndSign(@"C:\TEMP\keys\content.txt", @"C:\TEMP\keys\content__encrypted_signed.pgp", @"C:\TEMP\keys\public.asc", @"C:\TEMP\keys\private.asc", "password", true, true);
// Decrypt file
pgp.DecryptFile(@"C:\TEMP\keys\content__encrypted.pgp", @"C:\TEMP\keys\content__decrypted.txt", @"C:\TEMP\keys\private.asc", "password");
// Decrypt signed file
pgp.DecryptFile(@"C:\TEMP\keys\content__encrypted_signed.pgp", @"C:\TEMP\keys\content__decrypted_signed.txt", @"C:\TEMP\keys\private.asc", "password");

// Encrypt stream
using (FileStream inputFileStream = new FileStream(@"C:\TEMP\keys\content.txt", FileMode.Open))
using (Stream outputFileStream = File.Create(@"C:\TEMP\keys\content__encrypted2.pgp"))
using (Stream publicKeyStream = new FileStream(@"C:\TEMP\keys\public.asc", FileMode.Open))
    pgp.EncryptStream(inputFileStream, outputFileStream, publicKeyStream, true, true);

// Decrypt stream
using (FileStream inputFileStream = new FileStream(@"C:\TEMP\keys\content__encrypted2.pgp", FileMode.Open))
using (Stream outputFileStream = File.Create(@"C:\TEMP\keys\content__decrypted2.txt"))
using (Stream privateKeyStream = new FileStream(@"C:\TEMP\keys\private.asc", FileMode.Open))
    pgp.DecryptStream(inputFileStream, outputFileStream, privateKeyStream, "password");
}

1
ওয়াইসলা ওলবোরস্কি, একটি সমাধানের একটি লিঙ্ক স্বাগত, তবে দয়া করে আপনার উত্তরটি কার্যকর না হওয়া নিশ্চিত করুন: লিঙ্কটির চারপাশে প্রসঙ্গ যুক্ত করুন যাতে আপনার সহ ব্যবহারকারীদের কিছু ধারণা থাকতে পারে যে এটি কী এবং কেন এটি রয়েছে, তারপরে এর সর্বাধিক প্রাসঙ্গিক অংশটি উদ্ধৃত করুন লক্ষ্য পৃষ্ঠাটি উপলভ্য না হলে আপনি যে পৃষ্ঠাটির সাথে লিঙ্ক করছেন। লিঙ্কের চেয়ে সামান্য বেশি উত্তরগুলি মুছতে পারে।
ডাবল-বীপ

-2
            using System;
            using System.Collections.Generic;
            using System.Text;
            using System.Text.RegularExpressions;  // This is for password validation
            using System.Security.Cryptography;
            using System.Configuration;  // This is where the hash functions reside

            namespace BullyTracker.Common
            {
                public class HashEncryption
                {
                    //public string GenerateHashvalue(string thisPassword)
                    //{
                    //    MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
                    //    byte[] tmpSource;
                    //    byte[] tmpHash;

                    //    tmpSource = ASCIIEncoding.ASCII.GetBytes(thisPassword); // Turn password into byte array
                    //    tmpHash = md5.ComputeHash(tmpSource);

                    //    StringBuilder sOutput = new StringBuilder(tmpHash.Length);
                    //    for (int i = 0; i < tmpHash.Length; i++)
                    //    {
                    //        sOutput.Append(tmpHash[i].ToString("X2"));  // X2 formats to hexadecimal
                    //    }
                    //    return sOutput.ToString();
                    //}
                    //public Boolean VerifyHashPassword(string thisPassword, string thisHash)
                    //{
                    //    Boolean IsValid = false;
                    //    string tmpHash = GenerateHashvalue(thisPassword); // Call the routine on user input
                    //    if (tmpHash == thisHash) IsValid = true;  // Compare to previously generated hash
                    //    return IsValid;
                    //}
                    public string GenerateHashvalue(string toEncrypt, bool useHashing)
                    {
                        byte[] keyArray;
                        byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);

                        System.Configuration.AppSettingsReader settingsReader = new AppSettingsReader();
                        // Get the key from config file
                        string key = (string)settingsReader.GetValue("SecurityKey", typeof(String));
                        //System.Windows.Forms.MessageBox.Show(key);
                        if (useHashing)
                        {
                            MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
                            keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
                            hashmd5.Clear();
                        }
                        else
                            keyArray = UTF8Encoding.UTF8.GetBytes(key);

                        TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
                        tdes.Key = keyArray;
                        tdes.Mode = CipherMode.ECB;
                        tdes.Padding = PaddingMode.PKCS7;

                        ICryptoTransform cTransform = tdes.CreateEncryptor();
                        byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
                        tdes.Clear();
                        return Convert.ToBase64String(resultArray, 0, resultArray.Length);
                    }
                    /// <summary>
                    /// DeCrypt a string using dual encryption method. Return a DeCrypted clear string
                    /// </summary>
                    /// <param name="cipherString">encrypted string</param>
                    /// <param name="useHashing">Did you use hashing to encrypt this data? pass true is yes</param>
                    /// <returns></returns>
                    public string Decrypt(string cipherString, bool useHashing)
                    {
                        byte[] keyArray;
                        byte[] toEncryptArray = Convert.FromBase64String(cipherString);

                        System.Configuration.AppSettingsReader settingsReader = new AppSettingsReader();
                        //Get your key from config file to open the lock!
                        string key = (string)settingsReader.GetValue("SecurityKey", typeof(String));

                        if (useHashing)
                        {
                            MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
                            keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
                            hashmd5.Clear();
                        }
                        else
                            keyArray = UTF8Encoding.UTF8.GetBytes(key);

                        TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
                        tdes.Key = keyArray;
                        tdes.Mode = CipherMode.ECB;
                        tdes.Padding = PaddingMode.PKCS7;

                        ICryptoTransform cTransform = tdes.CreateDecryptor();
                        byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

                        tdes.Clear();
                        return UTF8Encoding.UTF8.GetString(resultArray);
                    }


                }

            }

3
সত্যিই নিম্ন মানের। 1) ইসিবি মোড (যা IV তেও বোঝায় না) 2) 3DES 3) কী এবং পাসওয়ার্ডগুলিকে বিভ্রান্ত করে। 4) খারাপ নামকরণ 5) কোনও ম্যাক নেই
কোডসইনচাউস

-2

সরলতার জন্য আমি নিজের জন্য এই ফাংশনটি তৈরি করেছি যা আমি অ ক্রিপ্টো উদ্দেশ্যে ব্যবহার করি: আপনার পাসওয়ার্ডের সাথে "আপনারপ্যাসফ্রেজ" প্রতিস্থাপন করুন ...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.IO;

 namespace My
{
    public class strCrypto
    {
        // This constant string is used as a "salt" value for the PasswordDeriveBytes function calls.
    // This size of the IV (in bytes) must = (keysize / 8).  Default keysize is 256, so the IV must be
    // 32 bytes long.  Using a 16 character string here gives us 32 bytes when converted to a byte array.
    private const string initVector = "r5dm5fgm24mfhfku";
    private const string passPhrase = "yourpassphrase"; // email password encryption password

    // This constant is used to determine the keysize of the encryption algorithm.
    private const int keysize = 256;

    public static string encryptString(string plainText)
    {
        //if the plaintext  is empty or null string just return an empty string
        if (plainText == "" || plainText == null )
        {
            return "";
        }

        byte[] initVectorBytes = Encoding.UTF8.GetBytes(initVector);
        byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
        PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase, null);
        byte[] keyBytes = password.GetBytes(keysize / 8);
        RijndaelManaged symmetricKey = new RijndaelManaged();
        symmetricKey.Mode = CipherMode.CBC;
        ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes);
        MemoryStream memoryStream = new MemoryStream();
        CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write);
        cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
        cryptoStream.FlushFinalBlock();
        byte[] cipherTextBytes = memoryStream.ToArray();
        memoryStream.Close();
        cryptoStream.Close();
        return Convert.ToBase64String(cipherTextBytes);
    }

    public static string decryptString(string cipherText)
    {
        //if the ciphertext is empty or null string just return an empty string
        if (cipherText == "" || cipherText == null )
        {
            return "";
        }

        byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);
        byte[] cipherTextBytes = Convert.FromBase64String(cipherText);
        PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase, null);
        byte[] keyBytes = password.GetBytes(keysize / 8);
        RijndaelManaged symmetricKey = new RijndaelManaged();
        symmetricKey.Mode = CipherMode.CBC;
        ICryptoTransform decryptor = symmetricKey.CreateDecryptor(keyBytes, initVectorBytes);
        MemoryStream memoryStream = new MemoryStream(cipherTextBytes);
        CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read);
        byte[] plainTextBytes = new byte[cipherTextBytes.Length];
        int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
        memoryStream.Close();
        cryptoStream.Close();
        return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount);
    }


}

}


4
1) কী ডেরিভিয়েশনে লবণ নেই 2) ধ্রুবক IV, যা একটি IV এর পুরো পয়েন্টটি মিস করে। প্রতিটি এনক্রিপশনের জন্য এটি আলাদা হওয়া উচিত। 3) কোনও প্রমাণীকরণ নেই => প্যাডিং ওরাকলগুলি হুমকি 4) encryptor.TransformFinalBlockমেমরি এবং ক্রিপ্টো স্ট্রিমগুলি ব্যবহার করার চেয়ে সহজ।
কোডসইনচাউস

-3
using System;
using System.Data;
using System.Configuration;
using System.Text;
using System.Security.Cryptography;

namespace Encription
{
    class CryptorEngine
    {
        public static string Encrypt(string ToEncrypt, bool useHasing)
        {
            byte[] keyArray;
            byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(ToEncrypt);
            //System.Configuration.AppSettingsReader settingsReader = new     AppSettingsReader();
           string Key = "Bhagwati";
            if (useHasing)
            {
                MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
                keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(Key));
                hashmd5.Clear();  
            }
            else
            {
                keyArray = UTF8Encoding.UTF8.GetBytes(Key);
            }
            TripleDESCryptoServiceProvider tDes = new TripleDESCryptoServiceProvider();
            tDes.Key = keyArray;
            tDes.Mode = CipherMode.ECB;
            tDes.Padding = PaddingMode.PKCS7;
            ICryptoTransform cTransform = tDes.CreateEncryptor();
            byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0,     toEncryptArray.Length);
            tDes.Clear();
            return Convert.ToBase64String(resultArray, 0, resultArray.Length);
        }
        public static string Decrypt(string cypherString, bool useHasing)
        {
            byte[] keyArray;
            byte[] toDecryptArray = Convert.FromBase64String(cypherString);
            //byte[] toEncryptArray = Convert.FromBase64String(cypherString);
            //System.Configuration.AppSettingsReader settingReader = new     AppSettingsReader();
            string key = "Bhagwati";
            if (useHasing)
            {
                MD5CryptoServiceProvider hashmd = new MD5CryptoServiceProvider();
                keyArray = hashmd.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
                hashmd.Clear();
            }
            else
            {
                keyArray = UTF8Encoding.UTF8.GetBytes(key);
            }
            TripleDESCryptoServiceProvider tDes = new TripleDESCryptoServiceProvider();
            tDes.Key = keyArray;
            tDes.Mode = CipherMode.ECB;
            tDes.Padding = PaddingMode.PKCS7;
            ICryptoTransform cTransform = tDes.CreateDecryptor();
            try
            {
                byte[] resultArray = cTransform.TransformFinalBlock(toDecryptArray, 0,         toDecryptArray.Length);

                tDes.Clear();
                return UTF8Encoding.UTF8.GetString(resultArray,0,resultArray.Length);
            }
            catch (Exception ex)
            {
                throw ex;
             }
        }
    }
}

15
ইসিবি সাইফার মোডটি কি কোনও বড় নম্বর নয়?
জন বুব্রিস্কি

4
হ্যাঁ, ইসিবি সর্বনিম্ন সুরক্ষিত বিকল্প। এমএসের মন্তব্য দেখুন: "গুরুত্বপূর্ণ: এই মোডটি সুপারিশ করা হয় না কারণ এটি একাধিক সুরক্ষা শোষণের দরজা খুলে দেয়।" msdn.microsoft.com/en-us/library/…
সমৃদ্ধ

-3

সিএস # (.NET ফ্রেমওয়ার্ক 4) এ লিখিত AES এর জন্য আমার কোড Rfc2898DeriveBytes( এখানে ডকুমেন্টেশন) এলগোরিহিটমের সাথে এবং আমার কাছে সীমিত প্ল্যাটফর্মগুলির জন্য পুরোপুরি কাজ করে উইন্ডোজ ফোন Phone.০+ এর জন্য নেট কমপ্যাক্ট ফ্রেমওয়ার্ক (সমস্ত নয়) আমি আপনাকে আমার অবদান দিতে চাই want প্ল্যাটফর্মগুলি .NET ফ্রেমওয়ার্কের প্রতিটি ক্রাইপোগ্রাফিক পদ্ধতি সমর্থন করে)

আমি আশা করি এটি যে কাউকে সাহায্য করতে পারে!

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

public static class Crypto
{
    private static readonly byte[] IVa = new byte[] { 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x11, 0x11, 0x12, 0x13, 0x14, 0x0e, 0x16, 0x17 };


    public static string Encrypt(this string text, string salt)
    {
        try
        {
            using (Aes aes = new AesManaged())
            {
                Rfc2898DeriveBytes deriveBytes = new Rfc2898DeriveBytes(Encoding.UTF8.GetString(IVa, 0, IVa.Length), Encoding.UTF8.GetBytes(salt));
                aes.Key = deriveBytes.GetBytes(128 / 8);
                aes.IV = aes.Key;
                using (MemoryStream encryptionStream = new MemoryStream())
                {
                    using (CryptoStream encrypt = new CryptoStream(encryptionStream, aes.CreateEncryptor(), CryptoStreamMode.Write))
                    {
                        byte[] cleanText = Encoding.UTF8.GetBytes(text);
                        encrypt.Write(cleanText, 0, cleanText.Length);
                        encrypt.FlushFinalBlock();
                    }

                    byte[] encryptedData = encryptionStream.ToArray();
                    string encryptedText = Convert.ToBase64String(encryptedData);


                    return encryptedText;
                }
            }
        }
        catch
        {
            return String.Empty;
        }
    }

    public static string Decrypt(this string text, string salt)
    {
        try
        {
            using (Aes aes = new AesManaged())
            {
                Rfc2898DeriveBytes deriveBytes = new Rfc2898DeriveBytes(Encoding.UTF8.GetString(IVa, 0, IVa.Length), Encoding.UTF8.GetBytes(salt));
                aes.Key = deriveBytes.GetBytes(128 / 8);
                aes.IV = aes.Key;

                using (MemoryStream decryptionStream = new MemoryStream())
                {
                    using (CryptoStream decrypt = new CryptoStream(decryptionStream, aes.CreateDecryptor(), CryptoStreamMode.Write))
                    {
                        byte[] encryptedData = Convert.FromBase64String(text);


                        decrypt.Write(encryptedData, 0, encryptedData.Length);
                        decrypt.Flush();
                    }

                    byte[] decryptedData = decryptionStream.ToArray();
                    string decryptedText = Encoding.UTF8.GetString(decryptedData, 0, decryptedData.Length);


                    return decryptedText;
                }
            }
        }
        catch
        {
            return String.Empty;
        }
        }
    }
}

10
1) আপনি কেন একটি ভেরিয়েবল ব্যবহার করছেন IVaযা বলা হয় IV নয়, তবে একটি পাসওয়ার্ড? 2) আপনি আইভি = কী সেট করছেন? প্রতিটি এনক্রিপশনের জন্য আপনার একটি নতুন এলোমেলো IV প্রয়োজন। 3) ম্যাকের অভাব প্যাডিং ওরাকল আক্রমণগুলিকে সক্ষম করে
কোডসইনচাউস

-4

আপনাকে সিস্টেম.সিকিউরিটি.ক্রিপ্টোগ্রাফি ব্যবহার করে নেমস্পেস ব্যবহার করতে হবে; এবং ইউজ হ্যাশিং একটি বুল টাইপ হয় সত্য বা মিথ্যা। স্ট্রিং ভেরিয়েবল "কী" এনক্রিপশনের জন্য এবং ডিক্রিপশনের জন্য একই হওয়া উচিত

//Encryption
public string EncryptText(string toEncrypt, bool useHashing)
    {
        try
        {
            byte[] keyArray;
            byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);

            string key = "String Key Value"; //Based on this key stirng is encrypting
            //System.Windows.Forms.MessageBox.Show(key);
            //If hashing use get hashcode regards to your key
            if (useHashing)
            {
                MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
                keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
                //Always release the resources and flush data
                //of the Cryptographic service provide. Best Practice

                hashmd5.Clear();
            }
            else
                keyArray = UTF8Encoding.UTF8.GetBytes(key);

            TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
            //set the secret key for the tripleDES algorithm
            tdes.Key = keyArray;
            //mode of operation. there are other 4 modes. We choose ECB(Electronic code Book)
            tdes.Mode = CipherMode.ECB;
            //padding mode(if any extra byte added)
            tdes.Padding = PaddingMode.PKCS7;

            ICryptoTransform cTransform = tdes.CreateEncryptor();
            //transform the specified region of bytes array to resultArray
            byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0,          toEncryptArray.Length);
            //Release resources held by TripleDes Encryptor
            tdes.Clear();
            //Return the encrypted data into unreadable string format
            return Convert.ToBase64String(resultArray, 0, resultArray.Length);
        }
        catch (Exception e)
        {
            throw e;
        }
    }

    //Decryption
    public string DecryptText(string cipherString, bool useHashing)
    {

        try
        {
            byte[] keyArray;
            //get the byte code of the string

            byte[] toEncryptArray = Convert.FromBase64String(cipherString);

            string key = "String Key Value"; //Based on this key string is decrypted

            if (useHashing)
            {
                //if hashing was used get the hash code with regards to your key
                MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
                keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
                //release any resource held by the MD5CryptoServiceProvider

                hashmd5.Clear();
            }
            else
            {
                //if hashing was not implemented get the byte code of the key
                keyArray = UTF8Encoding.UTF8.GetBytes(key);
            }

            TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
            //set the secret key for the tripleDES algorithm
            tdes.Key = keyArray;
            //mode of operation. there are other 4 modes.
            //We choose ECB(Electronic code Book)

            tdes.Mode = CipherMode.ECB;
            //padding mode(if any extra byte added)
            tdes.Padding = PaddingMode.PKCS7;

            ICryptoTransform cTransform = tdes.CreateDecryptor();
            byte[] resultArray = cTransform.TransformFinalBlock
                    (toEncryptArray, 0, toEncryptArray.Length);
            //Release resources held by TripleDes Encryptor
            tdes.Clear();
            //return the Clear decrypted TEXT
            return UTF8Encoding.UTF8.GetString(resultArray);
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

5
-1 1) ইসিবি মোডটি খুব দুর্বল 2) ম্যাকের অভাব আপনাকে সক্রিয় আক্রমণগুলিতে ছেড়ে দেয়, যেমন প্যাডিং ওরাকলস। 3) আপনি আজকাল 3 ডিইএস কেন ব্যবহার করবেন? এটি ভাঙা হয়নি, তবে এএস স্পষ্টতই আরও ভাল পছন্দ।
কোডসইনচাউস

-4

সুরক্ষিতভাবে হ্যাশ ডেটার জন্য একটি ভাল অ্যালগরিদম হ'ল বিসিপ্রিপ :

রেইনবো টেবিল আক্রমণ থেকে রক্ষা করার জন্য একটি লবণ সংযোজন করার পাশাপাশি, ব্রিপ্রিপ্ট একটি অভিযোজিত ফাংশন: সময়ের সাথে সাথে, পুনরাবৃত্তি গণনাটিকে আরও ধীর করে তোলা যেতে পারে, তাই এটি ক্রমবর্ধমান শক্তির সাথেও ব্রুট-ফোর্স অনুসন্ধান আক্রমণগুলিতে প্রতিরোধী থাকে।

বিসিক্রিপ্টের একটি দুর্দান্ত .NET প্রয়োগ রয়েছে যা একটি নিউগেট প্যাকেজ হিসাবে উপলব্ধ ।


12
প্রশ্নটি কীভাবে একটি স্ট্রিং এনক্রিপ্ট এবং ডিক্রিপ্ট করতে হয় তা জিজ্ঞাসা করে। যতক্ষণ না আমি বিশাল কিছু মিস করছি - আপনি বিসিক্রিপ্টে একটি স্ট্রিংটি কীভাবে ডিক্রিপ্ট করতে পারবেন? বিসিক্রিপ, এর নাম থাকা সত্ত্বেও একটি হ্যাশিং ফাংশন।
The1nk
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.