Search code examples
c#vb.netencryptionbouncycastle

x509Certificate to RsaKeyParameters for encrypt data


I'm trying to encrypt data with BouncyCastle in VB so i take for reference this answer example code and have something like this:

        Dim cerReader = New PemReader(File.OpenText("the\route\certificate.cer"))
        Dim rsaPub = CType(cerReader.ReadObject(), Org.BouncyCastle.Crypto.Parameters.RsaKeyParameters)
        Dim encrypter = New OaepEncoding(New RsaEngine(), New Sha256Digest(), New Sha256Digest(), Nothing)
        encrypter.Init(True, rsaPub)
        Dim cipher = encrypter.ProcessBlock(data, 0, data.Length)
        Return Convert.ToBase64String(cipher)

but in the line:

Dim rsaPub = CType(cerReader.ReadObject(), Org.BouncyCastle.Crypto.Parameters.RsaKeyParameters)

gives me this error:

Cannot cast an object of type 'Org.BouncyCastle.X509.X509Certificate' to type 'Org.BouncyCastle.Crypto.Parameters.RsaKeyParameters'.

and i can't found in the docs some example o make that cast or encrypt using .cer just .pem that i think is the same but doesn't work. Someone have a idea of what can I do?


Solution

  • The extension .cer is ambiguous, sometimes it means a PEM encoded, sometimes a DER encoded certificate. Since you are applying a PemReader I assume you are using a PEM encoded certificate.
    On the linked site a PEM encoded public key is imported, while here a certificate is imported. For this the second line has to be replaced by:

    Imports Org.BouncyCastle.X509
    ...
    Dim rsaPub = DirectCast(cerReader.ReadObject(), X509Certificate).GetPublicKey()
    

    With this the PemReader imports an X509Certificate whose public key is fetched with GetPublicKey(). The rest of the code does not need to be changed.