在 .NET 中加载椭圆曲线 (EC) 密钥

在 .NET 中加载椭圆曲线 (EC) 密钥

本文将讨论在.NET 中解析和加载EC 密钥的不同方式。在本文中,您将了解 EC 密钥的构成,然后了解如何以四种不同的方式使用这些知识ECDsa在 .NET 中加载或创建对象。到本文结束时,您应该能够加载 EC 密钥,无论格式如何。

本文针对 .NET Core 3.1 及更高版本。

椭圆曲线 (EC) 密钥的参数

加载 EC 密钥时,您将需要了解三件事:

1.私钥(可选)2.公钥3.您需要使用的曲线

私钥d是一个随机整数,其长度取决于您使用的曲线。如果你有私钥,你就可以对数据进行签名。

公钥是椭圆曲线上的一个点,使用坐标x&y。因此,公钥特定于该曲线,并使用私钥乘以曲线上的生成点G生成。使用公钥,您将能够验证签名。

这表明您需要了解正在使用的椭圆曲线(例如,NIST 的 P-256[1]或secp256k1[2])才能使用椭圆曲线加密 (ECC)。如果不知道曲线,您将不知道私钥应该有多长、提供的安全级别或公钥是否有效(如果它们是曲线上的点)。

如果您想了解有关椭圆曲线密码学工作原理的更多信息,我发现开发人员实用密码学[3]是一本有用的读物。

.NET 的ECDsa对象

.NET 对 ECDSA 的抽象是ECDsaSystem.Security.Cryptography. 这继承AsymmetricAlgorithm并遵循RSA您之前可能使用过的类的类似模式。 ECDsa是一个抽象类,具有使用不同实现的各种平台(例如,Windows 上的 CNG 和 Linux 上的 OpenSSL)。

此类的主要用途是调用SignDataVerifyData方法。否则,您可能会将其传递到SecurityKey 实现[4]或 SignedXml。

本文的其余部分将重点介绍如何创建ECDsa实现。

使用ECDsa和命名曲线生成 EC 密钥

创建新 EC 密钥的最简单方法是使用 .NETCreate上的方法让 .NET 为您完成ECDsa。这将在您选择的曲线上创建一个私钥。您通常会使用已知的命名曲线,例如 NIST 的 P-256,又名 secp256r1。您可以在ECCurve.NamedCurve课程中找到 .NET 支持的开箱即用曲线。

ECDsa key = ECDsa.Create(ECCurve.NamedCurves.nistP256);

这种方法非常适合在测试期间即时生成密钥,但是一旦对象被处置,您就会丢失密钥。幸运的是,您可以使用各种导出方法ECDsa;否则,您可以使用该ExportParameters方法直接访问 EC 参数。这些导出方法使您可以访问ECParameters包含关键点曲线、D 和 Q ( x & y ) 点的对象,您将在接下来的操作中看到这些点。

创建ECDSA使用为ECParameters

假设您已经收到曲线的原始点,并且您需要以这种方式加载密钥。这在使用 JSON Web Keys (JWK) 和OpenID Connect[5]时很常见。

这是来自 RFC 7517 的 JWK 示例:

{"kty": "EC","crv": "P-256","x": "f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU","y": "x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0","kid": "my EC key"
}

要加载密钥,您需要知道密钥使用什么曲线以及公钥参数(x和y坐标)。也可以使用d参数将私钥包含在 JWK 中;然而,这种情况很少见。

您可以再次使用ECDsaCreate方法加载这些坐标,但这次您将传入一些ECParameters.

// parse curve from JOSE format
// https://www.iana.org/assignments/jose/jose.xhtml#web-key-elliptic-curve
var curve = crv switch
{"P-256" => ECCurve.NamedCurves.nistP256,"P-384" => ECCurve.NamedCurves.nistP384,"P-521" => ECCurve.NamedCurves.nistP521,_ => throw new NotSupportedException()
};ECDsa key = ECDsa.Create(new ECParameters
{Curve = curve,D = Base64UrlEncoder.DecodeBytes(d), // optionalQ = new ECPoint{X = Base64UrlEncoder.DecodeBytes(x),Y = Base64UrlEncoder.DecodeBytes(y)}
});

在这里,您正在解析 JOSE 名称中的曲线,并使用 中找到的编码器对其他参数进行 base64url 解码Microsoft.IdentityModel.Tokens

此解析特定于 JWK 使用的格式,但它演示了如何在知道其参数的情况下加载 EC 密钥。

有一种Validate方法ECParameters可以检查关键和坐标大小并检查曲线是否有效。但是,Createon的方法ECDsa会为您调用它。

如果您确实有 JWK 并打算使用它来验证 JWT,我建议将 JWK 直接传递到构造函数中Microsoft.IdentityModel.Tokens.JsonWebKey并跳过我在上面演示的手动解析。

从X509Certificate2加载ECDsa

从 an 加载 EC 密钥X509Certificate2是简单使用GetECDsaPrivateKeyGetECDsaPublicKey方法的一种情况。

ECDsa key = cert.HasPrivateKey ? cert.GetECDsaPrivateKey() : cert.GetECDsaPublicKey();

为了首先加载X509Certificate2,您可以从 PEM 文件加载它[6]

X509Certificate2.PrivateKey与GetRSAPrivateKey和GetECDsaPrivateKey

过去,您可能在 上使用了PrivateKeyPublicKey属性X509Certificate2。但是,如果您尝试在包含 EC 密钥的证书上使用这些属性,您将获得 null forPrivateKey和以下异常PublicKey

System.NotSupportedException: 不支持证书密钥算法。在 System.Security.Cryptography.X509Certificates.PublicKey.get_Key()

要使用来自 X.509 的 EC 密钥,您需要使用GetECDsaPrivateKeyGetECDsaPublicKey方法。

从 .NET 6 开始,PrivateKeyPublicKey属性被标记为过时。因此,您必须使用RSAECDsa特定方法来全面加载密钥。

从十六进制字符串加载ECDsa

有时,您会看到 EC 密钥作为十六进制字符串共享。这在加密社区中很常见,我的意思是密码学和加密货币。我不能说它在密码学中是否有很大用处。这些键看起来像这样:

Private: c711e5080f2b58260fe19741a7913e8301c1128ec8e80b8009406e5047e6e1ef
Public: 04e33993f0210a4973a94c26667007d1b56fe886e8b3c2afdd66aa9e4937478ad20acfbdc666e3cec3510ce85d40365fc2045e5adb7e675198cf57c6638efa1bdb

这些键起初可能看起来有点奇怪,但它们实际上映射回您已经使用的参数。私钥只是d参数的十六进制表示,公钥是连接在一起的x &y坐标(第一个字节是标签)。

因此,您可以再次使用ECParameters来创建您的ECDsa对象:

public static ECDsa LoadFromHex()
{var privateKeyBytes = FromHexString("c711e5080f2b58260fe19741a7913e8301c1128ec8e80b8009406e5047e6e1ef");var publicKeyBytes = FromHexString("04e33993f0210a4973a94c26667007d1b56fe886e8b3c2afdd66aa9e4937478ad20acfbdc666e3cec3510ce85d40365fc2045e5adb7e675198cf57c6638efa1bdb");return ECDsa.Create(new ECParameters{Curve = ECCurve.NamedCurves.nistP256, // you'd need to know the curve before handD = privateKeyBytes,Q = new ECPoint{X = publicKeyBytes.Skip(1).Take(32).ToArray(),Y = publicKeyBytes.Skip(33).ToArray()}});
}private static byte[] FromHexString(string hex) {var numberChars = hex.Length;var hexAsBytes = new byte[numberChars / 2];for (var i = 0; i < numberChars; i += 2)hexAsBytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);return hexAsBytes;
}

源代码

您可以在我的GitHub 示例存储库中[7]找到演示上述方法的可执行代码。此代码是多目标 .NET Core 3.1 及以上版本,可在 Windows 和 Linux 上运行。

查看原文:https://www.scottbrady91.com/c-sharp/ecdsa-key-loading

References

[1] NIST 的 P-256: https://www.scottbrady91.com/C-Sharp/JWT-Signing-using-ECDSA-in-dotnet-Core
[2] secp256k1: https://www.scottbrady91.com/C-Sharp/Supporting-Custom-JWT-Signing-Algorithms-in-dotnet-Core
[3] 开发人员实用密码学: https://cryptobook.nakov.com/asymmetric-key-ciphers/elliptic-curve-cryptography-ecc
[4] SecurityKey 实现: https://www.scottbrady91.com/C-Sharp/JWT-Signing-using-ECDSA-in-dotnet-Core
[5] OpenID Connect: https://www.scottbrady91.com/OpenID-Connect/OpenID-Connect-Overview
[6] 从 PEM 文件加载它: https://www.scottbrady91.com/C-Sharp/PEM-Loading-in-dotnet-core-and-dotnet
[7] GitHub 示例存储库中: https://github.com/scottbrady91/Blog-Example-Classes/tree/master/EcdsaKeyLoading

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298895.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线性跟驰模型 matlab,Bierley非线性跟驰模型特性仿真分析

第 28卷第 4期 2014年 8月 黑 龙 江 工 程 学 院 学 报 Journal of Heilongjiang Institute of Technology VoL 28&#xff0c;NO&#xff0e;4 Aug&#xff0e;&#xff0e;2014 Bierley非线性跟驰模 型特性仿真分析 李全艳&#xff0c;崔 琳&#xff0c;詹晓松 (黑龙江工程学…

MDT部署中命令行脚本的使用。

参考&#xff1a;http://blogs.technet.com/b/deploymentguys/archive/2010/07/07/using-command-shell-scripts-with-mdt.aspx OK… I’ll admit it, I like to write Command Shell (CMD) scripts when I can. For me it’s like putting on an old broken-in pair of sneak…

CSS/DIV网页设计视频教程目录【转】

CSS/DIV网页设计视频教程目录 欢迎您来到前沿视频教室&#xff0c;下面列出的是CSS/DIV网页设计视频教程列表。这组视频教程是配合《精通CSSDIV网页样式与布局》图书制作的&#xff0c;每一课对应于图书中的每一章。 我们还会不断地推出相关的课程&#xff0c; 如果您有兴趣&am…

世界上最伟大的十大公式

▲ 点击查看英国科学期刊《物理世界》曾让读者投票评选了“最伟大的公式”&#xff0c;最终榜上有名的十个公式既有无人不知的112&#xff0c;又有著名的Emc^2&#xff1b;既有简单的-圆周公式&#xff0c;又有复杂的欧拉公式……这些公式不仅仅是数学家和物理学家的智慧结晶&a…

区块链浏览器_全球首款区块链浏览器是啥名堂?傲游6首发体验

[PConline 应用]沉寂多年的傲游浏览器终于准备发布大版本更新了&#xff0c;这次为大家带来的是傲游浏览器6&#xff0c;一个被官方称为“世界第一个区块链浏览器”的新版本&#xff0c;那么&#xff0c;有何特色呢&#xff1f;我们一起来看看吧。傲游浏览器6(后简称傲游6)在安…

ASP.NET Core官方文档+源码,这样学效率高10倍!

.NET Framework停更一年了&#xff0c;学习.NET Core跨平台是大势所趋。如何快速学习ASP.NET Core&#xff1f;在我看来&#xff0c;先看微软ASP.NET Core5.0官方中文文档&#xff0c;再大致读一遍源码&#xff0c;最后结合一些场景做些扩展封装&#xff0c;就可以很轻松的驾驭…

WPF 2D绘图(2)Geometry

Shape是对Geometry的一种封装,Shape本质上还是通过绘制Geometry的形状,然后以填充笔刷来呈现效果 如Rectangle <Path Stroke"Black" StrokeThickness"1" Fill"#CCCCFF"><Path.Data><RectangleGeometry Rect"30,55 100 30&qu…

php ip处理函数,PHP取ip地址函数

从thinkphp3.2中提取出来的取请求ip地址的函数/*** 获取客户端IP地址* param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字* param boolean $adv 是否进行高级模式获取(有可能被伪装)* return mixed*/function get_client_ip($type false, $adv true) {$type …

Windows Server 2008 R2 之三十故障转移群集(二)

五、群集的管理破坏群集&#xff1a;一个两节点的群集&#xff0c;对于第一个节点必须在“节点”中选择“退出”才能退出群集&#xff1b;对于第二个节点&#xff0c;必须在下图选择“破坏群集”才能退出群集。配置服务和应用程序&#xff1a;节点&#xff1a;存储&#xff1a;…

Oracle执行计划详解

---引用------作者&#xff1a;TTT BLOG本文地址&#xff1a;http://blog.chinaunix.net/u3/107265/showart_2192657.html---简介&#xff1a;本文全面详细介绍oracle执行计划的相关的概念&#xff0c;访问数据的存取方法&#xff0c;表之间的连接等内容。并有总结和概述&#…

提升心力---摆脱拿着锤子看啥都是钉子

从程序员到一个团队的管理者&#xff0c;这中间需要经过一次又一次的蜕变&#xff0c;最终才能变得处理任何事情都得心应手。韩非子曾说&#xff1a;下君用己之力、中君用人之力、上君用人之智。大部分的管理者可能都处在用人之力的阶段&#xff0c;并向着用人之智前进。最近看…

curd什么意思中文_每日一句英译英:She's a ten什么意思?

每日一句英译英&#xff1a;Shes a ten什么意思&#xff1f;用一句“没头没脑”的英语句子劈头盖脑就问你“中文什么意思&#xff1f;“&#xff0c;这是典型的把英语当纯粹知识学习的例子&#xff0c;也是“只求答案&#xff0c;不问过程”的应试思维模式。“知识海洋”浩瀚无…

你家猫砸东西是不是也专挑贵的砸?

1 这猫也太会了吧&#xff1f;▼2 哥哥坐地上耍赖想让爸爸抱被妹妹出手摆平了▼3 好可爱的校车▼4 也许人家只是想静静呢&#xff1f;▼5 最近很流行的【泼花成画】▼6 妹妹的表情简直学到了精髓▼7 介绍一下&#xff0c;这是一只阿拉斯猪和阿拉斯小猪崽儿▼你点的每个赞…

C++巧用do...while(0)

在C中&#xff0c;有三种类型的循环语句&#xff1a;for, while, 和do...while&#xff0c; 但是在一般应用中作循环时&#xff0c; 我们可能用for和while要多一些&#xff0c;do...while相对不受重视。 但是&#xff0c;最近在读我们项目的代码时&#xff0c;却发现了do..…

SQL Server 分区表 处理海量数据

你是不是也在苦苦寻求优化自己的SQL Server数据库的方法?如果你的数据库里有不少非常大的表格&#xff0c;分区功能能够帮到你很大的忙…… 【IT专家网独家】你是不是也在苦苦寻求优化自己的SQL Server数据库的方法?如果你的数据库里有不少非常大的表格&#xff0c;分区功能能…

php curl实现get请求,PHP中使用curl实现Get和Post请求 | 严佳冬

一、基本结构1、初始化curl_init()2、设置变量curl_setopt() 。最为重要&#xff0c;一切玄妙均在此。有一长串curl参数可供设置&#xff0c;它们能指定URL请求的各个细节。执行并获取结果3、执行curl_exec()4、释放cURL句柄curl_close()二、Get方式实现//初始化$ch curl_init…

第十一周项目3-程序的多文件组织

下面的程序中的代码分别保存在两个文件中&#xff0c;利用多文件的方式组织。 mian.cpp /**Copyright (c) 2014,烟台大学计算机学院*All gight reserved.*文件名称&#xff1a;temp.cpp*作者&#xff1a;邵帅*完成时间&#xff1a;2014年11月5日*版本号&#xff1a;v1.0 */ #in…

st link v2引脚连接_ST-Link资料02_ST-Link固件介绍,及固件命名规则

说明&#xff1a;本文原创作者『strongerHuang』本文首发于微信公众号『嵌入式专栏』&#xff0c;同时也更新在我的个人网站&#xff1a;EmbeddedDevelop一、写在前面一些人可能看了上一篇关于ST-Link的内容&#xff0c;就会产生疑惑。。。ST-Link有那么多硬件版本&#xff0c;…

Redis 使用 Lua 脚本进行原子操作

Redis 使用 Lua 脚本进行原子操作Intro之前写过一篇文章也是 Redis 使用 LUA 脚本实现分布式的 CAS 操作&#xff0c;可以参考&#xff1a;基于 Redis 实现 CAS 操作最近使用 Redis 的时候有一个需求&#xff0c;只有值发生变化的时候才更新&#xff0c;如果要更新的值和现在的…

奇妙的数学动图,美到令人窒息!

全世界只有3.14 % 的人关注了爆炸吧知识来源&#xff1a;制造科技原理&#xff0c;版权原作者所有。如有侵权联系删除&#xff01;论文查重券 限时免费领 官方授权 安全保障 真实有效点「在看」的人都变好看了哦