Click here to Skip to main content
15,898,929 members
Please Sign up or sign in to vote.
3.00/5 (2 votes)
See more:
<how to="" get="" private="" kye="" for="" rsa="" algorithm="">
Posted
Updated 11-Apr-11 19:03pm
v3

You have to use the private key to decrypt. You're using public key for encrypting and decrypting.
RSA is asymetric.
 
Share this answer
 
Comments
bipin9 7-Apr-11 1:30am    
yes thats ok but how do i get that private key or what would be that key
I set up a small example where all the magic happens in just one method.
I'm using 3 TextBoxes to show the path from plain text via encryption to the decrypted text.
TextBoxes are named textBoxPlain,textBoxEncrypted and textBoxDecrypted.
So you can quite easily open a new project and just put 3 textboxes on the form.
textBoxEncrypted is set to multiline. Encrypting and decrypting all happens in textBoxPlain_TextChanged

C#
using System;
using System.Text;
using System.Windows.Forms;
using System.Security.Cryptography;
using System.Collections;

namespace EncryptionRSA
{
    public partial class Form1 : Form
    {
        private RSACryptoServiceProvider rsaSender;
        private RSACryptoServiceProvider rsaReceiver;
        private string publicKey;
        private string privateKey;

        private int keySize = 1024;

        public Form1()
        {
            InitializeComponent();
            rsaReceiver = new RSACryptoServiceProvider(keySize);
            
            // public key which can be spread to all senders
            publicKey = rsaReceiver.ToXmlString(false);
            // private key. Keep it secret!
            // the private key XML always contains public and private key
            privateKey = rsaReceiver.ToXmlString(true);
        }

        private void textBoxPlain_TextChanged(object sender, EventArgs e)
        {
            // sender using the public key to encrypt data
            rsaSender = new RSACryptoServiceProvider();
            rsaSender.FromXmlString(publicKey);// "loading" public key
            
            // code from your sample
            byte[] bytes = Encoding.UTF32.GetBytes(textBoxPlain.Text);
            int maxLength = keySize/8 - 42;
            int dataLength = bytes.Length;
            int iterationsenc = dataLength / maxLength;
            StringBuilder stringBuilder = new StringBuilder();
            
            for (int i = 0; i <= iterationsenc; i++)
            {
                byte[] tempBytes = new byte[(dataLength - maxLength * i > maxLength) ? maxLength : dataLength - maxLength * i];
                Buffer.BlockCopy(bytes, maxLength * i, tempBytes, 0, tempBytes.Length);
                byte[] encryptedBytes = rsaSender.Encrypt(tempBytes, true);
                Array.Reverse(encryptedBytes);
                stringBuilder.Append(Convert.ToBase64String(encryptedBytes));
            }

            // display encrypted data
            textBoxEncrypted.Text = stringBuilder.ToString();


            // receiver using his privat key
            rsaReceiver = new RSACryptoServiceProvider();
            rsaReceiver.FromXmlString(privateKey);

            // code from your sample
            int base64BlockSize = ((keySize / 8) % 3 != 0) ? (((keySize / 8) / 3) * 4) + 4 : ((keySize / 8) / 3) * 4;
            int iterationsdec = textBoxEncrypted.Text.Length / base64BlockSize;
            ArrayList arrayList = new ArrayList();
            for (int i = 0; i < iterationsdec; i++)
            {
                byte[] encryptedBytes = Convert.FromBase64String(textBoxEncrypted.Text.Substring(base64BlockSize * i, base64BlockSize));
                Array.Reverse(encryptedBytes);
                arrayList.AddRange(rsaReceiver.Decrypt(encryptedBytes, true));
            }

            // display decrypted data
            textBoxDecrypted.Text = Encoding.UTF32.GetString(arrayList.ToArray(Type.GetType("System.Byte")) as byte[]);
        }
    }
}
 
Share this answer
 
Comments
bipin9 7-Apr-11 9:23am    
cool ha..
but what was the problem in my code
bipin9 7-Apr-11 9:26am    
string generatedKey = Asymmetric.GenerateKey(1024, BATCrypto.KeyType.Public); Console.WriteLine("This is generated key :-- " + generatedKey); string rsaencrypted = Asymmetric.Encrypt(BATCrypto.AsymmetricAlgo.RSA, "bipin", 1024, generatedKey); Console.WriteLine("rsaencrypted is :- " + rsaencrypted); string rsaDecrypted = Asymmetric.Decrypt(BATCrypto.AsymmetricAlgo.RSA, rsaencrypted, 1024, generatedKey);.
Michel [mjbohn] 7-Apr-11 10:02am    
OK after telling you that you're using the public key for both encrytion *and* decrytion and giving you a detailed example of how to use these keys, I thought it was obvious.
It was not. Might be my fault.
Look at this lines of code:
string generatedKey = Asymmetric.GenerateKey(1024, BATCrypto.KeyType.Public);
You build a PUBLIC key which you use for encrytion in this line:
string rsaencrypted = Asymmetric.Encrypt(BATCrypto.AsymmetricAlgo.RSA, "bipin", 1024, generatedKey);
Then you use the same PUBLIC key for decryption in this line:
string rsaDecrypted = Asymmetric.Decrypt(BATCrypto.AsymmetricAlgo.RSA, rsaencrypted, 1024, generatedKey);
For decryption you have to use the PRIVATE key which I guess get's build by BATCrypto.KeyType.Private
bipin9 8-Apr-11 1:06am    
Thanks
Asymmetric.GenerateKey(1024,BATCrypto.KeyType.Private); this giving exception as Safe handle has been closed.

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900