PDA

View Full Version : رمزنگار با AES



masiha68
جمعه 09 خرداد 1393, 15:45 عصر
سلام دوستان
من یه فایل Asp دارم که توش واسه ی رمز نگاری از AES استفاده شده ... اومدم و کلاس رمز نگاری رو از http://www.phpaes.com/ دانلود کردم و باهاش کار کردم ...یعنی همون فایل asp رو تبدیل کردم به php ...
فقط یه مشکل داره ... توی رمزنگاری aes کلید باید مضربی از 4 باشه ...
کد من توی asp بدون اینکه مضربی از 4 باشه کار می کنه ولی توی php کار نمی کنه ...حالا اومدم کلاس رو دست کاری کردم و اون قسمت بررسی تعداد کاراکترهای کلید رو غیر فعال کردم و کار می کنه ولی همون کد رو نمی ده بیرون ...البته انتظار هم ندارم همون کد رو بده بیرون ولی نمی دونم چطوری توی فایل asp کار می کنه ولی حالا که تبدیلش کردم به php کار نمی کنه ...
کسی نظری نداره
**میخواستم کد رو بزارم ولی کد یه کم محرمانه ست و نمیشه گذاشت

Mohammadsgh
جمعه 09 خرداد 1393, 18:03 عصر
چرا از aes خود php استفاده نمیکنید؟

masiha68
جمعه 09 خرداد 1393, 18:04 عصر
چرا از aes خود php استفاده نمیکنید؟
کجاست ... من پیداش نکردم
ممنون میشم راهنمایی کنید

مهرداد سیف زاده
جمعه 09 خرداد 1393, 19:24 عصر
در مورد الگوریتم AES در مایکروسافت و زبانهای دیگر فرق میکند. در واقع مایکروسافت با یکسری توابع اومده کار رو راحت کرده ولی راهنمای خوبی برای برنامه نویسانی که میخوان با زبانهای دیگر ارتباط برقرار کنن نذاشته. مثلا در AES در زبان c یا java میتونید IV رو تحت کنترل کامل داشته و پارامترهای دقیق بهش بدید ولی در زبان دات نت با این که IV رو به برنامه نویس داده ولی باز هم با دستکاری اون در زبانهای دیگر جواب اشتباه میدهد.
با این حال تعدادی از برنامه نویسان بر اساس تجربه اومدن و یکسری کد نوشتن که تونسته مشکل رو حل کنه. من از کد زیر استفاده کردم و بین #c و php جواب گرفتم. البته دقت کنید باید mcrype برای php در سیستم شما نصب و فعال شده باشد.

http://blog.djekldevelopments.co.uk/?p=334

masiha68
جمعه 09 خرداد 1393, 19:48 عصر
در مورد الگوریتم AES در مایکروسافت و زبانهای دیگر فرق میکند. در واقع مایکروسافت با یکسری توابع اومده کار رو راحت کرده ولی راهنمای خوبی برای برنامه نویسانی که میخوان با زبانهای دیگر ارتباط برقرار کنن نذاشته. مثلا در AES در زبان c یا java میتونید IV رو تحت کنترل کامل داشته و پارامترهای دقیق بهش بدید ولی در زبان دات نت با این که IV رو به برنامه نویس داده ولی باز هم با دستکاری اون در زبانهای دیگر جواب اشتباه میدهد.
با این حال تعدادی از برنامه نویسان بر اساس تجربه اومدن و یکسری کد نوشتن که تونسته مشکل رو حل کنه. من از کد زیر استفاده کردم و بین #c و php جواب گرفتم. البته دقت کنید باید mcrype برای php در سیستم شما نصب و فعال شده باشد.

http://blog.djekldevelopments.co.uk/?p=334
فقط این فایل هاش نیست ...لینکش خرابه ...شما فایل ها رو دارین ...یا اگه میشه یه مثال بزنید

مهرداد سیف زاده
جمعه 09 خرداد 1393, 19:57 عصر
دیگه فایل میخواید چیکار من کدشو خوندم دیم درست کار میکنه رفتم به برنامه #c خودم اضافه کردم و php هم که درست نوشته شده. فقط یه ctrl+c لازم داره و بعدش ctrl+v !!!!!!!!!!!!!!

masiha68
جمعه 09 خرداد 1393, 20:02 عصر
اونجا یه iv هست رو اعصابه و اون کلید هم که زیرش نوشته باید 32 کاراکتر باشه ...
حالا اگه مثال داری توی پی اچ پی یه مثال هم بزن که دیگه رسما شرمندت شیم :)

مهرداد سیف زاده
جمعه 09 خرداد 1393, 20:15 عصر
این اومده کلید و iv رو توی فایل ریخته و بعد فایل رو در هر دو زبون php و #C فراخوانی کرده و مقدارها رو از توش برداشته شما مستقیما رشته های زیر رو در قسمت iv و key قرار بدید


key : PSVJQRk9QTEpNVU1DWUZCRVFGV1VVT0ZOV1RRU1NaWQ=
iv : YWlFLVEZZUFNaWlhPQ01ZT0lLWU5HTFJQVFNCRUJZVA=

masiha68
جمعه 09 خرداد 1393, 20:18 عصر
خب من میخوام کلا iv رو که سی شارپ استفاده میشه رو بدست بیام


Rijndael alg = Rijndael.Create(); alg.Key = Key;
alg.IV = IV;
این iv همونه ؟

مهرداد سیف زاده
جمعه 09 خرداد 1393, 20:32 عصر
آره همونه ولی وقتتو تلف نکن و از همین کد استفاده کن باور کن من یه روز حدود 15 ساعت روش وقت گذاشتم تا به این رسیدم. خیلی ها توی stackoverflow پست زده بودن و مشکلشون حل نشده بود

masiha68
جمعه 09 خرداد 1393, 20:40 عصر
آره همونه ولی وقتتو تلف نکن و از همین کد استفاده کن باور کن من یه روز حدود 15 ساعت روش وقت گذاشتم تا به این رسیدم. خیلی ها توی stackoverflow پست زده بودن و مشکلشون حل نشده بود
اخه مشکل اینجا کلید رو خودش تولید میکنه ... دارم به یجاهایی میرسم ...

مهرداد سیف زاده
جمعه 09 خرداد 1393, 20:44 عصر
اون که خودش تولید میکنه بعد نمیتونی با php رشته رو decode کنی. چون مقدارهای iv و key در هر دو زبان باید یکی باشه.
ساخت کلید و iv خودکار فقط زمانی کاربرد داره که کد شما توسط #c کد بشه و توسط #c هم decode بشه و گرنه زبانهای دیگر مقدارهای iv و key ئیشفرض اونها فرق میکنه

masiha68
جمعه 09 خرداد 1393, 20:49 عصر
من نمی خوام دی کد کنم ...فقط دارم کد فعال سازی یه نرم افزار رو با aes تولید می کنم

masiha68
شنبه 10 خرداد 1393, 15:41 عصر
دوست عزیز مطمئن هستید این iv همون iv سی شارپ هستش . من هر کاری می کنم کد درست در نمیاد

مهرداد سیف زاده
شنبه 10 خرداد 1393, 18:00 عصر
ببینید شما چه قصد دیکد و یا انکد رو داشته باشید باید طبق همین کد پیش برید و چیزی رو دست کاری نکنید.
الان دقیقا شما بگید توی چه مرحله ای هستید و چه کاری قراره انجام بدید که درست کار نمینه؟ انکد با php و دیکد با #c یا انکد با #c و دیکد با php?

masiha68
شنبه 10 خرداد 1393, 18:43 عصر
من فقط می خوام کد رو انجام بدم و قرار نیست دی کد انجام بشه
این کد سی شارپ

public class CreateCode {
public string SazBon(string MM) { string RET = "";
string[] ME = new string[25]; for (int i = 1; i < MM.Length; i += 2) { ME[i] = MM[i - 1].ToString(); } for (int j = 0; j < MM.Length; j += 2) { ME[j] = MM[j + 1].ToString(); } ME[20] = "1"; ME[21] = "OH"; ME[22] = "23"; ME[23] = "fXC"; ME[24] = "5"; ME[5] = ME[14]; ME[13] = ME[23]; ME[2] = ME[22]; ME[18] = ME[21]; ME[23] = ME[11]; ME[19] = ME[0];
foreach (string item in ME) { RET += item; }

string BACK = Encrypt(RET, RET, 256);
BACK = encryptString(BACK); return BACK; } string encryptString(string strToEncrypt) // md5 { UTF8Encoding ue = new UTF8Encoding(); byte[] bytes = ue.GetBytes(strToEncrypt);
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); byte[] hashBytes = md5.ComputeHash(bytes);
// Bytes to string return System.Text.RegularExpressions.Regex.Replace (BitConverter.ToString(hashBytes), "-", "").ToLower(); }

private byte[] Encrypt(byte[] clearData, byte[] Key, byte[] IV) {
MemoryStream ms = new MemoryStream();
Rijndael alg = Rijndael.Create(); alg.Key = Key;
alg.IV = IV; CryptoStream cs = new CryptoStream(ms, alg.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(clearData, 0, clearData.Length); cs.Close(); byte[] encryptedData = ms.ToArray(); return encryptedData; } byte[] A;

private string Encrypt(string Data, string Password, int Bits) {
byte[] clearBytes = System.Text.Encoding.Unicode.GetBytes(Data);
PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password,
new byte[] { 0x00, 0x01, 0x02, 0x1C, 0x1D, 0x1E, 0x03, 0x04, 0x05, 0x0F, 0x20, 0x21, 0xAD, 0xAF, 0xA4 });
if (Bits == 128) { byte[] encryptedData = Encrypt(clearBytes, pdb.GetBytes(16), pdb.GetBytes(16)); return Convert.ToBase64String(encryptedData); } else if (Bits == 192) { byte[] encryptedData = Encrypt(clearBytes, pdb.GetBytes(24), pdb.GetBytes(16)); return Convert.ToBase64String(encryptedData); } else if (Bits == 256) { byte[] encryptedData = Encrypt(clearBytes, pdb.GetBytes(32), pdb.GetBytes(16)); return Convert.ToBase64String(encryptedData); } else { return string.Concat(Bits); } } // AES }

Mohammadsgh
شنبه 10 خرداد 1393, 19:25 عصر
در مورد الگوریتم AES در مایکروسافت و زبانهای دیگر فرق میکند. در واقع مایکروسافت با یکسری توابع اومده کار رو راحت کرده ولی راهنمای خوبی برای برنامه نویسانی که میخوان با زبانهای دیگر ارتباط برقرار کنن نذاشته. مثلا در AES در زبان c یا java میتونید IV رو تحت کنترل کامل داشته و پارامترهای دقیق بهش بدید ولی در زبان دات نت با این که IV رو به برنامه نویس داده ولی باز هم با دستکاری اون در زبانهای دیگر جواب اشتباه میدهد.
با این حال تعدادی از برنامه نویسان بر اساس تجربه اومدن و یکسری کد نوشتن که تونسته مشکل رو حل کنه. من از کد زیر استفاده کردم و بین #c و php جواب گرفتم. البته دقت کنید باید mcrype برای php در سیستم شما نصب و فعال شده باشد.

http://blog.djekldevelopments.co.uk/?p=334
ببخشید من میخوام داده ها رو تو php با aes رمز نگاری کنم.چجوری با این تابع کار کنم؟

مهرداد سیف زاده
شنبه 10 خرداد 1393, 19:39 عصر
برای انکد کردن از این کد استفاده کنید
اگر مشکلتون حل نشد با skype یا team ارتباط برقرار کنیم.


private String AES_encrypt(String Input)
{
string key = "PSVJQRk9QTEpNVU1DWUZCRVFGV1VVT0ZOV1RRU1NaWQ=";
string iv = "YWlFLVEZZUFNaWlhPQ01ZT0lLWU5HTFJQVFNCRUJZVA=";


var aes = new RijndaelManaged();
aes.KeySize = 256;
aes.BlockSize = 256;
aes.Padding = PaddingMode.PKCS7;
aes.Key = Convert.FromBase64String(key);
aes.IV = Convert.FromBase64String(iv);


var encrypt = aes.CreateEncryptor(aes.Key, aes.IV);
byte[] xBuff = null;
using (var ms = new MemoryStream())
{
using (var cs = new CryptoStream(ms, encrypt, CryptoStreamMode.Write))
{
byte[] xXml = Encoding.UTF8.GetBytes(Input);
cs.Write(xXml, 0, xXml.Length);
}


xBuff = ms.ToArray();
}


String Output = Convert.ToBase64String(xBuff);
return Output;
}













من فقط می خوام کد رو انجام بدم و قرار نیست دی کد انجام بشه
این کد سی شارپ

public class CreateCode {
public string SazBon(string MM) { string RET = "";
string[] ME = new string[25]; for (int i = 1; i < MM.Length; i += 2) { ME[i] = MM[i - 1].ToString(); } for (int j = 0; j < MM.Length; j += 2) { ME[j] = MM[j + 1].ToString(); } ME[20] = "1"; ME[21] = "OH"; ME[22] = "23"; ME[23] = "fXC"; ME[24] = "5"; ME[5] = ME[14]; ME[13] = ME[23]; ME[2] = ME[22]; ME[18] = ME[21]; ME[23] = ME[11]; ME[19] = ME[0];
foreach (string item in ME) { RET += item; }

string BACK = Encrypt(RET, RET, 256);
BACK = encryptString(BACK); return BACK; } string encryptString(string strToEncrypt) // md5 { UTF8Encoding ue = new UTF8Encoding(); byte[] bytes = ue.GetBytes(strToEncrypt);
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); byte[] hashBytes = md5.ComputeHash(bytes);
// Bytes to string return System.Text.RegularExpressions.Regex.Replace (BitConverter.ToString(hashBytes), "-", "").ToLower(); }

private byte[] Encrypt(byte[] clearData, byte[] Key, byte[] IV) {
MemoryStream ms = new MemoryStream();
Rijndael alg = Rijndael.Create(); alg.Key = Key;
alg.IV = IV; CryptoStream cs = new CryptoStream(ms, alg.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(clearData, 0, clearData.Length); cs.Close(); byte[] encryptedData = ms.ToArray(); return encryptedData; } byte[] A;

private string Encrypt(string Data, string Password, int Bits) {
byte[] clearBytes = System.Text.Encoding.Unicode.GetBytes(Data);
PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password,
new byte[] { 0x00, 0x01, 0x02, 0x1C, 0x1D, 0x1E, 0x03, 0x04, 0x05, 0x0F, 0x20, 0x21, 0xAD, 0xAF, 0xA4 });
if (Bits == 128) { byte[] encryptedData = Encrypt(clearBytes, pdb.GetBytes(16), pdb.GetBytes(16)); return Convert.ToBase64String(encryptedData); } else if (Bits == 192) { byte[] encryptedData = Encrypt(clearBytes, pdb.GetBytes(24), pdb.GetBytes(16)); return Convert.ToBase64String(encryptedData); } else if (Bits == 256) { byte[] encryptedData = Encrypt(clearBytes, pdb.GetBytes(32), pdb.GetBytes(16)); return Convert.ToBase64String(encryptedData); } else { return string.Concat(Bits); } } // AES }

masiha68
شنبه 10 خرداد 1393, 19:43 عصر
برای انکد کردن از این کد استفاده کنید
اگر مشکلتون حل نشد با skype یا team ارتباط برقرار کنیم.


private String AES_encrypt(String Input)
{
string key = "PSVJQRk9QTEpNVU1DWUZCRVFGV1VVT0ZOV1RRU1NaWQ=";
string iv = "YWlFLVEZZUFNaWlhPQ01ZT0lLWU5HTFJQVFNCRUJZVA=";


var aes = new RijndaelManaged();
aes.KeySize = 256;
aes.BlockSize = 256;
aes.Padding = PaddingMode.PKCS7;
aes.Key = Convert.FromBase64String(key);
aes.IV = Convert.FromBase64String(iv);


var encrypt = aes.CreateEncryptor(aes.Key, aes.IV);
byte[] xBuff = null;
using (var ms = new MemoryStream())
{
using (var cs = new CryptoStream(ms, encrypt, CryptoStreamMode.Write))
{
byte[] xXml = Encoding.UTF8.GetBytes(Input);
cs.Write(xXml, 0, xXml.Length);
}


xBuff = ms.ToArray();
}


String Output = Convert.ToBase64String(xBuff);
return Output;
}


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

مهرداد سیف زاده
شنبه 10 خرداد 1393, 19:52 عصر
دیگه تبدیل به php یعنی چی؟ کجا قراره به php تبدیل بشه؟ کد #c بره توی php? آخه اون بنده خدا هم انکد و دیکد رو به php نوشته و هم به #c حالا شما هر کدوم رو میخوای استفاده کن.
منظورتون اینه که برنامه #c برای aes در هنگام انکد کردن یه کلید تصادفی تولید کنه و برنامه php به توسط اون کد بیاد رشته رو دیکد کنه؟
اگر امکان داره یه مثال عملی بزندید

masiha68
شنبه 10 خرداد 1393, 19:57 عصر
دیگه تبدیل به php یعنی چی؟ کجا قراره به php تبدیل بشه؟ کد #c بره توی php? آخه اون بنده خدا هم انکد و دیکد رو به php نوشته و هم به #c حالا شما هر کدوم رو میخوای استفاده کن.
منظورتون اینه که برنامه #c برای aes در هنگام انکد کردن یه کلید تصادفی تولید کنه و برنامه php به توسط اون کد بیاد رشته رو دیکد کنه؟
اگر امکان داره یه مثال عملی بزندید
منظورم از تبدیل به پی اچ پی اینه که این کد توی سی شارپ چیکار می کنه ما هم بیاییم و معادلش رو بنویسیم تا همون کد فعال سازی رو تولید کنه .
توی سی شارپ و با اون کلاس کد هارد یوزر رو می گیره و یه کد فعال سازی تولید می کنه ... حالا من میخوام همون کد فعال سازی رو با پی اچ پی تولید کنم .
فقط توی سی شارپ بعضی از قسمت های رمز نگاری مثل iv توسط خود سیستم تولید میشه و کاربر کاری بهشون نداره ..ولی توی پی اچ پی باید همه ی قسمت ها رو کاربر به سیستم رمز نگاری بده ...
کجای حرفام نا مفهومه بود بگین بیشتر توضیح بدم .

masiha68
شنبه 10 خرداد 1393, 20:01 عصر
مثلا کد هارد من اینه 0xxXX5175717E17177x1 و کدی که توی سی شارپ تولید میشه اینه :(همون کد فعال سازی ) :9df0dcd6e95e66983edf55834cbca3f0
حالا من اومدم و کلاس رو باز نویسی کردم ولی بازم این کد فعال سازی رو نمی ده ...اینو میده :1e47496d13b0cab6cfcc769accdbdc0d

masiha68
شنبه 10 خرداد 1393, 20:03 عصر
این هم کلاسی که من ساختم از رو کلاس سی شارپ ::


<?php function SazBon($MM) { // $z = "abcdefgh01234567"; $RET = "";
// $ME[] = array();
for ($i = 1; $i < strlen($MM); $i += 2) { $ME[$i] = $MM[$i - 1]; } for ($j = 0; $j < strlen($MM); $j += 2) { $ME[$j] = $MM[$j + 1]; } $ME[20] = "9"; $ME[21] = "PM"; $ME[22] = "89"; $ME[23] = "fXC"; $ME[24] = "5"; $ME[5] = $ME[14]; $ME[13] = $ME[23]; $ME[2] = $ME[22]; $ME[18] = $ME[21]; $ME[23] = $ME[11]; $ME[19] = $ME[0];
foreach ($ME as $item ) { $RET .= $item; }
return $RET =strtolower($RET);

}
$key=SazBon('0xxXX5175717E17177x1'); echo $key."<br>";$iv = 'YWlFLVEZZUFNaWlhPQ01ZT0lLWU5HTFJQVFNCRUJZVA=';//$iv=file($iv);$do=strtolower(base64_encode(mcrypt_ encrypt(MCRYPT_RIJNDAEL_256,base64_decode($key),ad dpadding($key), MCRYPT_MODE_CBC,base64_decode($iv)))); echo md5(mb_convert_encoding($do, "UTF-8"))."<hr>";function addpadding($string, $blocksize = 32){$len = strlen($string);$pad = $blocksize - ($len % $blocksize);$string .= str_repeat(chr($pad), $pad);return $string;}
function strippadding($string){$slast = ord(substr($string, -1));$slastc = chr($slast);$pcheck = substr($string, -$slast);if(preg_match("/$slastc{".$slast."}/", $string)){$string = substr($string, 0, strlen($string)-$slast);return $string;} else {return false;}}
function encrypt($string = ""){$keyfile = "./AES.keyz";$keyfile = file($keyfile);//$key = base64_decode($keyfile[0]);$iv = base64_decode($keyfile[1]);
return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, base64_decode($key), addpadding($string), MCRYPT_MODE_CBC, $iv));}

?>

مهرداد سیف زاده
شنبه 10 خرداد 1393, 20:12 عصر
توی php لازم نیست شما چیزی رو دست کاری کنید و همینطور لازم هم نیست چیزی از پایه بنویسید یا کدی رو شبیه سازی کنید. همچنین فک کنم شما مساله رو اشتباه گرفتید.
ببینید aes یک متن ساده رو تبدیل به رشته نا مفهوم میکنه در واقع الگوریتم رمز نگاری هست. هسته اصلی این الگوریتم رمز نگاری openssl هست.
مثلا رشته abcd اگر به aes بدید امکان داره رشته ای شبیه EECZVfrgZDDXSD545cvv== تولید کنه حالا شما با این رشته ای که دارید و با توجه به iv و key این رشته رو دیکد میکنید و برمیگردونید به abcd و چیزی غیر از این نیست.
حالا سناریو و پروژه ها با هم فرق میکنن شاید شما مخواید یه کد فعال سازی منحصر به فرد برای هر کاربر تولید کنید و یا چه میدونم شماره سریال هارد رو بدست بیارید و کارای دیگه انجام بدید که از دست aes برنمیاد و این الگوریتم فقط برای کاری هست که گفتم

حالا شاید منظورتون این هست که بعد از گفتن سریال هارد توسط #c در دستکتاپ این سریال انکد بشه و در برای سایت ارسال بشه. خب این هم مشکلی نداره چون اگر طبق کد معرفی شده کار کنی و از توابع انکد و دیکد گفته شده استفاده کنی مشکلی نداری. همچنین اون روش regindal سی شارپ رو که نوشتی بیشتر برای ارتباط با زبان c کاربرد داره و برای php ئارامترهای کد معرفی شده بهتر هستن.

masiha68
شنبه 10 خرداد 1393, 20:23 عصر
من از پایه چیزی رو ننوشتم و نگفتم لازمه از پایه نوشته بشه ... فقط می گم توی سی شارپ اون iv لازم نیست( Encrypt(RET, RET, 256 دقت کنید توی سی شارپ سه تا اروگومان می گیره ولی توی پی اچ پی
(mcrypt_encrypt(MCRYPT_RIJNDAEL_256,base64_decode( $key),addpadding($key), MCRYPT_MODE_CBC,base64_decode($iv)
4 تا اروگان می گیره که اون iv اضافه هستش . توی سی شارپ iv رو خودش تولید می کنه ولی توی پی اچ پی کاربر باید iv رو تولید کنه . حالا من اومدم از رو گفته ی شما اون iv رو که سی شارپ خودش تولید می کنه توی تابع پی اچ پی گذاشتم و حالا باید کد تولید شده یکسان باشه که نیست
کل روال کار هم ایطوریه که یوزر برنامه رو دانلود می کنه و بعد از یه مدت برنامه غیر فعال میشه و از کاربر کد فعال سازی می خواد . که کد هارد سیستم رو میده به یوزر ...یوزر اون کد هارد رو میاره توی سایت و با الگوریتم ما کد فعال سازی رو بهش میدیم . حالا میره روی برنامه و کد رو وارد می کنه و صحت کد توسط اون کلاس سی شارپ ( دقت کنید که کلاس سی شارپ کد فعال سازی رو دی کد نمی کنه ...اونم میاد کد هارد رو می گیره و اون رو تبدیل می کنه به کد فعال سازی و بعد با کد فعال سازیی که یوزر از سایت دریافت کرده بررسی می کنه ) بررسی می کنه و در صورتی که درست بود برنامه اکتیو میشه

eshpilen
دوشنبه 12 خرداد 1393, 10:09 صبح
بنده وقت ندارم روی این قضیه کار کنم، ولی این نتیجه در جستجوی ساده گوگل بنظر قابل توجه میاد: http://www.example-code.com/vcpp/crypt2_aes_matchPhp.asp
گفته اگر رمز کردن در دات نت رو بر اساس نمونه کدهایی که نشون داده انجام بدید، نتیجش با رمزی که در PHP با استفاده از mcrypt بدست میاد یکسانه.
بعنوان نمونه کد رمز کردن در PHP با mcrypt هم ظاهرا اینو معرفی میکنه: http://www.chilkatsoft.com/p/php_aes.asp

البته من بیش از این دیگه وقت نکردم کدها رو چک کنم که از نظر اصول و امنیت رمزنگاری مشکلی نداشته باشن (معمولا این کار رو میکنم). پس بقیش دیگه با خودتون؛ رمزنگاری جزییات و ظرایف مهم زیادی داره که احتمال اشتباه در این زمینه توسط هیچ کس و هیچ منبعی کم نیست.

masiha68
دوشنبه 12 خرداد 1393, 10:11 صبح
ممنون
یه دور دیگه این کدها رو هم تست می کنم ببینم جواب میده ... مزاحمتون میشم

eshpilen
دوشنبه 12 خرداد 1393, 10:11 صبح
راستی برای تولید و چک کردن کد فعال سازی چرا از هش استفاده نکردید؟
اینطوری دیگه این دردسرهاتون هم خیلی کمتر میشد.

masiha68
دوشنبه 12 خرداد 1393, 10:17 صبح
راستی برای تولید و چک کردن کد فعال سازی چرا از هش استفاده نکردید؟
اینطوری دیگه این دردسرهاتون هم خیلی کمتر میشد.
می دونم ... اما این بنده خدا که برنامه رو ساخته یه کلاس گرفته داره ازش استفاده می کنه و هیچ وقت هم نیومده نگاه کننه ببینه چی توشه ... و قبلا هم سایتش asp بوده که بازم همون کلاس رو داده و بدون هیچ مشکلی ازش استفاده شده ولی حالا که میخوام سایت php رو درست کنم مجبور شدم برم اون کلاس رو تحلیل کنم و تموم روش های رمز نگاری رو که aes هم جزوشنه و بر اساس php پیاده کنم و تنها قسمت مشکل دارش همون aes هستش که مقدار تولیدیش با php فرق میکنه .
الانم نمی تونه الگوریتم کدفعال سازی رو تغییر بده و مجبورم من همون کلاس رو توی php هم پیاده کنم

eshpilen
دوشنبه 12 خرداد 1393, 10:26 صبح
پس تنها راهی که بنظرم میرسه اینه که ببینی فرق رمزگذاری دات نت با PHP چیه، بعد بیای دقیقا همون رو در PHP پیاده سازی کنی، یا اگر بشه کد آماده ای چیزی باشه یا با دستکاری کدهای موجود بتونی به همون نتیجه برسی، که اینم طبیعتا نیاز به تحقیق و تست و احتمالا وارسی سطح پایین (در سطح بایت و بیت) و البته بازم احتمالا، احاطه بر الگوریتم AES و مسائل امنیتی رمزنگاری داره! البته لزوما کار زیادی نمیبره، ولی چیز ساده ای هم نیست که روی هوا بشه حدس زد و فورا دانست که کجا چه کدی رو چطوری باید نوشت یا تغییر داد.

ظاهرا مشکل یه جایی در به اصطلاح Padding است. یعنی احتمالا یه جایی که بلاک آخری چیزی فضای خالی داره، PHP میاد و با کاراکترهای Null (مقدار باینری 0) اونا رو ست میکنه، ولی ظاهرا دات نت یک استاندارد دیگر داره. البته من از این قضیه مطمئن نیستم، ولی تاجاییکه در اون کد اشاره شده ممکنه به این قضیه ربط داشته باشه (شاید بازهم نکات دیگری در جاهای دیگری باشن).
بهرحال الگوریتم رمزنگاری AES در دات نت و PHP که اساسا متفاوت نیست، بلکه یک جزییات فرعی مثل همین باید متفاوت باشه که چنین مشکل ناسازگاری رو ایجاد کرده. البته Block mode رمزنگاری هم باید یکسان باشه (مثلا هر دو CBC باشن).

masiha68
دوشنبه 12 خرداد 1393, 10:30 صبح
پس تنها راهی که بنظرم میرسه اینه که ببینی فرق رمزگذاری دات نت با PHP چیه، بعد بیای دقیقا همون رو در PHP پیاده سازی کنی، یا اگر بشه کد آماده ای چیزی باشه یا با دستکاری کدهای موجود بتونی به همون نتیجه برسی، که اینم طبیعتا نیاز به تحقیق و البته احتمالا احاطه بر الگوریتم و مسائل امنیتی رمزنگاری داره! البته لزوما کار زیادی نمیبره، ولی چیز ساده ای هم نیست که روی هوا بشه حدس زد و فورا دانست که کجا چه کدی رو چطوری باید نوشت یا تغییر داد.

ظاهرا مشکل یه جایی در به اصطلاح Padding است. یعنی احتمالا یه جایی که بلاک آخری چیزی فضای خالی داره، PHP میاد و با کاراکترهای Null (مقدار باینری 0) اونا رو ست میکنه، ولی ظاهرا دات نت یک استاندارد دیگر داره. البته من از این قضیه مطمئن نیستم، ولی تاجاییکه در اون کد اشاره شده ممکنه به این قضیه ربط داشته باشه (شاید بازهم نکات دیگری در جاهای دیگری باشن).
دقیقا بحث سر همینه .... اروگان اخری که همون iv هست توی سی شارپ خودکار تولید میشه ولی توی php باید اون رو خودت تولید کنی ... سه روز روش کار کردم به نتیجه ای نرسیدم ...تموم نت رو هم گشتم ولی بازم درست نشد . الان دارم سعی می کنم یه صفحه asp بسازم که مقدار کد رو بهش بدم و اون بیاد کد فعال سازی رو بهم بده و این صفحه رو با curl توی سایت لود کنم و ازش استفاده کنم ... راه حل خوبی نیست ولی چاره ای ندارم .

eshpilen
دوشنبه 12 خرداد 1393, 10:38 صبح
یخورده این حرفهایی که میزنی مشکوکه.
IV باید برای هر رمزنگاری متفاوت باشه (رندومه).
بعد من نفهمیدم چکار میکنید دقیقا.
مثلا شماره سریال هارد طرف رو با کلید محرمانهء خودتون رمز میکنید و بعنوان لایسنس میفرستید به نرم افزار سمت کلاینت، بعد موقع Verify کردن (توسط برنامهء سمت کلاینت) دوباره میاد و سریال هارد رو رمز میکنه و با اون رمز لایسنس مقایسه میکنه. اگر اینطور باشه، باید IV استفاده شده در اون فرایند رمزگذاری سمت کلاینت هم یکسان باشه، وگرنه رمز خروجی متفاوت خواهد بود. اما پس IV اولیه رو از کجا میارید؟ خب این IV بطور استاندارد به ابتدای رمز تولید شده اضافه شده و میشه جداش کرد (چیز محرمانه ای نیست).

اما اگر شما بجای اینکه دوباره رمز (encrypt) کنید و رمزها رو با هم مقایسه کنید (که نیاز به استخراج و ست کردن IV استفاده شده در رمز اول داره)، میامدید و decrypt میکردید، اونوقت نیاز به استخراج و ست کردن مجدد IV نبود، چون بطور معمول الگوریتم decrypt کننده خودش اینطور کارها رو باید انجام بده. اینطوری شاید با PHP هم به مشکلی برنمیخوردید (یکسان بودن دقیق متن رمزی تضمین شده نیست، اما نتیجهء decrypt باید همیشه یکسان باشه (البته درصورت موفقیت آمیز بودن عملیات decrypt)).

masiha68
دوشنبه 12 خرداد 1393, 10:43 صبح
برداشت من از حرف شما اینه ...وقتی اینکریپ و دیکریپ همزمان باشه و با یه iv ثابت پس مقدار iv هرچی باشه فرقی نمی کنه چون اضافه میشه و کم میشه

راستی از سی شارپ سر در میارین؟

masiha68
دوشنبه 12 خرداد 1393, 10:46 صبح
private byte[] Encrypt(byte[] clearData, byte[] Key, byte[] IV)
{


MemoryStream ms = new MemoryStream();


Rijndael alg = Rijndael.Create();
alg.Key = Key;


alg.IV = IV;
CryptoStream cs = new CryptoStream(ms, alg.CreateEncryptor(), CryptoStreamMode.Write);


cs.Write(clearData, 0, clearData.Length);
cs.Close();
byte[] encryptedData = ms.ToArray();
return encryptedData;
}
byte[] A;

این قسمت استفاده از aes هستش اگه درست فهمیده باشم ...

eshpilen
دوشنبه 12 خرداد 1393, 11:05 صبح
بخوایم بحث کنیم تا فردا باید سروکله بزنیم. چون منم حرفای شما رو متوجه نمیشم!
بنظرم همون راهکار موقتی که گفتی فعلا داشته باشی بهتره.
چون بنظر نمیرسه الگوریتم این سیستم در کل اصولی و بدون نقص باشه.
مثلا IV نباید یک چیز فیکس شده باشه، بلکه در هر بار عملیات رمزگذاری باید یک IV جدید بصورت رندوم تولید و استفاده بشه، درحالیکه در کدی که شما قبلا درج کردید ظاهرا از یک IV فیکس شده برای تمام رمزنگاری ها استفاده شده.
حالا بخوایم روی یکسان شدن رمز تولید شده توسط دات نت و PHP کار کنیم شاید زیاد هم سخت نباشه و به نتیجه برسه، ولی چون بنظر میاد بقیهء الگوریتم از نظر اصول و امنیت بی نقص نیست، شک دارم ارزشش رو داشته باشه، مگر به دلایل فنی غیر امنیتی.

مهرداد سیف زاده
دوشنبه 12 خرداد 1393, 13:24 عصر
یکسان گرفتن iv و key در این کد ارایه شده برای تست و راه اندازی کد و دیکد کردن متن هست ولی هم از همین کد برای رمزنگاری استفاده کردم ولی هر بار iv و key دیگری بهش میدم. و این iv و key رو از طریق کانال دیگه ای و روش دیگری براش ارسال میکنم. شما کد #c رو با #c که ارایه شده هماهنگ کنید و باز هم تاکید خودتون رو درگیر این ماجرا نکنید چون مایکروسافت برای استفاده از این الگوریتم یکسری تغییرات داده که در واقع کار استاندارد رو به یه چیز غیر استاندارد تبدیل کرده و اگر شما رشته ای رو در #c کد کنید و key و iv رو داشته باشید در زبانهای دیگه مثل c یا php چیز دیگری خواهد داد
باز هم تاکید میکنم این کدهای توی نت بر اساس تجربه نوشته شده

masiha68
دوشنبه 12 خرداد 1393, 18:03 عصر
ممنون از همگی ...مجبور شدم یه راه میانبر دیگه برم .

و بلاخره حل