# مهندسی نرم افزار > مباحث مرتبط با مهندسی نرم‌افزار > امنیت در نرم افزار و برنامه نویسی > سوال: الگوریتم RSA

## Hesamzadeh

در RSA مطابق الگوریتم، متن رمز شده توسط کلید عمومی باید توسط کلید خصوصی رمزگشایی بشه و متن رمز شده توسط کلید خصوصی هم توسط کلید عمومی رمز گشایی بشه
مشکلی که من دارم اینه که در دات نت این اتفاق نمیافته و فقط متن رمز شده توسط کلید عمومی قابلیت بازگشایی توسط کلید خصوصی را دارد و برعکسش امکان پذیر نیست علت این موضوع چیه؟

----------


## Nima NT

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

----------


## Hesamzadeh

درسته ولی مشکل اینه که این اتفاق نمی افته و متن رمز شده با <کلید خصوصی> فقط با <کلید خصوصی> میتونه باز بشه

----------


## Nima NT

شاید اشتباهی در کد نویسی شما رخ داده باشه چون قاعدتا" نباید اینچنین باشه ، اگر براتون مقدر هست قطعه کدی که اینکار رو انجام میده رو قرار بدید تا با هم بررسی کنیم.

----------


## Hesamzadeh

برای ساختن کلیدها از این کد:

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

و برای رمزنگاری و رمز گشایی :

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

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


نه چه زحمتی مشکلی نداره ، البته فعلا" این کدها که صحیح به نظر میان و نباید مشکلی داشته باشن.

----------


## Hesamzadeh

ممنون از لطف شما
پروژه با VS2010 هست:
ClassEncription.zip

----------


## Hesamzadeh

دوستان کسی نتونست مشکل کدها رو پیدا کنه که چرا متن رمز شده با کلید خصوصی با کلید عمومی رمزگشایی نمیشه؟

----------


## Nima NT

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

----------


## Hesamzadeh

به خاطر وقتی که گذاشتید ممنونم 
ولی مگه الگوریتم 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

keys.RSAPrivateKey  در برنامه شما دربردارنده کلید خصوصی و هم کلید عمومی هست.  مشکل از اینجاست!

----------


## Hesamzadeh

خیلی ممنون ولی کدام یک از تگها باید حذف بشن تا درست کار کنه و چطوری میشه اینکار رو کرد چون من وقتی به صورت دستی حذفشون میکنم خطای زیر رو میده:
 does not contain a valid encoding of the 'RSA' 'Modulus' parameter.

----------


## linux

> خیلی ممنون ولی کدام یک از تگها باید حذف بشن تا درست کار کنه و چطوری میشه اینکار رو کرد چون من وقتی به صورت دستی حذفشون میکنم خطای زیر رو میده:
>  does not contain a valid encoding of the 'RSA' 'Modulus' parameter.


 سوال این هست که چه احتیاجی به این کار دارید؟!
برای رمز کردن داده هایی با حجم زیاد کلا rsa خوب نیست و خیلی کند خواهد بود برای رمز کردن حجم زیاد داده ها از یکی از الگوریتم های متقارن باید استفاده کنید.
و سپس کلید رمز را با الگوریتم RSA رمز کنید و کلید رمز شده را به کل داده رمز شده اضافه کنید.
در RSA شما دیتا خودتان را با کلید خصوصی خود و کلید عمومی دیگری رمز خواهید کرد. و دیتایی که با کلید خصوصی کس دیگر رمز شده به کلید با کلید عمومی آن شخص و کلید خصوصی شما قابل دستیابی هست

----------


## Hesamzadeh

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

----------


## linux

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


قرار نیست کلید خصوصی هر بار تولید شود. کلید خصوصی یکبار تولید می شود و نحوه تولید هم باید سیاست خودش را داشته باشد.
در ساده ترین حالت زوج کلید عمومی و خصوصی در سمت کلاینت تولید می شود و دخیره می شود. با استفاده از کلاس CspParameters به روش امنی می توان کلید خصوصی را ذخیره کرد.
کلید عمومی هم اهمیتی ندارد کجا و چظور ذخیره شود.
برای 300 کارکتر مشکلی نیست ولی اگر قرار باشد حجم زیادی ارسال و دریافت شود دیگر فقط RSA  کافی نیست

----------


## Hesamzadeh

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

----------


## linux

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


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

----------


## Hesamzadeh

> در 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

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

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

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

----------


## Hesamzadeh

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

----------


## linux

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


تا وقتی از نرم افزار استفاده می کنید کلیدهای هر کس باید در سمت آن شخص تولید شود. این حرف شما موقعی کاربرد دارد که کلیدها توسط یک سازمان متمرکز که CA نامیده می شود تولید شده و بر روی یک توکن یا smartcard ثبت شده و تحویل کاربر شود.

----------


## Hesamzadeh

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

----------


## linux

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


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

----------


## Hesamzadeh

> منظور کلید عمومی بود دیگه


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



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


ایا استاندارد خاصی داره یا به دلخواه برنامه نویس هست که کلید رو کجا قرار بده؟ در هر صورت با توجه به متغیر بودن طول هر دو قسمت، اینها توسط گیرنده چطور تشخیص داده میشن؟




> قبلا متن اصلی را امضا کردیم و حالا با بدست آوردن دوباره متن اصلی می  توانیم صحت اطلاعات ارسالی را کنترل کنیم. این حالت برای موقعی هست که  اطلاع محرمانه هست و نباید توسط کسی دیده شود.


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

----------


## linux

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

----------


## r0ot$harp

سلام دوستان عزیز 

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

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

باتشکر احسان

----------

