学无先后达者为师!
不忘初心,砥砺前行。

路遥工具箱新增 RSA 密钥生成、格式转换功能,支持 XML 格式密钥。

路遥工具箱今日新增以下功能:

  1. RSA 密钥生成
  2. RSA 格式转换

不同于其他工具,路遥工具箱的 RSA 密钥工具为 .NET 开发人员提供了更为强力的支撑。

路遥工具箱 RSA 工具集的特点

路遥工具箱是一个客户端应用,其绝大部分功能都是无需联网的,RSA 工具集也包含在内。所有的数据都在本机处理,保证不会经由网络泄漏。

RSA 密钥生成功能支持 512、1024、2048、4096 三种长度的密钥生成,除了提供常规的 PKCS#1 和 PKCS#8 格式之外,还支持了 .NET 平台特有的 XML 格式导出:

路遥工具箱的 RSA 密钥生成功能

RSA 密钥转换功能支持将 PKCS#1、PKCS#8 和 XML 格式的私钥进行格式转换,并支持公钥提取功能(也支持提取 XML 格式的公钥)。

路遥工具箱的 RSA 格式转换功能

该转换器会自动识别私钥的格式,而无需手动选择。

如何使用 C# 识别私钥的格式

判断私钥是否为 XML 格式,仅需要检查私钥开头是否为 <RSAKeyValue> 即可。PEM 格式的私钥需要对私钥内容掐头去尾,只保留中间的 BASE64 部分内容。

要判断一个私钥是 PKCS#1 还是 PKCS#8 格式,需要将 BASE64 解码为二进制后查看其第 8 个字节。如果该字节的取值是 0x30 则代表这是一个 PKCS#8 格式的私钥,如果是 0x02 则代表格式为 PKCS#1 。实现代码如下:

public static RSA CreateRsa(string key)
{
	if (string.IsNullOrWhiteSpace(key)) throw new Exception("私钥不能为空");
	//<RSAKeyValue>
	var rsa = RSA.Create();
	if (key.StartsWith("<RSAKeyValue>"))
	{
		rsa.FromXmlString(key);
	}
	else
	{
		if (Regex.IsMatch(key, @"^[-]+BEGIN"))
		{
			key = Regex.Match(key, @"(?<=KEY[-]+[\r\n]+)[\s\S]+(?=[\r\n]+[-]+END)").Value;
			key = Regex.Replace(key, @"[\r\n]+", string.Empty);
		}
		var bytes = Convert.FromBase64String(key);
		if (bytes.Length < 8) throw new Exception("私钥长度过短");
		switch (bytes[7])
		{
			case 0x30://PKCS8
				rsa.ImportPkcs8PrivateKey(bytes, out _);
				break;
			case 0x02://PKCS1
				rsa.ImportRSAPrivateKey(bytes, out _);
				break;
			default: throw new Exception("仅支持 PKCS#1 和 PKCS#8 格式的 RSA 私钥。");
		}
	}
	return rsa;
}

以上代码需要在 .NET Standard 2.1 框架以上运行。

下载路遥工具箱

路遥工具箱下载地址:路遥工具箱

赞(1) 打赏
未经允许不得转载:码农很忙 » 路遥工具箱新增 RSA 密钥生成、格式转换功能,支持 XML 格式密钥。

评论 抢沙发

给作者买杯咖啡

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册