11

Regarding AES 256 Encryption:

  • What is the public and private key?
  • How can I generate these two keys?
  • How can I use the public to encrypt the data?
  • How can I use the private to decrypt the data?
genpfault
  • 51,148
  • 11
  • 85
  • 139
Yasser-Farag
  • 592
  • 4
  • 9
  • 28
  • 1
    www (dot) what-have-you-tried (dot) com. Possible duplicate of: http://stackoverflow.com/questions/273396/aes-encryption-what-are-public-and-private-keys – metsburg Sep 17 '13 at 12:36
  • 3
    There is no public and private key in AES encryption, your question doesn't make sense. – Mark Rotteveel Sep 17 '13 at 12:43

2 Answers2

36

In .Net, you can create your key pair like this:

public static Tuple<string, string> CreateKeyPair()
{
    CspParameters cspParams = new CspParameters { ProviderType = 1 };

    RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(1024, cspParams);

    string publicKey = Convert.ToBase64String(rsaProvider.ExportCspBlob(false));
    string privateKey = Convert.ToBase64String(rsaProvider.ExportCspBlob(true));

    return new Tuple<string, string>(privateKey, publicKey);
}

You can then use your public key to encrypt a message like so:

public static byte[] Encrypt(string publicKey, string data)
{
    CspParameters cspParams = new CspParameters { ProviderType = 1 };
    RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(cspParams);

    rsaProvider.ImportCspBlob(Convert.FromBase64String(publicKey));

    byte[] plainBytes = Encoding.UTF8.GetBytes(data);
    byte[] encryptedBytes = rsaProvider.Encrypt(plainBytes, false);

    return encryptedBytes;
}

And use your private key to decrypt like this:

public static string Decrypt(string privateKey, byte[] encryptedBytes)
{
    CspParameters cspParams = new CspParameters { ProviderType = 1 };
    RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(cspParams);

    rsaProvider.ImportCspBlob(Convert.FromBase64String(privateKey));

    byte[] plainBytes = rsaProvider.Decrypt(encryptedBytes, false);

    string plainText = Encoding.UTF8.GetString(plainBytes, 0, plainBytes.Length);

    return plainText;
}
dcastro
  • 66,540
  • 21
  • 145
  • 155
  • Is this encrypt and decrypt functions using AES 256 Encryption? – Yasser-Farag Sep 17 '13 at 13:47
  • 1
    Like user2787670 explained, AES 256 is a symmetric cipher. This generates a RSA key pair. – dcastro Sep 17 '13 at 13:49
  • you mean that AES 256 use the same key for encrypt and decrypt functions? – Yasser-Farag Sep 17 '13 at 13:53
  • 4
    Exactly. Symmetric keys are good for encrypting large amounts of data, whereas asymmetric keys are better for small chunks. If two parties have their own key set, a typical scenario is to use asymmetric keys to securely exchange symmetric keys between two parties, and then use symmetric keys from then on to securely exchange large amounts of data. You should look into that. Of course, this HIGHLY depends on what you're trying to achieve. – dcastro Sep 17 '13 at 14:00
  • 1
    Hi, I tried your code but I have exception in the decrypt function "Key does not exist" I don't konw how can I fix it. – Yasser-Farag Sep 18 '13 at 09:16
  • 1
    @Yasser-Farag - I don't know how need to use his code to receive such error. Everything is working fine. `Tuple keys = CreateKeyPair(); string test = "we licensed?"; byte[] encrypted = Encrypt(keys.Item2, test); string decrypted = Decrypt(keys.Item1, encrypted);` – Kosmo零 Nov 16 '15 at 10:46
  • Great answer! Who'd have thought it would be so easy? – bottlenecked Oct 25 '16 at 08:15
10

I think you are mixing things up. AES is a symmetric cipher, thus only have one key both for encryption and decryption. Asymmetric ciphers like RSA have two keys. A public key for encryption and a private key for decryption.

And for reddit, you can indeed answer without being logged in.

Qwerky
  • 18,217
  • 6
  • 44
  • 80
user2787670
  • 109
  • 2