PDA

View Full Version : معرفی الگوریتم رمزنگاری برای رمزکردن اطلاعات مهم



morteza_mokhtari
شنبه 11 خرداد 1392, 11:30 صبح
سلام دوستان بنده نیاز به معرفی یک الگوریتم رمزنگاری دارم که چند تا ویژگی داشته باشه.اول بگم که اطلاعاتی که میخوام رمز بکنم خیلی مهم نیستند.میخوام شماره موبایل هایی که تویه دیتابیس ذخیره میشه به صورت رمزنگاری باشه که اگر به هر طریقی سایت هک شده هکر از اطلاعات اون نتونه استفاده کنه .چون شماره تلفن های سایت بنده ماله یک صنف خاصی هست.چون اطلاعات خیلی مهم نیست میخوام زمان رمزکردن و رمزگشایی الگوریتم خیلی زیاد نباشه.ممنون میشم یک الگوریتم رمز متقارن با ویژگی هایی که گفتم بهم معرفی کنید.

saeed_sho
شنبه 11 خرداد 1392, 17:38 عصر
میتونید از الگوریتم DES استفاده کنید

morteza_mokhtari
شنبه 11 خرداد 1392, 20:56 عصر
دوست عزیز ممنون از اینکه جواب دادید ولی فکر کنم الگوریتم Des یه کم سنگین باشه برای اینکار.الگوریتم سبکتری وجود نداره.مهم نیست که حتی الگوریتم شکسته بشه چون اطلاعاتی که میخوام رمز کنم خیلی مهم نیست فقد میخوام به صورت روزنگاری باشه و پردازش زیادی از سیستم نگیره؟ببینید شماره تلفن ها تویه سایت به همه کاربران نمایش داده میشه یعنی باید با هر بار رفرش صفحه اطلاعات رمزگشایی بشه که پردازش زیادی نیز داره.
فقد میخوام تویه دیتابیس به صورت رمز باشه که هکر یه جا تمام شماره ها رو بدست نیاره.

joker
شنبه 11 خرداد 1392, 21:11 عصر
1000 تا شماره هم باشه 1 ثانيه هم طول نميكشه. نگرانش نباش.
اما هكري كه بتونه ديتابيست را بزنه مطمئنن فايلهاي مورد استفاده نرم افزار شما و روتينهاي رمزگشائي ( كليدها ) را هم ميتونه دانلود كنه ها.... حواست به اين نكته هست ؟

morteza_mokhtari
شنبه 11 خرداد 1392, 21:13 عصر
ببنید الگوریتمی میخوام که سریع باشه و پردازش زیادی نیاز نداشته باشه.امنتیش خیلی مهم نیست.با تشکر

صباح فتحی
یک شنبه 12 خرداد 1392, 03:25 صبح
سلام از کلاس های خود دات نت استفاده کن
md5
sha1

joker
یک شنبه 12 خرداد 1392, 08:28 صبح
سلام از کلاس های خود دات نت استفاده کن
md5
sha1

الگوريتم يك طرفه به چه كارش مياد ؟!!

ببینید شماره تلفن ها تویه سایت به همه کاربران نمایش داده میشه یعنی باید با هر بار رفرش صفحه اطلاعات رمزگشایی بشه که پردازش زیادی نیز داره.



نگران پردازشش نباش ، فكر كن RSA 128 بيتي هم كه باشه ، عذا گرفتن كه نداره ، روي كاغذ كه نميخواي با دست انجام بدي ، يه پنتيوم داري با سرعت پردازش يه عالمه ، هزارتا شماره بيشتر از 1 ثانيه شد بيا كامپيوتر منو مجاني بردار برا خودت :)

صباح فتحی
یک شنبه 12 خرداد 1392, 13:08 عصر
[QUOTE=joker;1783391]الگوريتم يك طرفه به چه كارش مياد ؟!!

بله یک طرفس خوب سوالو نخوندم فکرکردم واسه ذخیره رمزلازم داره.الگوریتمِDES دوطرفه س

morteza_mokhtari
یک شنبه 12 خرداد 1392, 17:02 عصر
1000 تا شماره هم باشه 1 ثانيه هم طول نميكشه. نگرانش نباش.
اما هكري كه بتونه ديتابيست را بزنه مطمئنن فايلهاي مورد استفاده نرم افزار شما و روتينهاي رمزگشائي ( كليدها ) را هم ميتونه دانلود كنه ها.... حواست به اين نكته هست ؟

با تشکر از پاسخ هاتون میشه لطف کنید در مورد جمله بالا بیشتر توضیح بدهید.الگوریتم های کلید متقارن خیلی سریع تر از الگوریتم های نامتفارن هستند از همون DES استفاده میکنم.

morteza_mokhtari
یک شنبه 12 خرداد 1392, 17:58 عصر
using System;
using System.Security.Cryptography;
using System.IO;
using System.Text;

namespace DESDemo
{
class Program
{
static byte[] bytes = ASCIIEncoding.ASCII.GetBytes("ZeroCool");

static void Main(string[] args)
{
try
{
Console.WriteLine("Original String: ");

string originalString = Console.ReadLine();
string cryptedString = Encrypt(originalString);

Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("\nEncrypt Result: {0}", cryptedString);
Console.WriteLine("Decrypt Result: {0}", Decrypt(cryptedString));
}
catch (Exception ex)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("From: {0}.\nDetail: {1}", ex.Source, ex.Message);
}
finally
{
Console.ReadLine();
}
}

/// <summary>
/// Encrypt a string.
/// </summary>
/// <param name="originalString">The original string.</param>
/// <returns>The encrypted string.</returns>
/// <exception cref="ArgumentNullException">This exception will be thrown when the original string is null or empty.</exception>
public static string Encrypt(string originalString)
{
if (String.IsNullOrEmpty(originalString))
{
throw new ArgumentNullException("The string which needs to be encrypted can not be null.");
}

DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
MemoryStream memoryStream = new MemoryStream();
CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptoProvider.CreateEncryptor(bytes, bytes), CryptoStreamMode.Write);

StreamWriter writer = new StreamWriter(cryptoStream);
writer.Write(originalString);
writer.Flush();
cryptoStream.FlushFinalBlock();
writer.Flush();

return Convert.ToBase64String(memoryStream.GetBuffer(), 0, (int)memoryStream.Length);
}

/// <summary>
/// Decrypt a crypted string.
/// </summary>
/// <param name="cryptedString">The crypted string.</param>
/// <returns>The decrypted string.</returns>
/// <exception cref="ArgumentNullException">This exception will be thrown when the crypted string is null or empty.</exception>
public static string Decrypt(string cryptedString)
{
if (String.IsNullOrEmpty(cryptedString))
{
throw new ArgumentNullException("The string which needs to be decrypted can not be null.");
}

DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
MemoryStream memoryStream = new MemoryStream(Convert.FromBase64String(cryptedStrin g));
CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptoProvider.CreateDecryptor(bytes, bytes), CryptoStreamMode.Read);
StreamReader reader = new StreamReader(cryptoStream);

return reader.ReadToEnd();
}
}
}


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

morteza_mokhtari
دوشنبه 13 خرداد 1392, 14:41 عصر
public class AESCipher
{
public AESCipher()
{
//
// TODO: Add constructor logic here
//
}



private static int _iterations = 2;
private static int _keySize = 256;

private static string _hash = "SHA1";
private static string _salt = "mokhtari38490a32"; // Random
private static string _vector = "8947az34awl34kzd"; // Random
private static string password = "mokhtari";


public static string Encrypt(string value) {
return Encrypt<AesManaged>(value, password);
}
public static string Encrypt<T>(string value, string password)
where T : SymmetricAlgorithm, new() {
byte[] vectorBytes = ASCIIEncoding.ASCII.GetBytes(_vector);
byte[] saltBytes = ASCIIEncoding.ASCII.GetBytes(_salt);
byte[] valueBytes = UTF8Encoding.UTF8.GetBytes(value);

byte[] encrypted;
using (T cipher = new T()) {
PasswordDeriveBytes _passwordBytes =
new PasswordDeriveBytes(password, saltBytes, _hash, _iterations);
byte[] keyBytes = _passwordBytes.GetBytes(_keySize / 8);

cipher.Mode = CipherMode.CBC;

using (ICryptoTransform encryptor = cipher.CreateEncryptor(keyBytes, vectorBytes)) {
using (MemoryStream to = new MemoryStream()) {
using (CryptoStream writer = new CryptoStream(to, encryptor, CryptoStreamMode.Write)) {
writer.Write(valueBytes, 0, valueBytes.Length);
writer.FlushFinalBlock();
encrypted = to.ToArray();
}
}
}
cipher.Clear();
}
return Convert.ToBase64String(encrypted);
}

public static string Decrypt(string value) {
return Decrypt<AesManaged>(value, password);
}
public static string Decrypt<T>(string value, string password) where T : SymmetricAlgorithm, new() {
byte[] vectorBytes = ASCIIEncoding.ASCII.GetBytes(_vector);
byte[] saltBytes = ASCIIEncoding.ASCII.GetBytes(_salt);
byte[] valueBytes = Convert.FromBase64String(value);

byte[] decrypted;
int decryptedByteCount = 0;

using (T cipher = new T()) {
PasswordDeriveBytes _passwordBytes = new PasswordDeriveBytes(password, saltBytes, _hash, _iterations);
byte[] keyBytes = _passwordBytes.GetBytes(_keySize / 8);

cipher.Mode = CipherMode.CBC;

try {
using (ICryptoTransform decryptor = cipher.CreateDecryptor(keyBytes, vectorBytes)) {
using (MemoryStream from = new MemoryStream(valueBytes)) {
using (CryptoStream reader = new CryptoStream(from, decryptor, CryptoStreamMode.Read)) {
decrypted = new byte[valueBytes.Length];
decryptedByteCount = reader.Read(decrypted, 0, decrypted.Length);
}
}
}
} catch (Exception ex) {
return String.Empty;
}

cipher.Clear();
}
return Encoding.UTF8.GetString(decrypted, 0, decryptedByteCount);
}

}


سلام دوستان بنده میخوام از این الگوریتم برای رمزنگاری استفاده کنم.یه سوال کوچولو داشتم اون مقدار IV , Salt , Password رو هر مقداری میتونم بدم.آیا اندازه خاصی باید داشته باشه.با این مقدار که دادم الگوریتم درست کار میکنه.با تشکر.

morteza_mokhtari
سه شنبه 14 خرداد 1392, 22:52 عصر
دوستان لطفا راهنمایی بکنید با تشکر