PDA

View Full Version : سورس یا کلاس الگوریتم رمز نگاری AES در سی شارپ



negar.rafie
چهارشنبه 11 شهریور 1394, 17:42 عصر
سلام
بهترین کلاس این الگوریتم را میخواستم میشه معرفی کنید
ممنون

hamid_hr
چهارشنبه 11 شهریور 1394, 17:58 عصر
/// <summary> /// Encrypt a string using dual encryption method. Return a encrypted cipher Text
/// </summary>
/// <param name="toEncrypt">string to be encrypted</param>
/// <param name="useHashing">use hashing? send to for extra secirity</param>
/// <returns></returns>
public string Encrypt(string toEncrypt, bool useHashing)
{
byte[] keyArray;
byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);


string key = "Key for Crypt";
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);
string key = "Key for Crypt";

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);
}

نمیدونم بهترین هست یا نه
فقط اون key رو باید کلید crypt, decrypt بزاری

negar.rafie
پنج شنبه 12 شهریور 1394, 10:03 صبح
یعنی aes که میگن همین چند خط کده
اخه توی اینترنت خیلی گشتم و کلاسش خیلی طولانی تره مثل اینکه

ahmadreza.s
پنج شنبه 12 شهریور 1394, 10:20 صبح
سلام میتونید اینجا (https://msdn.microsoft.com/en-us/library/system.security.cryptography.aes(v=vs.110).aspx) به صورت خیلی ساده و همراه با مثال الگوریتمشو یاد بگیرید !

negar.rafie
پنج شنبه 12 شهریور 1394, 11:28 صبح
سلام میتونید اینجا (https://msdn.microsoft.com/en-us/library/system.security.cryptography.aes(v=vs.110).aspx) به صورت خیلی ساده و همراه با مثال الگوریتمشو یاد بگیرید !

یعنی کلاسش همینه و در پروژم همین را کپی کنم ؟
ولی یه چیزی منا گیج کرده
لینک های زیر را ببینید:
http://www.codeproject.com/Articles/769741/Csharp-AES-bits-Encryption-Library-with-Salt

http://stackoverflow.com/questions/273452/using-aes-encryption-in-c-sharp

از RijndaelManaged استفاده کردن این پس چیه؟

ahmadreza.s
پنج شنبه 12 شهریور 1394, 11:58 صبح
توضیحات بیشتر در مورد رمزنگاری AES رو میتونید تو همین فروم ، در این لینک (http://barnamenevis.org/showthread.php?381814-%D8%B1%D9%85%D8%B2-%D9%86%DA%AF%D8%A7%D8%B1%DB%8C-%D9%85%D8%AA%D9%82%D8%A7%D8%B1%D9%86-%D8%AF%D8%B1-%D8%AF%D8%A7%D8%AA-%D9%86%D8%AA-%D8%A8%D9%87-%DA%A9%D9%85%DA%A9-C) ببینید ولی من یه خلاصه براتون میزارم :



الگوریتم AES ، الگوریتمی است برای رمزنگاری که به روش متقارن کار میکنه ، یعنی با کلیدی که داده ها رمز میشن ، با همون کلید داده ها زمزگشایی میشن ،
این الگوریتم در واقع همان الگوریتم Rijndael هست که بعد از استاندارد سازی به نام AES (Advanced Encryption Standard) تغییر نام داد...
فضای کلید رمزنگاری این الگوریتم 128 بیتی هست و به همین دلیل دور زدن این الگورتم را کاری بسیار سخت میکنه ...
این الگوریتم برای جایگزینی الگوریتم DES ارائه داده شد ، به این دلیل که الگوریتم DES توسط دولت فدرال آمریکا به همراه IBM ابداع شده بود و حس میشد دارای back door می تواند باشد...

negar.rafie
پنج شنبه 12 شهریور 1394, 13:20 عصر
ممنون
فقط ورودی ایناه بایت میخوان
حالا من چطوری رشته خودم و کلید خودم که به صورت رشته هستند را به صورت بایت ارسال کنم؟
وبرای رمزگشایی هم همینطور؟

ahmadreza.s
پنج شنبه 12 شهریور 1394, 13:26 عصر
static byte[] GetBytes(string str)
{
byte[] bytes =new byte[str.Length*sizeof(char)];
System.Buffer.BlockCopy(str.ToCharArray(),0, bytes,0, bytes.Length);
return bytes;
}

static string GetString(byte[] bytes)
{
char[] chars =new char[bytes.Length/sizeof(char)];
System.Buffer.BlockCopy(bytes,0, chars,0, bytes.Length);
return new string(chars);
}

negar.rafie
پنج شنبه 12 شهریور 1394, 13:48 عصر
برای رمز نگاری فایل ها هم از همین استفاده میشه؟یا باید کدها را عوض کنیم؟

اینIV چی هستش؟

ahmadreza.s
پنج شنبه 12 شهریور 1394, 15:10 عصر
برای رمز نگاری فایل ها هم از همین استفاده میشه؟یا باید کدها را عوض کنیم؟

اینIV چی هستش؟

برای رمز نگاری فایل ها با استفاده از Aes Encryption باید یه خورده اون کد رو تغییر بدید ، به این صورت که همه ی بایت هارو از فایل بخونه و اونارو رمزنگاری کنه و بعد از رمزنگاری ، بایت های تغییر داده شده رو بنویسه !

IV فلسفه ش طولانیه ، من یه خلاصه براتون میزارم ، منبع رو هم میزارم واسه اطلاعات بیشتر اگه خواستید میتونید مطالعه کنید :


داشتن هر IV منحصر به فرد در هر فایل (یا رشته) رمز نگاری شده بسیار مهمه و مهم تر اینه که برای هر فایل رمزنگاری شده نباید از یک IV استفاده کرد ! و اگر IV برای عملیات دیکد کردن به صورت غلط وارد شه ممکنه فایل (یا رشته) تولیدی درست نباشه !
پس برای رمزنگاری باید هر جفتشون رو داشته باشید و حتمن به صورت تصادفی یک IV منحصر بفرد برای هر فایل(یا رشته) ایجاد کنید

برای اطلاعات بیشتر میتونید به این لینک (http://stackoverflow.com/questions/9049789/aes-encryption-key-versus-iv) مراجعه کنید

negar.rafie
پنج شنبه 12 شهریور 1394, 16:10 عصر
خب حالا با این حساب پیاده سازی کلاس یکم سخت شد
میشه کلاس را راه اندازی کنید که رشته و کلید و iv را بگیره و رشته رزم شده بده و دیکد کنه؟

ahmadreza.s
پنج شنبه 12 شهریور 1394, 16:17 عصر
سلام مثال استفاده شده در لینکی که تو پست چهار دادم رو اینجا براتون کپی میکنم :

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

namespace Aes_Example
{
class AesExample
{
public static void Main()
{
try
{

string original = "Here is some data to encrypt!";

// Create a new instance of the Aes
// class. This generates a new key and initialization
// vector (IV).
using (Aes myAes = Aes.Create())
{

// Encrypt the string to an array of bytes.
byte[] encrypted = EncryptStringToBytes_Aes(original,
myAes.Key, myAes.IV);

// Decrypt the bytes to a string.
string roundtrip = DecryptStringFromBytes_Aes(encrypted,
myAes.Key, myAes.IV);

//Display the original data and the decrypted data.
Console.WriteLine("Original: {0}", original);
Console.WriteLine("Round Trip: {0}", roundtrip);
}

}
catch (Exception e)
{
Console.WriteLine("Error: {0}", e.Message);
}
}
static byte[] EncryptStringToBytes_Aes(string plainText, byte[] Key,
byte[] IV)
{
// Check arguments.
if (plainText == null || plainText.Length <= 0)
throw new ArgumentNullException("plainText");
if (Key == null || Key.Length <= 0)
throw new ArgumentNullException("Key");
if (IV == null || IV.Length <= 0)
throw new ArgumentNullException("Key");
byte[] encrypted;
// Create an Aes object
// with the specified key and IV.
using (Aes aesAlg = Aes.Create())
{
aesAlg.Key = Key;
aesAlg.IV = IV;

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

// Create the streams used for encryption.
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt
, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter swEncrypt = new StreamWriter(
csEncrypt))
{

//Write all data to the stream.
swEncrypt.Write(plainText);
}
encrypted = msEncrypt.ToArray();
}
}
}


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

}

static string DecryptStringFromBytes_Aes(byte[] cipherText, byte[] Key
, byte[] IV)
{
// Check arguments.
if (cipherText == null || cipherText.Length <= 0)
throw new ArgumentNullException("cipherText");
if (Key == null || Key.Length <= 0)
throw new ArgumentNullException("Key");
if (IV == null || IV.Length <= 0)
throw new ArgumentNullException("Key");

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

// Create an Aes object
// with the specified key and IV.
using (Aes aesAlg = Aes.Create())
{
aesAlg.Key = Key;
aesAlg.IV = IV;

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

// Create the streams used for decryption.
using (MemoryStream msDecrypt = new MemoryStream(cipherText))
{
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();
}
}
}

}

return plaintext;

}
}
}

یه خورده جستجو کنید مطالب خیلی خوبی از این روش رمزنگاری گیرتون میاد ، هم فارسی هم انگلیسی...

+++++++++++++++++++++++++++++++

یه چیز دیگه هم بگم : این الگوریتم روش پیاده سازیش تقریبن همینه که بالا گذاشتم ، اساس همه پیاده سازی ها اینه که بایت رو بگیری رمز نگاری کنه ببره به خروجی و عملیات معمکوسش !

negar.rafie
پنج شنبه 12 شهریور 1394, 17:15 عصر
خوب الان کلید و iv کجا وارد میشه؟

negar.rafie
پنج شنبه 12 شهریور 1394, 18:10 عصر
من این را پیدا کردم؟

http://www.aspsnippets.com/Articles/AES-Encryption-Decryption-Cryptography-Tutorial-with-example-in-ASPNet-using-C-and-VBNet.aspx

حالا یکی از اساتید لطف کنه پاسخ بده
مشکلی نداره
از همین میشه داخل پروژه های بزرگ و مهم استفاده کرد؟

این چطور
http://www.codeproject.com/Articles/769741/Csharp-AES-bits-Encryption-Library-with-Salt

negar.rafie
پنج شنبه 12 شهریور 1394, 22:04 عصر
این را امتحان کردم فقط رشته را رمز میکنه و با هر رمزی هم رمزگشایی میکنه:قهقهه:
http://www.codeproject.com/Articles/769741/Csharp-AES-bits-Encryption-Library-with-Salt
پس این به چه کاری میاد؟

ahmadreza.s
پنج شنبه 12 شهریور 1394, 23:05 عصر
با سلام
این سورس رو براتون آماده کردم ببینید

اگه مشکلی بود همینجا مطرح کنید !

negar.rafie
جمعه 13 شهریور 1394, 11:29 صبح
رمزنگاری فایل جواب نمیده
مثلا یه فیلم 1 گیگبایت را رمزنگاری میکنم خطای کمبود حافظه میده
چکار کنیم

abdullah20
جمعه 13 شهریور 1394, 16:41 عصر
برای رمزنگاری فایل های حجیم باید یکم کد را تغییر بدید
لینک های شما را من مشاهده کردم و در واقع قالب کار با AES همینه و مشکلی هم ندارند ولی در سایتهای های مختلف هر سایتی مثلا keysize را یه طور مقدار داده و تفاوت های اینگونه
من قبلا یه کلاس برای AES پیاده سازی کردم و در داخل سی شارپ استفاده کردم
و مواردی مثل:
رمزنگاری فایل برای ذخیره در دیتابیس(که بررسی شده فایل های بیشتر از 1 مگابایت رمزنگاری نشوند و ذخیره نشوند در دیتابیس)
رمز نگاری فایل های حجیم برای ذخیره در دیسک
رمزنگاری رشته
و . . .
قبلا برای چندتا از دوستان در سایت فرستادم
فکر کنم قبلا به من ایمیل زدید و ایمیل شما را دارم الان براتون ارسال میکنم