Jak zrobić proste szyfrowanie z wykorzystaniem RSA ?

Odpowiedz Nowy wątek
2011-09-19 23:23
0

Cześć!

Chciałbym stworzyć klasę/metody które w prosty sposób by szyfrowały za pomocą klucza publicznego i odszyfrowywały za pomocą klucza prywatnego.

Problem polega na tym, że kombinacji sposobów szyfrowania za pomocą RSA są w necie setki i do tego nie są w żaden sposób spójne ze sobą pod względem zastosowanego kodu z bibliotek .net już nie wspominając o bardzo zagmatwanej dokumentacji na MSDN i żaden niestety nie odpowiada moim wymaganiom, a które o dziwo na pierwszy rzut oka są bardzo proste:

Chciałbym coś takiego:


public class Crypt
{
    public RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();

    public string Encrypt(string dataIn, string privateKey) { ... }

    public string Decrypt(string dataIn, string publicKey) { ... }
}

Generalnie, wiem tyle, że po przekazaniu wejściowego stringa zamieniam go na tablicę bajtów, ale co dalej z tym zrobić, gdzie wsadzić, co zrobić z kluczami, jak je wygenerować, w jaki sposób przekazać tego nie mogę zrozumieć. Widziałem już klucze w tablicach bajtów, jako jakiś xml, generowane z certyfikatów jest to dla mnie bardzo chaotyczne. Będę bardzo wdzięczny za pomoc jeśli ktoś mi wyjaśni jak zrobić taką zdawało by się prostą klasę.

Dziękuję :)

Pozostało 580 znaków

2011-09-19 23:39
0

tutaj masz przykład użycia:
http://msdn.microsoft.com/en-[...]ptoserviceprovider.aspx#Y3888

using System;
using System.Security.Cryptography;
using System.Text;

class RSACSPSample
{

    static void Main()
    {
        try
        {
            //Create a UnicodeEncoder to convert between byte array and string.
            UnicodeEncoding ByteConverter = new UnicodeEncoding();

            //Create byte arrays to hold original, encrypted, and decrypted data.
            byte[] dataToEncrypt = ByteConverter.GetBytes("Data to Encrypt");
            byte[] encryptedData;
            byte[] decryptedData;

            //Create a new instance of RSACryptoServiceProvider to generate
            //public and private key data.
            using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
            {

                //Pass the data to ENCRYPT, the public key information 
                //(using RSACryptoServiceProvider.ExportParameters(false),
                //and a boolean flag specifying no OAEP padding.
                encryptedData = RSAEncrypt(dataToEncrypt, RSA.ExportParameters(false), false);

                //Pass the data to DECRYPT, the private key information 
                //(using RSACryptoServiceProvider.ExportParameters(true),
                //and a boolean flag specifying no OAEP padding.
                decryptedData = RSADecrypt(encryptedData, RSA.ExportParameters(true), false);

                //Display the decrypted plaintext to the console. 
                Console.WriteLine("Decrypted plaintext: {0}", ByteConverter.GetString(decryptedData));
            }
        }
        catch (ArgumentNullException)
        {
            //Catch this exception in case the encryption did
            //not succeed.
            Console.WriteLine("Encryption failed.");

        }
    }

    static public byte[] RSAEncrypt(byte[] DataToEncrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding)
    {
        try
        {
            byte[] encryptedData;
            //Create a new instance of RSACryptoServiceProvider.
            using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
            {

                //Import the RSA Key information. This only needs
                //toinclude the public key information.
                RSA.ImportParameters(RSAKeyInfo);

                //Encrypt the passed byte array and specify OAEP padding.  
                //OAEP padding is only available on Microsoft Windows XP or
                //later.  
                encryptedData = RSA.Encrypt(DataToEncrypt, DoOAEPPadding);
            }
            return encryptedData;
        }
        //Catch and display a CryptographicException  
        //to the console.
        catch (CryptographicException e)
        {
            Console.WriteLine(e.Message);

            return null;
        }

    }

    static public byte[] RSADecrypt(byte[] DataToDecrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding)
    {
        try
        {
            byte[] decryptedData;
            //Create a new instance of RSACryptoServiceProvider.
            using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
            {
                //Import the RSA Key information. This needs
                //to include the private key information.
                RSA.ImportParameters(RSAKeyInfo);

                //Decrypt the passed byte array and specify OAEP padding.  
                //OAEP padding is only available on Microsoft Windows XP or
                //later.  
                decryptedData = RSA.Decrypt(DataToDecrypt, DoOAEPPadding);
            }
            return decryptedData;
        }
        //Catch and display a CryptographicException  
        //to the console.
        catch (CryptographicException e)
        {
            Console.WriteLine(e.ToString());

            return null;
        }

    }
}

░█░█░█░█░█░█░█░█░█░█░█░
edytowany 1x, ostatnio: krwq, 2011-09-19 23:39

Pozostało 580 znaków

2011-09-20 00:05
0

Czytałem to dogłębnie już wiele razy wcześniej, ale z tego nadal nie wiem jak wyciągnąć klucz w taki sposób żebym komuś mógł go dać napisanego na kartce (nie licząc długiego pisania ołówkiem)

edytowany 1x, ostatnio: Ermes, 2011-09-20 00:06

Pozostało 580 znaków

2011-09-20 17:17
ŁF
0

wystarczyło uruchomić ten kod i w trybie pracy krokowej sprawdzić, co się w nim dzieje i porównać z wiki. para tablic bajtów (RSAKeyInfo.Modulus, RSAKeyInfo.Exponent) to klucz publiczny, koledze spisujesz ołóweczkiem na kartce wartości szesnastkowe kolejnych bajtów (oczywiście przeliczając na bieżąco w pamięci), przecineczkiem lub w inny ustalony sposób oddzielając od siebie dane obu tablic. co jest kluczem prywatnym to nie mam czasu ani ochoty sprawdzić, ale w najgorszym wypadku będzie nim całe RSAKeyInfo. w teorii wystarczy P, Q i Exponent, żeby odtworzyć wszystkie wartości tej struktury, w praktyce - po co się z tym męczyć, kiedy można zapisać całość.


edytowany 2x, ostatnio: ŁF, 2011-09-20 17:27

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0