C# 将RSA公钥编码为DER格式

C# 将RSA公钥编码为DER格式,c#,cryptography,der,C#,Cryptography,Der,我需要一个编码成DER格式的RSA公钥 密钥对是使用RSACryptServiceProvider生成的 我要找的是与java等价的c: PublicKey pubKey = myPair.getPublic(); byte[] keyBytes = pubKey.getEncoded(); 我曾尝试查看BouncyCastle,但迷路了,因此如果有解决方案,欢迎使用任何指针。使用BouncyCastle: using Org.BouncyCastle.X509; using Org.Boun

我需要一个编码成DER格式的RSA公钥

密钥对是使用RSACryptServiceProvider生成的

我要找的是与java等价的c:

PublicKey pubKey = myPair.getPublic();
byte[] keyBytes = pubKey.getEncoded();
我曾尝试查看BouncyCastle,但迷路了,因此如果有解决方案,欢迎使用任何指针。

使用BouncyCastle:

using Org.BouncyCastle.X509;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Generators;
using Org.BouncyCastle.Crypto.Parameters;

...

var generator = new RsaKeyPairGenerator ();
generator.Init (new KeyGenerationParameters (new SecureRandom (), 1024));
var keyPair = generator.GenerateKeyPair ();
RsaKeyParameters keyParam = (RsaKeyParameters)keyPair.Public;
var info = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo (keyParam);
RsaBytes = info.GetEncoded ();
最后三行是获取RSA公钥并将其导出的行。

使用Bouncy Castle:

using Org.BouncyCastle.X509;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Generators;
using Org.BouncyCastle.Crypto.Parameters;

...

var generator = new RsaKeyPairGenerator ();
generator.Init (new KeyGenerationParameters (new SecureRandom (), 1024));
var keyPair = generator.GenerateKeyPair ();
RsaKeyParameters keyParam = (RsaKeyParameters)keyPair.Public;
var info = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo (keyParam);
RsaBytes = info.GetEncoded ();

最后三行是获取RSA公钥并将其导出的行。

我尝试使用前面提到的info.GetEncoded,但结果是,我无法使用它验证使用相应私钥创建的签名

对我有效的是将其转换为X509Certificate2

private bool VerifySignature(string stringContent, string stringSignature, X509Certificate2 x509PublicKey)
{
    Int16 cbSignature = 0, cbCert = 0;
    int cbData = 0;
    CertBasicStruct sCert = new CertBasicStruct();
    var pbCert = PublicKey.RawData;
    cbCert = (Int16)pbCert.Length;

    byte[] pbData = Encoding.UTF8.GetBytes(stringContent);
    cbData = (Int16)pbData.Length;
    byte[] pbSignature = Convert.FromBase64String(Signature);
    cbSignature = (Int16)pbSignature.Length;
    var rtn = DllImportService.DecodeCertificate(pbCert, cbCert, ref sCert);
    var rtn_1 = DllImportService.VerifySignatureByCert(ref sCert, DllImportService.CKM_SHA256_RSA_PKCS, pbData, cbData, pbSignature, cbSignature);
    if (rtn_1 == 0)
    {
        LogWndAppendLine("Signature is valid.");
        return true;
    }
    else
    {
        LogWndAppendLine("Signature is invalid");
        return false;
    }
}

X509Certificate2.RawData将是您要查找的内容。

我尝试使用前面提到的info.GetEncoded,但结果是,我无法使用它验证使用相应私钥创建的签名

对我有效的是将其转换为X509Certificate2

private bool VerifySignature(string stringContent, string stringSignature, X509Certificate2 x509PublicKey)
{
    Int16 cbSignature = 0, cbCert = 0;
    int cbData = 0;
    CertBasicStruct sCert = new CertBasicStruct();
    var pbCert = PublicKey.RawData;
    cbCert = (Int16)pbCert.Length;

    byte[] pbData = Encoding.UTF8.GetBytes(stringContent);
    cbData = (Int16)pbData.Length;
    byte[] pbSignature = Convert.FromBase64String(Signature);
    cbSignature = (Int16)pbSignature.Length;
    var rtn = DllImportService.DecodeCertificate(pbCert, cbCert, ref sCert);
    var rtn_1 = DllImportService.VerifySignatureByCert(ref sCert, DllImportService.CKM_SHA256_RSA_PKCS, pbData, cbData, pbSignature, cbSignature);
    if (rtn_1 == 0)
    {
        LogWndAppendLine("Signature is valid.");
        return true;
    }
    else
    {
        LogWndAppendLine("Signature is invalid");
        return false;
    }
}
X509Certificate2.RawData将是您需要的