PDA

View Full Version : سوال: الگوریتم RSA



Hesamzadeh
پنج شنبه 30 تیر 1390, 10:27 صبح
در RSA مطابق الگوریتم، متن رمز شده توسط کلید عمومی باید توسط کلید خصوصی رمزگشایی بشه و متن رمز شده توسط کلید خصوصی هم توسط کلید عمومی رمز گشایی بشه
مشکلی که من دارم اینه که در دات نت این اتفاق نمیافته و فقط متن رمز شده توسط کلید عمومی قابلیت بازگشایی توسط کلید خصوصی را دارد و برعکسش امکان پذیر نیست علت این موضوع چیه؟

Nima NT
پنج شنبه 30 تیر 1390, 11:09 صبح
اگر اشتباه نکنم برعکش نباید اتفاق بافته و همیشه متن رمز شده توسط کلید خصوصی توسط کلید عمومی رمزگشایی میشه.

Hesamzadeh
پنج شنبه 30 تیر 1390, 11:19 صبح
درسته ولی مشکل اینه که این اتفاق نمی افته و متن رمز شده با <کلید خصوصی> فقط با <کلید خصوصی> میتونه باز بشه

Nima NT
پنج شنبه 30 تیر 1390, 11:21 صبح
شاید اشتباهی در کد نویسی شما رخ داده باشه چون قاعدتا" نباید اینچنین باشه ، اگر براتون مقدر هست قطعه کدی که اینکار رو انجام میده رو قرار بدید تا با هم بررسی کنیم.

Hesamzadeh
پنج شنبه 30 تیر 1390, 11:52 صبح
برای ساختن کلیدها از این کد:

using System;
using System.Security.Cryptography;

namespace RSAEncryptionUtilities
{
// A struct representing the pair of
// public and private keys
public struct RSAKeys
{
public string RSAPrivateKey;
public string RSAPublicKey;
}

// A static class to generate the RSAKeys pair
public class RSAKeyGenerator
{
private RSACryptoServiceProvider RSA;
public RSAKeys GetNewKeys(int KeySize)
{
// Keys shorter than 48 or longer than 128 bytes
// are not guarantted supported.
if (KeySize < 48) KeySize = 48;
if (KeySize > 2048) KeySize = 2048;

RSA = new RSACryptoServiceProvider(KeySize * 8);
RSAKeys keys = new RSAKeys();
keys.RSAPrivateKey = RSA.ToXmlString(true);
keys.RSAPublicKey = RSA.ToXmlString(false);

return keys;
}
}

اگر زحمتی نیست ممکنه کل solution رو قرار بدم؟

Hesamzadeh
پنج شنبه 30 تیر 1390, 12:14 عصر
و برای رمزنگاری و رمز گشایی :

namespace RSAEncryptionUtilities
{
public class RSAEncryptor
{
private RSACryptoServiceProvider RSA;
public RSAEncryptor(string RSAKey)
{
RSA = new RSACryptoServiceProvider();
RSA.FromXmlString(RSAKey);
}

public int GetMaxEncryptionChunkSize()
{
return RSA.KeySize / 8 - 11;
}

public byte[] Encrypt(byte[] OriginalBytes)
{
int maxLength = GetMaxEncryptionChunkSize();
int dataLength = OriginalBytes.Length;
int iterations = dataLength / maxLength;

System.Collections.ArrayList arrayList =
new System.Collections.ArrayList();
for (int i = 0; i <= iterations; i++)
{
int chunkSize =
(dataLength - maxLength * i > maxLength) ?
maxLength : dataLength - maxLength * i;
if (chunkSize == 0) { break; }

byte[] tempBytes =
new byte[chunkSize];
System.Buffer.BlockCopy(OriginalBytes, maxLength * i,
tempBytes, 0, tempBytes.Length);
byte[] encriptedBytes = RSA.Encrypt(tempBytes, false);

System.Array.Reverse(encriptedBytes);
arrayList.AddRange(encriptedBytes);
}

return (byte[])arrayList.ToArray(Type.GetType("System.Byte"));
}
}

// A class to decrypt data
public class RSADecryptor
{
private RSACryptoServiceProvider RSA;
public RSADecryptor(string RSAPrivateKey)
{
RSA = new RSACryptoServiceProvider();
RSA.FromXmlString(RSAPrivateKey);
}

public int GetEncryptedChunkSize()
{
return RSA.KeySize / 8;
}

public byte[] Decrypt(byte[] EncriptedBytes)
{
int EncriptedChunckSize = GetEncryptedChunkSize();
int dataLength = EncriptedBytes.Length;
int iterations = dataLength / EncriptedChunckSize;

System.Collections.ArrayList arrayList =
new System.Collections.ArrayList();
for (int i = 0; i < iterations; i++)
{
byte[] tempBytes = new byte[EncriptedChunckSize];
System.Buffer.BlockCopy(EncriptedBytes,
EncriptedChunckSize * i,
tempBytes, 0, tempBytes.Length);
System.Array.Reverse(tempBytes);

arrayList.AddRange(RSA.Decrypt(tempBytes, false));
}

return (byte[])arrayList.ToArray(Type.GetType("System.Byte"));
}
}
}





using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RSAEncryptionUtilities;

namespace ClassEncryption
{
public class ClassBase64Encryption
{
private string EncryptedBase64String = String.Empty;

public string PrivateKeyEncryption(string ClearText, string PrivateKey)
{
string TextToEncypt = ClearText.Trim();
try
{
string EncryptionKey = PrivateKey;
RSAEncryptor encryptor = new RSAEncryptor(PrivateKey);
byte[] OriginalBytes = System.Text.Encoding.UTF8.GetBytes(TextToEncypt);
byte[] EncryptedBytes = encryptor.Encrypt(OriginalBytes);
EncryptedBase64String = System.Convert.ToBase64String(EncryptedBytes);
return EncryptedBase64String;
}
catch (Exception ex)
{
return ex.Message;
}
}
}




using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RSAEncryptionUtilities;

namespace ClassDecryption
{
public class ClassBase64Decryption
{
public string PrivateKeyDecryption(string CipherText, string PrivateKey)
{
string Base64ToDecrypt = CipherText.Trim();
string DecryptedText = String.Empty;
try
{
string EncryptionKey = PrivateKey;
RSADecryptor decryptor = new RSADecryptor(EncryptionKey);
byte[] EncryptedBytes = System.Convert.FromBase64String(Base64ToDecrypt);
byte[] DecryptedBytes = decryptor.Decrypt(EncryptedBytes);
DecryptedText = System.Text.Encoding.UTF8.GetString(DecryptedBytes );
return DecryptedText;
}
catch (Exception ex)
{
return ex.Message;
}
}
}

Nima NT
پنج شنبه 30 تیر 1390, 12:51 عصر
اگر زحمتی نیست ممکنه کل solution رو قرار بدم؟
نه چه زحمتی مشکلی نداره ، البته فعلا" این کدها که صحیح به نظر میان و نباید مشکلی داشته باشن.

Hesamzadeh
پنج شنبه 30 تیر 1390, 13:08 عصر
ممنون از لطف شما
پروژه با VS2010 هست:
72754

Hesamzadeh
جمعه 31 تیر 1390, 19:45 عصر
دوستان کسی نتونست مشکل کدها رو پیدا کنه که چرا متن رمز شده با کلید خصوصی با کلید عمومی رمزگشایی نمیشه؟

Nima NT
جمعه 31 تیر 1390, 19:59 عصر
بنده کمی به کدهاتون نگاه کردم به نظر مشکل خاصی نباید داشته باشن ولی مساله اینجاست که متن کد شده با کلید عمومی میتونه با کلید خصوصی رمزگشایی بشه که این به نظر درست نمیاد یه کم و کمی گیج کننده هستش ولی واسه امنیت فرقی نمیکنه فقط جاهاشون فرق کرده.

Hesamzadeh
جمعه 31 تیر 1390, 20:29 عصر
به خاطر وقتی که گذاشتید ممنونم
ولی مگه الگوریتم RSA اینطور نیست که زوج کلید بدست آمده هر کدام باید بتوانند فقط و فقط متن رمز شده با کلید دیگر را رمز گشایی کنند؟
به عنوان مثال دو عدد اول p=11 و q=13 داریم n=143 و
کلید خصوصی میشود {103,143}
کلید عمومی میشود {7,143}
حالا مطابق فرمول برای رمز نگاری مثلا عدد 9 با کلید خصوصی داریم:
9 به توان 103 باقیمانده بر 143 که برابر متن رمز شده 113 میشه و برای رمز گشایی میشود 113 به توان 7 باقیمانده بر 143 که برابر متن اولیه 9 هستش
و مجددا برای رمز نگاری با کلید عمومی داریم:
9 به توان 7 باقیمانده بر 143 که برابر متن رمز شده 48 میشه و برای رمز گشایی میشود 48 به توان 103 باقیمانده بر 143 که برابر متن اولیه 9 میشه

حالا توابع دات نت چطوری عمل میکنند که خلاف فرمول RSA هست؟

linux
یک شنبه 02 مرداد 1390, 00:10 صبح
keys.RSAPrivateKey در برنامه شما دربردارنده کلید خصوصی و هم کلید عمومی هست. مشکل از اینجاست!

Hesamzadeh
یک شنبه 02 مرداد 1390, 16:58 عصر
خیلی ممنون ولی کدام یک از تگها باید حذف بشن تا درست کار کنه و چطوری میشه اینکار رو کرد چون من وقتی به صورت دستی حذفشون میکنم خطای زیر رو میده:

does not contain a valid encoding of the 'RSA' 'Modulus' parameter.

linux
یک شنبه 02 مرداد 1390, 20:34 عصر
خیلی ممنون ولی کدام یک از تگها باید حذف بشن تا درست کار کنه و چطوری میشه اینکار رو کرد چون من وقتی به صورت دستی حذفشون میکنم خطای زیر رو میده:

does not contain a valid encoding of the 'RSA' 'Modulus' parameter.
سوال این هست که چه احتیاجی به این کار دارید؟!
برای رمز کردن داده هایی با حجم زیاد کلا rsa خوب نیست و خیلی کند خواهد بود برای رمز کردن حجم زیاد داده ها از یکی از الگوریتم های متقارن باید استفاده کنید.
و سپس کلید رمز را با الگوریتم RSA رمز کنید و کلید رمز شده را به کل داده رمز شده اضافه کنید.
در RSA شما دیتا خودتان را با کلید خصوصی خود و کلید عمومی دیگری رمز خواهید کرد. و دیتایی که با کلید خصوصی کس دیگر رمز شده به کلید با کلید عمومی آن شخص و کلید خصوصی شما قابل دستیابی هست

Hesamzadeh
یک شنبه 02 مرداد 1390, 21:05 عصر
کاری که من میخوام بکنم یه پروژه دانشجویی هست چیزی شبیه میل باکس و قراره بحث امنیت و احراز هویتش را کلا کد نویسی بشه تا افراد بتونن تشخیص بدن پیام دریافتی از طرف کی ارسال شده و همچنین پیامها در شبکه به صورت کاملا امن جابجا بشه(پیامها حداکثر 300 کاراکتر هستن) بنابراین کلید خصوصی نمیتونه هربار تولید بشه. در نتیجه کلید خصوصی باید جایی ذخیره بشه مثلا در یک اکسس کارت یا یک فلش مموری به صورت رمزنگاری شده. و کلید عمومی هم توسط شخص مدیر سیستم در یک جدول فقط خواندی ذخیره میشه. در ضمن تغییر کلیدها یا کارتها فقط با اجازه مدیر سیستم امکان پذیر خواهد بود.
ایا راه حل بهتری میشه پیاده کرد؟

linux
دوشنبه 03 مرداد 1390, 13:09 عصر
کاری که من میخوام بکنم یه پروژه دانشجویی هست چیزی شبیه میل باکس و قراره بحث امنیت و احراز هویتش را کلا کد نویسی بشه تا افراد بتونن تشخیص بدن پیام دریافتی از طرف کی ارسال شده و همچنین پیامها در شبکه به صورت کاملا امن جابجا بشه(پیامها حداکثر 300 کاراکتر هستن) بنابراین کلید خصوصی نمیتونه هربار تولید بشه. در نتیجه کلید خصوصی باید جایی ذخیره بشه مثلا در یک اکسس کارت یا یک فلش مموری به صورت رمزنگاری شده. و کلید عمومی هم توسط شخص مدیر سیستم در یک جدول فقط خواندی ذخیره میشه. در ضمن تغییر کلیدها یا کارتها فقط با اجازه مدیر سیستم امکان پذیر خواهد بود.
ایا راه حل بهتری میشه پیاده کرد؟
قرار نیست کلید خصوصی هر بار تولید شود. کلید خصوصی یکبار تولید می شود و نحوه تولید هم باید سیاست خودش را داشته باشد.
در ساده ترین حالت زوج کلید عمومی و خصوصی در سمت کلاینت تولید می شود و دخیره می شود. با استفاده از کلاس CspParameters به روش امنی می توان کلید خصوصی را ذخیره کرد.
کلید عمومی هم اهمیتی ندارد کجا و چظور ذخیره شود.
برای 300 کارکتر مشکلی نیست ولی اگر قرار باشد حجم زیادی ارسال و دریافت شود دیگر فقط RSA کافی نیست

Hesamzadeh
دوشنبه 03 مرداد 1390, 15:10 عصر
سپاسگزارم
فقط یک مسئله حل نشده برای من باقی مونده اینکه چطور میتونم متن خام رو با کلید خصوصی رمز کنم جهت احراز هویت. همانطوری که در پست 12 فرمودید در کدی که نوشتم کلید عمومی و خصوصی با هم برمیگردند و این باعث مشکل شده ...

linux
دوشنبه 03 مرداد 1390, 21:10 عصر
سپاسگزارم
فقط یک مسئله حل نشده برای من باقی مونده اینکه چطور میتونم متن خام رو با کلید خصوصی رمز کنم جهت احراز هویت. همانطوری که در پست 12 فرمودید در کدی که نوشتم کلید عمومی و خصوصی با هم برمیگردند و این باعث مشکل شده ...
در RSA متن برای یک شخص رمز می شود مثلا من با کلید خصوصی خودم و کلید عمومی شما متن را رمز می کنم. علاوه بر رمز کردن متن چیزی به اسم امضا کردن هم داریم که باز با کلید خصوصی خودم و کلید عمومی شما متن را امضا می کنم.
شما در مرحله اول بعد از تطابق امضا با استفاده از کلید خصوصی خودتان و کلید عمومی من اقدام به رمزگشایی متن می کنید.
اگر مایل باشید می توانید مرحله به مرحله برنامه را بنویسید و اینجا بررسی کنیم

Hesamzadeh
چهارشنبه 05 مرداد 1390, 17:17 عصر
در RSA متن برای یک شخص رمز می شود مثلا من با کلید خصوصی خودم و کلید عمومی شما متن را رمز می کنم. علاوه بر رمز کردن متن چیزی به اسم امضا کردن هم داریم که باز با کلید خصوصی خودم و کلید عمومی شما متن را امضا می کنم.
شما در مرحله اول بعد از تطابق امضا با استفاده از کلید خصوصی خودتان و کلید عمومی من اقدام به رمزگشایی متن می کنید.
اگر مایل باشید می توانید مرحله به مرحله برنامه را بنویسید و اینجا بررسی کنیم

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

private CspParameters Csp;
private RSACryptoServiceProvider RSA;
public void GetNewKeys(int KeySize)
{
Csp = new CspParameters();
Csp.KeyContainerName = "MyContainerName";
RSA = new RSACryptoServiceProvider(KeySize, Csp);
}

public string Encrypt(string PlainText)
{
try
{
byte[] originalData = ByteConverter.GetBytes(PlainText.Trim());
byte[] Ciphertext= RSA.Encrypt(originalData, true);
return System.Convert.ToBase64String(Ciphertext);
}
catch (Exception ex)
{
return ex.Message;
}
}

خوب مشکل این کد اینه که هر بار یک کلید جدید ایجاد میکنه و اینکه من نمیدونم کانتینر ایجاد شده رو چطوری باید ذخیره کنم و دیگر اینکه اگر در همین کد کانتینر ایجاد شده رو به یک کلاس دیگه ارسال کنم و توسط اون یک نمونه از RSACryptoServiceProvider ایجاد کنم کلیدهای بازگشتی از دو کلاس یکسان نیستند

Hesamzadeh
پنج شنبه 06 مرداد 1390, 14:07 عصر
دوست گرامی تقریبا مشکلم حل شد فقط نمیدونم چطوری مشخص کنم کانتینر کجا ذخیره بشه که بشه بعدا منتقلش کرد به هر سیستمی که میخواهیم یا وقتی که ایجاد شد چطوری حذفش کنم از روی سیستمم
اگر زحمتی نیست کدهای زیر رو بررسی کنید:

public string encrypt(int keysize, string ContainerName, string text)
{
CspParameters CSP = new CspParameters();
CSP.KeyContainerName = ContainerName;
CSP.Flags = CspProviderFlags.UseUserProtectedKey;
RSA = new RSACryptoServiceProvider(keysize,CSP);
byte[] plaintext = ByteConverter.GetBytes(text.Trim());
byte[] cipher = RSA.Encrypt(plaintext, true);
return System.Convert.ToBase64String(cipher);
}

public string decrypt(string ContainerName, string text)
{
CspParameters cp = new CspParameters();
cp.KeyContainerName = ContainerName;
RSA1 = new RSACryptoServiceProvider(cp);
byte[] cyphertext = System.Convert.FromBase64String(text.Trim());
byte[] cipher = RSA1.Decrypt(cyphertext, true);
return ByteConverter.GetString(cipher);
}

public string sign(string ContainerName, string text)
{
CspParameters cp = new CspParameters();
cp.KeyContainerName = ContainerName;
RSA = new RSACryptoServiceProvider(cp);
byte[] signtext = ByteConverter.GetBytes(text.Trim());
byte[] sign = RSA.SignData(signtext, new SHA1CryptoServiceProvider());
return System.Convert.ToBase64String(sign);
}

public bool verify(string name, string signedtext, string OrginalText)
{
RSAParameters Key = RSA.ExportParameters(false);
RSA1 = new RSACryptoServiceProvider();
RSA1.ImportParameters(Key);
byte[] verifyedtext = System.Convert.FromBase64String(signedtext.Trim()) ;
byte[] datatoverify = ByteConverter.GetBytes(OrginalText);
bool verifyed = RSA1.VerifyData(datatoverify, new SHA1CryptoServiceProvider(), verifyedtext);
return verifyed;
}

linux
پنج شنبه 06 مرداد 1390, 21:12 عصر
نه دیگر نشد! شما اینجا متن را با کلید عمومی خودتان رمز کردید در نتیجه این متن به جز شما دیگر برای کس دیگری قابل بازیابی نمی باشد. برای رمز کردن شما باید کلید عمومی را به تابع بدهید. و برای رمزگشایی از کلید خصوصی استفاده کنید.
کانتاینر با توجه به flag که انتخاب می کنید در کامپیوتر شخص تولید و ذخیره می شود. و کلا احتیاجی به جابجایی ندارد. مگر اینکه از چند کامپیوتر مختلف استفاده شود.

Hesamzadeh
پنج شنبه 06 مرداد 1390, 21:43 عصر
من که کلا گیج شدم
من میخوام کلیدها توسط یک نفر به عنوان مدیر تولید بشه و در اختیار کاربران قرار بگیره (توسط یک فایل یا هر چیز دیگه) که کاربران بتونن توسط هر سیستمی با کلید اختصاصی خودشون کار کنند بدون اینکه کلید روی کامپیوتر کاربران ذخیره بشه

linux
جمعه 07 مرداد 1390, 01:39 صبح
من که کلا گیج شدم
من میخوام کلیدها توسط یک نفر به عنوان مدیر تولید بشه و در اختیار کاربران قرار بگیره (توسط یک فایل یا هر چیز دیگه) که کاربران بتونن توسط هر سیستمی با کلید اختصاصی خودشون کار کنند بدون اینکه کلید روی کامپیوتر کاربران ذخیره بشه
تا وقتی از نرم افزار استفاده می کنید کلیدهای هر کس باید در سمت آن شخص تولید شود. این حرف شما موقعی کاربرد دارد که کلیدها توسط یک سازمان متمرکز که CA نامیده می شود تولید شده و بر روی یک توکن یا smartcard ثبت شده و تحویل کاربر شود.

Hesamzadeh
جمعه 07 مرداد 1390, 12:34 عصر
با توجه به تمام مباحثی که خوندم ظاهرا رمز نگاری با کلید خصوصی کار درستی نیست و باید از Sign استفاده بشه - آیا درست هست؟
حالا با توجه به اینکه متد Verify برای تائید، نیاز به الگوریتم Hash ، متن اصلی و متن Sign شده داره این سوال پیش میاد که اگر قرار هست متن اصلی رو به صورت Plain text ارسال کنیم دیگه معنی رمزنگاری چیه؟
بعد از این دقیقا چطور بحث امنیت و احراز هویت رو میشه پیاده سازی کرد؟ (الگوریتم نحوه ارسال اطلاعات به طوری که هم امنیتش تامین بشه هم احراز هویتش به چه صورت هست؟)
خواهشا درصورت امکان با ذکر کد بیان فرمائید.

linux
جمعه 07 مرداد 1390, 13:23 عصر
با توجه به تمام مباحثی که خوندم ظاهرا رمز نگاری با کلید خصوصی کار درستی نیست و باید از Sign استفاده بشه - آیا درست هست؟
حالا با توجه به اینکه متد Verify برای تائید، نیاز به الگوریتم Hash ، متن اصلی و متن Sign شده داره این سوال پیش میاد که اگر قرار هست متن اصلی رو به صورت Plain text ارسال کنیم دیگه معنی رمزنگاری چیه؟
بعد از این دقیقا چطور بحث امنیت و احراز هویت رو میشه پیاده سازی کرد؟ (الگوریتم نحوه ارسال اطلاعات به طوری که هم امنیتش تامین بشه هم احراز هویتش به چه صورت هست؟)
خواهشا درصورت امکان با ذکر کد بیان فرمائید.

منظور کلید عمومی بود دیگه، اولش هم گفتم چون این الگوریتم یک الگوریتم زمانبری هست در حجم زیاد داده ها اصلا جواب نمی دهد برای مثال همین برنامه ای که تا اینجا نوشتی اگر اجرا کنید و برای ورودی همین متن چند خطی را بدهید خطا می دهد! پس از یکی از الگوریتم های متقارن استفاده می کنیم. یک کلید رمز متقارن با طول مثلا 20 کارکتر به صورت تصادفی تولید می کنیم. متن اصلی را با این کلید متقارن رمز می کنیم و در یک آرایه از نوع byte[] می ریزیم. حالا کلید را با RSA رمز می کنیم و کلید رمز شده را در یک قسمت از آرایه قبلی قرار می دهیم ، ابتدا یا انتها یا هر کجای دیگر، حالا این آرایه را می توانیم به عنوان رمز ارسال کنیم. در سمت دیگر ابتدا کلید متقارن رمز شده را از آرایه استخراج می کنیم با RSA و با استفاده از کلید خصوصی گیرنده این کلید رمز شده متقارن را رمز گشایی می کنیم و سپس با این کلید بدست آمده کل متن رمز شده را رمز گشایی می کنیم.
قبلا متن اصلی را امضا کردیم و حالا با بدست آوردن دوباره متن اصلی می توانیم صحت اطلاعات ارسالی را کنترل کنیم. این حالت برای موقعی هست که اطلاع محرمانه هست و نباید توسط کسی دیده شود.
بعضی وقت ها اطلاعات محرمانه نیست! فقط باید صحت اطلاعات و فرستنده بررسی شود. مانند موقعی که شما به بانک دستور می دهید مبلغی را از حساب شما برداشت کرده و به حساب شخصی دیگری بریزد، محرمانگی این موضوع اهمیتی ندارد فقط باید صحت اطلاعات و صحت ارسال کننده احراز شود. در این صورت هست که متن اصلی با امضا دیجیتال ارسال می شود.

Hesamzadeh
جمعه 07 مرداد 1390, 13:56 عصر
منظور کلید عمومی بود دیگه
نه منظورم این بود که چون رمز نگاری با کلید خصوصی به این علت که با کلید عمومی قابل رمزگشایی هست و کلید عمومی رو هم همه دارن پس تفاوتی نداره که رمز بشه یا نه - آیا درست هست؟
بنابراین باید Sign بشه طبق مطلبی که فرمودید
(در ضمن جدای این مبحث، نحوه رمزنگاری با کلید خصوصی چطوری هست، فقط جهت یادگیری چون من نتونستم مطابق کدهایی که در پستهای اول قرار دادم این کار رو انجام بدم ؟)


پس از یکی از الگوریتم های متقارن استفاده می کنیم. یک کلید رمز متقارن با طول مثلا 20 کارکتر به صورت تصادفی تولید می کنیم. متن اصلی را با این کلید متقارن رمز می کنیم و در یک آرایه از نوع byte[] می ریزیم. حالا کلید را با RSA رمز می کنیم و کلید رمز شده را در یک قسمت از آرایه قبلی قرار می دهیم ، ابتدا یا انتها یا هر کجای دیگر، حالا این آرایه را می توانیم به عنوان رمز ارسال کنیم
ایا استاندارد خاصی داره یا به دلخواه برنامه نویس هست که کلید رو کجا قرار بده؟ در هر صورت با توجه به متغیر بودن طول هر دو قسمت، اینها توسط گیرنده چطور تشخیص داده میشن؟



قبلا متن اصلی را امضا کردیم و حالا با بدست آوردن دوباره متن اصلی می توانیم صحت اطلاعات ارسالی را کنترل کنیم. این حالت برای موقعی هست که اطلاع محرمانه هست و نباید توسط کسی دیده شود.
آیا متن امضا شده جدای از متنی هست که با کلید مشترک رمز شده یعنی اینکه بسته ارسالی ما شامل متن رمز شده با کلید مشترک هست + کلید رمز شده با RSA عمومی گیرنده + متن امضا شده توسط فرستنده

linux
جمعه 07 مرداد 1390, 15:17 عصر
نه کاملا بر عکس رمزنگاری با کلید عمومی هست و رمزگشایی با کلید خصوصی، فرض کنید من کلید عمومی شما را دارم، داده ها را با کلید عمومی شما رمز می کنم و شما می توانید داده ها را با کلید خصوصی خودتان رمزگشایی کنید، به خاطر همین هست که کلید خصوصی و نحوه نگهداری آن اهمیت دارد. و تنها کسی که می تواند این داده ها را رمزگشایی کند فقط شما هستید تا موقعی که کلید خصوصی شما لو نرفته باشد.
نه من تا حالا استاندارد خاصی ندیدم، گیرنده هم از برنامه شما استفاده می کند و شما هم می دانید کلید متقارن رمز شده کجا قراردارد.
برای گیرنده شما احتیاج به ارسال کلید متقارن رمز شده (بصورت تصادفی تولید شده) با کلید عمومی گیرنده ، داده های رمز نگاری شده و امضا دارید.

r0ot$harp
یک شنبه 30 بهمن 1390, 09:19 صبح
سلام دوستان عزیز

روش کلی کار RSA اینطور هست که شما اگر با کلید Private متن رو کد کنید با کلید Public باید متن دیکد بشه و اگر با Public کد بشه باید با Private دیکد بشه . مشکلی که من الان دارم اینه که من در سیستمی از RSA و AES 256 استفاده کردم . و احتیاج دارم که در هر دو طرف رمزگذاری و رمزگشایی انجام بشه . مثل مرورگرها.

مشکل اصلی اینجاست که من با Private Key وقتی متنی رو رمزگذاری می کنم به هیچ عنوان نمی شه با Public Key اون رو رمزگشایی کرد .!!! برای حل این مشکل باید چی کار کنم ؟؟؟

باتشکر احسان