【问题标题】:Generating keys for RSA dotnet core为 RSA dotnet 核心生成密钥
【发布时间】:2021-10-05 08:14:23
【问题描述】:

我正在尝试使用以下内容将 RSA 公钥导入 dotnet:

var rsa = RSA.Create();
rsa.ImportRSAPublicKey(Convert.FromBase64String(PublicKey), out _);

密钥是通过以下方式生成的:

openssl genrsa -out name_of_private_key.pem 2048
openssl rsa -in name_of_private_key.pem -pubout > name_of_public_key.pem

输出:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtZL7iKRPSxrCflER6j/I
wB9fODXJgfxR4UBSU3oUJ8tIaBBnDrcutfXDfc7lZ9HcCZccvUsMzFKGJuvHthCE
/LNJmZtRRd02aLynoZSWqDBerCdRqXHbecMfK8KPxQSsWfinNiyFG76vTX2+V8P6
t4Cu8bM8j7foSBgOmECCSOjTuCG4bvKVS3bnu2lSBNgCjEMltk9W/3oSzKbN/mwn
GfViaXU5a1Zps3jLbx/z58o3Sb25QfQKU4xeohcx+Wj6d14lI80RErS1QTqSQ1rz
10Cs/Q1MudWstckqyE/u048GtXzQCzQOe4hWlyrcFqfiEAbV2jPLU61oer4/wT+0
7QIDAQAB
-----END PUBLIC KEY-----

但是这会返回

System.Security.Cryptography.CryptographicException: ASN1 corrupted data.

要导入密钥,我将获取标题之间的文本并删除换行符,仅此而已。我注意到rsa.ImportSubjectPublicKeyInfo 似乎可以工作,但是我并没有尝试生成 X.509 密钥,我想要一个 PKCS#1 密钥,以便我可以使用上面的代码。

猜我搞砸了 openssl 命令?

【问题讨论】:

  • 在您的声明中将-pubout 替换为-RSAPublicKey_out。之后要转换 X.509/SPKI 密钥,请使用 openssl rsa -pubin -RSAPublicKey_out -in <x509.pem> -out <public_pkcs1.pem>
  • 遇到一些奇怪的语法错误。你介意完整的样本吗?也请作为答案,以便您获得积分。
  • 好的,请看我的回答。
  • ...我没有尝试生成 X.509 密钥... 该调用与“X. 509 键”。这只是 RFC 5280 中定义的公钥格式,可以说这种格式比您似乎更喜欢的“PKCS #1”更标准且可互操作。

标签: .net-core rsa asp.net-core-3.1


【解决方案1】:

您可以使用以下 OpenSSL 语句将发布的 X.509/SPKI 密钥转换为 PKCS#1 公钥:

openssl rsa -pubin -RSAPublicKey_out -in name_of_public_key.pem > name_of_public_key_conv_pkcs1.pem

这将返回 name_of_public_key_conv_pkcs1.pem 的以下密钥:

-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAtZL7iKRPSxrCflER6j/IwB9fODXJgfxR4UBSU3oUJ8tIaBBnDrcu
tfXDfc7lZ9HcCZccvUsMzFKGJuvHthCE/LNJmZtRRd02aLynoZSWqDBerCdRqXHb
ecMfK8KPxQSsWfinNiyFG76vTX2+V8P6t4Cu8bM8j7foSBgOmECCSOjTuCG4bvKV
S3bnu2lSBNgCjEMltk9W/3oSzKbN/mwnGfViaXU5a1Zps3jLbx/z58o3Sb25QfQK
U4xeohcx+Wj6d14lI80RErS1QTqSQ1rz10Cs/Q1MudWstckqyE/u048GtXzQCzQO
e4hWlyrcFqfiEAbV2jPLU61oer4/wT+07QIDAQAB
-----END RSA PUBLIC KEY-----

或者,您可以使用以下 OpenSSL 语句直接生成 PKCS#1 公钥:

openssl genrsa -out name_of_private_key.pem 2048
openssl rsa -in name_of_private_key.pem -RSAPublicKey_out > name_of_public_key_pkcs1.pem

PKCS#1 格式的公钥可以用你发布的代码导入,例如

var PublicKey = @"-----BEGIN RSA PUBLIC KEY-----
                MIIBCgKCAQEAtZL7iKRPSxrCflER6j/IwB9fODXJgfxR4UBSU3oUJ8tIaBBnDrcu
                tfXDfc7lZ9HcCZccvUsMzFKGJuvHthCE/LNJmZtRRd02aLynoZSWqDBerCdRqXHb
                ecMfK8KPxQSsWfinNiyFG76vTX2+V8P6t4Cu8bM8j7foSBgOmECCSOjTuCG4bvKV
                S3bnu2lSBNgCjEMltk9W/3oSzKbN/mwnGfViaXU5a1Zps3jLbx/z58o3Sb25QfQK
                U4xeohcx+Wj6d14lI80RErS1QTqSQ1rz10Cs/Q1MudWstckqyE/u048GtXzQCzQO
                e4hWlyrcFqfiEAbV2jPLU61oer4/wT+07QIDAQAB
                -----END RSA PUBLIC KEY-----".
                Replace("-----BEGIN RSA PUBLIC KEY-----", "").
                Replace("-----END RSA PUBLIC KEY-----", "").
                Replace("\r\n", "");
var rsa = RSA.Create();
rsa.ImportRSAPublicKey(Convert.FromBase64String(PublicKey), out _);

RSAParameters parameters = rsa.ExportParameters(false);
Console.WriteLine(new BigInteger(parameters.Exponent, true, true)); // 65537
Console.WriteLine(new BigInteger(parameters.Modulus, true, true));  // 22921612997464368147681940553984745387167552018036344531503795467063837226615581953768444015539628345845035732103113334279875993301411098168640007990192163617624452836576802897196284289413557038039593995983320236405640276117810563150914793233680115042600127677172037054986051882799772185194759951925398974095268701931531156047608941244890064857847352301510189736406400522269201574332107656671336685945934753045233371160604896169352804846566979618872110365310073347596127824815830796826711019699206801083371733500629381548849681219453339114997443300562712444634750316194264179142382642144192449752430619501209065600237

【讨论】:

  • 非常感谢。你说它是 SQL,但我设法从命令行运行。非常感谢您的帮助。
  • @m.edmondson - 谢谢,一定是精神失常,我的意思当然是 OpenSSL。修好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多