Bouncy Castle Encrypt and Decrypt Password - Org.BouncyCastle.Crypto.InvalidCipherTextException: 'block incorrect'

Viewed 12

NOTE: This is NOT for encrypting user passwords. Use a Hash to store user passwords. You can also throw some salt on those passwords similarly to salt bae.

I need to store one of my passwords to log into a program. I can encrypt the password but when I decrypt I get the error: Org.BouncyCastle.Crypto.InvalidCipherTextException: 'block incorrect'

I am going to use a different private key so I'm not worried about posting this one here.

Program Class:

var input = "TestPassword123!";

Encryption EC = new Encryption();

var Key = "-----BEGIN RSA PRIVATE KEY-----MIICXAIBAAKBgQCr874y+f3cYtz8hOuxamwHYUK7WS03c3t7LHMuCpmiR9wOz1FHEbBk6ZdvhY74I9sE+lIs0bUZVh08nKIS/txeECZ/d3WYDm8gW+mFjg0xD7LgQ9Prchsvrb2Q9c6FK5Us8i0iqOhDmrZdCYO+/zhyrYnP/Wy1EZTWPvMrI/GVWwIDAQABAoGBAJW5Sg8HIKYKq5NxhezY1rHiXYHWV4nmE0ogXTZk4nusiI+Ys5PncimcQFFKAUBNsEL4WB9QhplGI3UIihNyOZx68waSB6NiAi+tz8i7edTxDfwWkM271roOJxD3RzUJuQkyc57ZxrD61UyodRatmRoJkPhLBlEvIr9/dCwYBl0pAkEA5ucK8CFdxr4DWIAutZLeeeQx9oe1tCi/iUvEpSDOHKAvaELLBiD4bIInN4nx/Gj1gwHqICg8L/gs0x23cQWz3QJBAL6kYaRQFvCmVajTaTJ3ef3gYwynPsmfT5Urx0DWW5rXtbtZQ7vScDKRU4YbmBb3tD5eT/Fl/dIakPGv+hxllpcCQA3o5TPKDsgmMjVmo2m0y0o0gP4E9uE/gypWMiZwb3ox/CkfvPNFkTGYNZyW5sj52bBmsR/2zIlnPewJ4j8gxNECQDOT/8LX1E0Jg5VolUaNIpk4UzQCL6+XBY4DSSZWmHQdNlLYxMWVGrvjq6hV4OEd5UsWcySJhpGIlHx/Mvjp10MCQAon0SLhRI8QNrWfp/dLuFdqTy4b4y64j3HvooOu6GDZwCLwjqvwML3rimxUi52EQspssIOlLjpQjvIJvYBKBys=-----END RSA PRIVATE KEY-----";

var encrypted = EC.RsaEncrypt(input, Key);

string password = EC.RsaDecrypt(encrypted, Key);

Encryption Class

using System;
using System.IO;
using System.Text;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Encodings;
using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.OpenSsl;

namespace TemarkNamespace
{
    internal class Encryption
    {
        public string RsaEncrypt(string clearText, string Key)
        {
            var bytesToEncrypt = Encoding.UTF8.GetBytes(clearText);

            var encryptEngine = new Pkcs1Encoding(new RsaEngine());

            using (var txtreader = new StringReader(Key))
            {
                var keyPair = (AsymmetricCipherKeyPair)new PemReader(txtreader).ReadObject();

                encryptEngine.Init(true, keyPair.Private);
            }

            var encrypted = Convert.ToBase64String(encryptEngine.ProcessBlock(bytesToEncrypt, 0, bytesToEncrypt.Length));
            return encrypted;
        }

        // Decryption:
        public string RsaDecrypt(string pass, string Key)
        {
            var bytesToDecrypt = Convert.FromBase64String(pass);

            AsymmetricCipherKeyPair keyPair;
            var decryptEngine = new Pkcs1Encoding(new RsaEngine());

            using (var txtreader = new StringReader(Key))
            {
                keyPair = (AsymmetricCipherKeyPair)new PemReader(txtreader).ReadObject();

                decryptEngine.Init(false, keyPair.Private);
            }

            var decrypted = Encoding.UTF8.GetString(decryptEngine.ProcessBlock(bytesToDecrypt, 0, bytesToDecrypt.Length));
            return decrypted;
        }
    }
}

EDIT: I found this code and it seems to work fine using System.Security.Cryptography;

public string Encrypt(string s)
{
    if (String.IsNullOrEmpty(s))
    {
        return s;
    }
    else
    {
        var encoding = new UTF8Encoding();
        byte[] plain = encoding.GetBytes(s);
        byte[] secret = ProtectedData.Protect(plain, null, DataProtectionScope.CurrentUser);
        return Convert.ToBase64String(secret);
    }
}

public string Decrypt(string s)
{
    if (String.IsNullOrEmpty(s))
    {
        return s;
    }
    else
    {
        byte[] secret = Convert.FromBase64String(s);
        byte[] plain = ProtectedData.Unprotect(secret, null, DataProtectionScope.CurrentUser);
        var encoding = new UTF8Encoding();
        return encoding.GetString(plain);
    }
}
0 Answers
Related