简体   繁体   中英

RSA decryption - Key does not exist

I'm trying to encrypt and decrypt file with RSA. Encryption is working fine. But I get error when I'm decrypting.

Error is key does not exist.

Here is the error: http://i.imgur.com/ebF09cU.png

public byte[] RSA_Encrypt(byte[] bytesToBeEncrypted, byte[] passwordBytes, RSAParameters RSAKeyInfo)
{
    //initialze the byte arrays to the public key information.
    byte[] PublicKey = {214,46,220,83,160,73,40,39,201,155,19,202,3,11,191,178,56,
                           74,90,36,248,103,18,144,170,163,145,87,54,61,34,220,222,
                           207,137,149,173,14,92,120,206,222,158,28,40,24,30,16,175,
                           108,128,35,230,118,40,121,113,125,216,130,11,24,90,48,194,
                           240,105,44,76,34,57,249,228,125,80,38,9,136,29,117,207,139,
                           168,181,85,137,126,10,126,242,120,247,121,8,100,12,201,171,
                           38,226,193,180,190,117,177,87,143,242,213,11,44,180,113,93,
                           106,99,179,68,175,211,164,116,64,148,226,254,172,147};

    //Values to store encrypted symmetric keys.
    byte[] EncryptedSymmetricKey;
    byte[] EncryptedSymmetricIV;

    byte[] encryptedBytes = null;

    // Set your salt here, change it to meet your flavor:
    // The salt bytes must be at least 8 bytes.
    byte[] saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };

    using (MemoryStream ms = new MemoryStream())
    {
        using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(_stBitov))
        {
            //Set RSAKeyInfo to the public key values.
            RSAKeyInfo.Modulus = PublicKey;
            //Import key parameters into RSA.
            RSA.ImportParameters(RSAKeyInfo);

            //Create a new instance of the RijndaelManaged class.
            RijndaelManaged RM = new RijndaelManaged();

            var key = new Rfc2898DeriveBytes(PublicKey, saltBytes, 1000);

            //Encrypt the symmetric key and IV.
            EncryptedSymmetricKey = RSA.Encrypt(RM.Key, false);
            EncryptedSymmetricIV = RSA.Encrypt(RM.IV, false);

            encryptedBytes = RSA.Encrypt(bytesToBeEncrypted, false); 
        }
    }

    return encryptedBytes;
}

RSAParameters _RSAKeyInfo;

public void EncryptFile()
{
    RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

    //Get an instance of RSAParameters from ExportParameters function.
    RSAParameters RSAKeyInfo = RSA.ExportParameters(false);
    _RSAKeyInfo = RSAKeyInfo;

    string path = ofd.FileName;

    if (File.Exists(path))
    {
        string dirPath = Path.GetDirectoryName(path);

        byte[] bytesToBeEncrypted = File.ReadAllBytes(path);

        byte[] passwordBytes = File.ReadAllBytes(dirPath + "/KEY_" + ofd.SafeFileName);

        byte[] bytesEncrypted = RSA_Encrypt(bytesToBeEncrypted, passwordBytes, RSAKeyInfo);

        string fileEncrypted = dirPath + "/ENCRYPTED_" + ofd.SafeFileName;

        File.WriteAllBytes(fileEncrypted, bytesEncrypted);
    }
}

private void button5_Click(object sender, EventArgs e)
{
    string path = ofd2.FileName;

    if (File.Exists(path))
    {
        DecryptFile();
        richTextBox4.Text = "Dekripcija uspesna";
    }
    else
    {
        richTextBox6.Text = "Datoteka ni dodana";
    }
} private void richTextBox4_TextChanged(object sender, EventArgs e) { }

public byte[] RSA_Decrypt(byte[] bytesToBeDecrypted, byte[] passwordBytes, RSAParameters RSAKeyInfo)
{
    byte[] PublicKey = {214,46,220,83,160,73,40,39,201,155,19,202,3,11,191,178,56,
                           74,90,36,248,103,18,144,170,163,145,87,54,61,34,220,222,
                           207,137,149,173,14,92,120,206,222,158,28,40,24,30,16,175,
                           108,128,35,230,118,40,121,113,125,216,130,11,24,90,48,194,
                           240,105,44,76,34,57,249,228,125,80,38,9,136,29,117,207,139,
                           168,181,85,137,126,10,126,242,120,247,121,8,100,12,201,171,
                           38,226,193,180,190,117,177,87,143,242,213,11,44,180,113,93,
                           106,99,179,68,175,211,164,116,64,148,226,254,172,147};

    //Values to store encrypted symmetric keys.
    byte[] EncryptedSymmetricKey;
    byte[] EncryptedSymmetricIV;

    byte[] decryptedBytes = null;

    // Set your salt here, change it to meet your flavor:
    // The salt bytes must be at least 8 bytes.
    byte[] saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };

    using (MemoryStream ms = new MemoryStream())
    {
        using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(_stBitov))
        {
            //Set RSAKeyInfo to the public key values.
            RSAKeyInfo.Modulus = PublicKey;
            //Import key parameters into RSA.
            RSA.ImportParameters(RSAKeyInfo);

            //Create a new instance of the RijndaelManaged class.
            RijndaelManaged RM = new RijndaelManaged();

            //Encrypt the symmetric key and IV.
            EncryptedSymmetricKey = RSA.Encrypt(RM.Key, false);
            EncryptedSymmetricIV = RSA.Encrypt(RM.IV, false);

            decryptedBytes = RSA.Decrypt(bytesToBeDecrypted, false);
        }
    }

    return decryptedBytes;
}

public void DecryptFile()
{
    string path = ofd2.FileName;

    if (File.Exists(path))
    {
        string dirPath = Path.GetDirectoryName(path);

        byte[] bytesToBeDecrypted = File.ReadAllBytes(path);

        byte[] passwordBytes = File.ReadAllBytes(dirPath + "/KEY_" + ofd.SafeFileName);

        byte[] bytesDecrypted = RSA_Decrypt(bytesToBeDecrypted, passwordBytes, _RSAKeyInfo);

        string file = dirPath + "/DECRYPTED_" + ofd.SafeFileName;

        File.WriteAllBytes(file, bytesDecrypted);
    }
}

Can somebody tell me what to do that decryption is going to work.

RSA is a kind of public-key cryptography. That means you need a public key to encrypt the message and a private key to decrypt your message. It looks like you're using your public key for both encryption and decryption. Where's your private key?

It seems you're trying to do hybrid encryption with RSA+AES, but you forgot to actually use AES to encrypt the plaintext and you forgot to encrypt the symmetric key with RSA. You also need to generate the symmetric key randomly and should not be derived from the public key which is supposed to be constant and public .

The error that you presented here is the least of your problems, but as ElectroByt already said, you need to use a private key ( RSACryptoServiceProvider#ExportParameters(true) ) to decrypt something with RSA. In your case, you would need to decrypt with RSA to get the symmetric key to use it to decrypt the symmetric ciphertext to get the actual message back.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM