এখানে অন্যান্য উত্তরগুলি সূক্ষ্মভাবে কাজ করে তবে এইএস আরও সুরক্ষিত এবং আপ-টু ডেট এনক্রিপশন অ্যালগরিদম। এটি এমন একটি শ্রেণী যা আমি কয়েক বছর আগে এইএস এনক্রিপশন সম্পাদন করার জন্য পেয়েছি যা ওয়েব অ্যাপ্লিকেশনগুলির জন্য আরও বন্ধুত্বপূর্ণ হওয়ার জন্য আমি সময়ের সাথে সাথে সংশোধন করেছি (যেমন, জি। আমি এনক্রিপ্ট / ডিক্রিপ্ট পদ্ধতিগুলি তৈরি করেছি যা URL- বান্ধব স্ট্রিংয়ের সাথে কাজ করে)। এটিতে এমন পদ্ধতি রয়েছে যা বাইট অ্যারেগুলির সাথে কাজ করে।
দ্রষ্টব্য: আপনার কী (32 বাইট) এবং ভেক্টর (16 বাইট) অ্যারেতে বিভিন্ন মান ব্যবহার করা উচিত! আপনি চাইবেন না যে কেউ এই কোডটি যেমন আছেন তেমন ধরে নিয়ে কেবল আপনার চাবিগুলি বের করে! আপনাকে যা করতে হবে তা হ'ল কী এবং ভেক্টর অ্যারেতে কিছু নম্বর (অবশ্যই <= 255) হওয়া উচিত (আপনি এটি করেছেন তা নিশ্চিত করার জন্য আমি ভেক্টর অ্যারেতে একটি অবৈধ মান রেখেছি ...)। সহজেই একটি নতুন সেট তৈরি করতে আপনি https://www.random.org/bytes/ ব্যবহার করতে পারেন:
এটি ব্যবহার করা সহজ: কেবল ক্লাসটি ইনস্ট্যান্ট করুন এবং তারপরে পদ্ধতি হিসাবে (সাধারণত) এনক্রিপ্টটোস্ট্রিং (স্ট্রিং স্ট্রিংটোসেক্রিপ্ট) এবং ডিক্রিপ্টস্ট্রিং (স্ট্রিং স্ট্রিংটোডেক্রিপ্ট) কল করুন। আপনার এই ক্লাসটি জায়গায় রাখার পরে এটি কোনও সহজ (বা আরও সুরক্ষিত) হতে পারে না।
using System;
using System.Data;
using System.Security.Cryptography;
using System.IO;
public class SimpleAES
{
// Change these keys
private byte[] Key = __Replace_Me__({ 123, 217, 19, 11, 24, 26, 85, 45, 114, 184, 27, 162, 37, 112, 222, 209, 241, 24, 175, 144, 173, 53, 196, 29, 24, 26, 17, 218, 131, 236, 53, 209 });
// a hardcoded IV should not be used for production AES-CBC code
// IVs should be unpredictable per ciphertext
private byte[] Vector = __Replace_Me__({ 146, 64, 191, 111, 23, 3, 113, 119, 231, 121, 2521, 112, 79, 32, 114, 156 });
private ICryptoTransform EncryptorTransform, DecryptorTransform;
private System.Text.UTF8Encoding UTFEncoder;
public SimpleAES()
{
//This is our encryption method
RijndaelManaged rm = new RijndaelManaged();
//Create an encryptor and a decryptor using our encryption method, key, and vector.
EncryptorTransform = rm.CreateEncryptor(this.Key, this.Vector);
DecryptorTransform = rm.CreateDecryptor(this.Key, this.Vector);
//Used to translate bytes to text and vice versa
UTFEncoder = new System.Text.UTF8Encoding();
}
/// -------------- Two Utility Methods (not used but may be useful) -----------
/// Generates an encryption key.
static public byte[] GenerateEncryptionKey()
{
//Generate a Key.
RijndaelManaged rm = new RijndaelManaged();
rm.GenerateKey();
return rm.Key;
}
/// Generates a unique encryption vector
static public byte[] GenerateEncryptionVector()
{
//Generate a Vector
RijndaelManaged rm = new RijndaelManaged();
rm.GenerateIV();
return rm.IV;
}
/// ----------- The commonly used methods ------------------------------
/// Encrypt some text and return a string suitable for passing in a URL.
public string EncryptToString(string TextValue)
{
return ByteArrToString(Encrypt(TextValue));
}
/// Encrypt some text and return an encrypted byte array.
public byte[] Encrypt(string TextValue)
{
//Translates our text value into a byte array.
Byte[] bytes = UTFEncoder.GetBytes(TextValue);
//Used to stream the data in and out of the CryptoStream.
MemoryStream memoryStream = new MemoryStream();
/*
* We will have to write the unencrypted bytes to the stream,
* then read the encrypted result back from the stream.
*/
#region Write the decrypted value to the encryption stream
CryptoStream cs = new CryptoStream(memoryStream, EncryptorTransform, CryptoStreamMode.Write);
cs.Write(bytes, 0, bytes.Length);
cs.FlushFinalBlock();
#endregion
#region Read encrypted value back out of the stream
memoryStream.Position = 0;
byte[] encrypted = new byte[memoryStream.Length];
memoryStream.Read(encrypted, 0, encrypted.Length);
#endregion
//Clean up.
cs.Close();
memoryStream.Close();
return encrypted;
}
/// The other side: Decryption methods
public string DecryptString(string EncryptedString)
{
return Decrypt(StrToByteArray(EncryptedString));
}
/// Decryption when working with byte arrays.
public string Decrypt(byte[] EncryptedValue)
{
#region Write the encrypted value to the decryption stream
MemoryStream encryptedStream = new MemoryStream();
CryptoStream decryptStream = new CryptoStream(encryptedStream, DecryptorTransform, CryptoStreamMode.Write);
decryptStream.Write(EncryptedValue, 0, EncryptedValue.Length);
decryptStream.FlushFinalBlock();
#endregion
#region Read the decrypted value from the stream.
encryptedStream.Position = 0;
Byte[] decryptedBytes = new Byte[encryptedStream.Length];
encryptedStream.Read(decryptedBytes, 0, decryptedBytes.Length);
encryptedStream.Close();
#endregion
return UTFEncoder.GetString(decryptedBytes);
}
/// Convert a string to a byte array. NOTE: Normally we'd create a Byte Array from a string using an ASCII encoding (like so).
// System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
// return encoding.GetBytes(str);
// However, this results in character values that cannot be passed in a URL. So, instead, I just
// lay out all of the byte values in a long string of numbers (three per - must pad numbers less than 100).
public byte[] StrToByteArray(string str)
{
if (str.Length == 0)
throw new Exception("Invalid string value in StrToByteArray");
byte val;
byte[] byteArr = new byte[str.Length / 3];
int i = 0;
int j = 0;
do
{
val = byte.Parse(str.Substring(i, 3));
byteArr[j++] = val;
i += 3;
}
while (i < str.Length);
return byteArr;
}
// Same comment as above. Normally the conversion would use an ASCII encoding in the other direction:
// System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
// return enc.GetString(byteArr);
public string ByteArrToString(byte[] byteArr)
{
byte val;
string tempStr = "";
for (int i = 0; i <= byteArr.GetUpperBound(0); i++)
{
val = byteArr[i];
if (val < (byte)10)
tempStr += "00" + val.ToString();
else if (val < (byte)100)
tempStr += "0" + val.ToString();
else
tempStr += val.ToString();
}
return tempStr;
}
}