How to encrypt byte array with p7b cert in .net6? I have to do it 'on the fly', without installing cert on my machine. I can store byte64 string in config, but what next? I've tried with X509Certificate2(certBytes)
but does not work for me.
Any ideas or examples?
For the import of a PKCS#7/.p7b file, SignedCms.Decode()
can be used.
The Certificates
property provides a list of the certificates contained, from which the certificate in question can be determined.
The public key can then be extracted from this, which can finally be used for encryption.
Sample code:
using System.Security.Cryptography;
using System.Security.Cryptography.Pkcs;
using System.Security.Cryptography.X509Certificates;
...
string certPkcs7Pem = @"-----BEGIN PKCS7-----
MIIDnAYJKoZIhvcNAQcCoIIDjTCCA4kCAQExADALBgkqhkiG9w0BBwGgggNvMIID
azCCAlOgAwIBAgIUZHKTKuZUNTr2YOAjYcIGL8BA/uYwDQYJKoZIhvcNAQELBQAw
RTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGElu
dGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yMzExMjAxNzA4NTdaFw0yNDExMTkx
NzA4NTdaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYD
VQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEBAQUA
A4IBDwAwggEKAoIBAQDPnM9a8TNIT8fcj/QcG5AQ/Hghs3PQNSpX52oPoEVq4fNf
3O1gNDVRWU/A5jZyevho7CN5eLu66MNmuVWlB8uUKjOAdV9lZfGBG/RHaUgAjxjz
vr6FJUDGYKeBs2La0h5wVnznA2PrTeDygdsjk4EwjCqGZLBm9/MzEDjmJGX8g3rx
cDRqtj0dGMoEAKb8Qe7of+/7gMAdL/e4ah5I8pn6S+yklcizPMs6lgNzGsnOa29V
6h65HdkZ3MuxeDPLH7Z8l4ka+frDTv2y53d99d/X5BcmOO1l7LrgirXhfrfqgZN9
qqefmwQb48BUiEI7s+8bJskdkc9/2dekLo5VgtpfAgMBAAGjUzBRMB0GA1UdDgQW
BBRfeiVpG6aM8da1mtUOjyym0EAwGDAfBgNVHSMEGDAWgBRfeiVpG6aM8da1mtUO
jyym0EAwGDAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBk4ePL
NagcsTa1mRNND1NqTRd2ziaygiszxBXI5l7kqKXhhWaEVd3zJqQhnKuH0S7VnoW9
oxUhIBmYFl9Bl5yg22YIrypdWjp1ZggrbnsSBGZiMzEuD/q/9CfduON0FVWc2LVA
XxNCUHis3BwCrs0943L9yd4Nzpp083Fq8tDSrNBvYHCrYgpealV1ynYK7XKKrYVJ
sEc0XU8obqUcsAVxmyOW9cA0D7lBYu6efqwkfOQCFp/HVOrKyBjAja0KeW0zb0Q3
1mXNerqx7Z4w1iE+0jKIWXCYhMNb4RQ4YUKahPos5TD5VDRVSzMTGqZuxqvCIJHp
EHIkK0Zod+1tgsE3oQAxAA==
-----END PKCS7-----";
// PEM -> DER
PemFields pemFields = PemEncoding.Find(certPkcs7Pem);
byte[] cert = Convert.FromBase64String(certPkcs7Pem[pemFields.Base64Data]);
// Import PKCS#7 certificate
SignedCms signedCms = new SignedCms();
signedCms.Decode(cert);
X509Certificate2Collection x509Certificate2Collection = signedCms.Certificates;
using X509Certificate2 x509Certificate2 = x509Certificate2Collection[0];
// Extract public key
using RSA rsa = x509Certificate2.GetRSAPublicKey();
// Encrypt
byte[] ciphertext = rsa.Encrypt(Encoding.UTF8.GetBytes("The quick brown fox jumps over the lazy dog"), RSAEncryptionPadding.Pkcs1);
Console.WriteLine(Convert.ToBase64String(ciphertext));