当前位置: 首页 > 知识库问答 >
问题:

Bouncy Castle C#-从字节数组获取公钥对象

宦琪
2023-03-14

我在web上找到的示例建议使用PublicKeyFactory.createKey,我是这样做的:

Asn1InputStream ais = new Asn1InputStream(content);
Asn1Object publicKey = ais.ReadObject();
var pubkeyParams = PublicKeyFactory.CreateKey(publicKey.GetEncoded());

不幸的是,这给了我一个异常“GetInstance中的未知对象:org.bouncycastle.asn1.derInteger\n参数名称:obj”

我猜这与密钥在字节数组中的编码方式有关。不幸的是,这不是我能控制的;但它也不是完全搞砸了,因为当我对包含密钥数据的bin文件运行OpenSSL rsa-in publickey.bin-rsapublickey_in-informder-text时,OpenSSL命令行实用程序并没有提出异议。

共有1个答案

牛华皓
2023-03-14

PublicKeyFactory用于X.509 ASN.1类型SubjectPublicKeyInfo的编码。如果您希望能够以通用的方式使用公钥,那么最好使用SubjectPublicKeyInfo作为公钥(使用PKCS#8PrivateKeyInfo)。

听起来您有一个ASN.1RSAPublickey编码,在这种情况下,您可以调整示例代码以使用:

var rsaKey = Org.BouncyCastle.Asn1.X509.RsaPublicKeyStructure.GetInstance(publicKey);

var pubkeyParams = new RsaKeyParameters(false, rsaKey.Modulus, rsaKey.PublicExponent);

ECDSA键同样可以有几种可能的格式,因此最好将其作为一个单独的问题。

 类似资料:
  • 问题内容: 我正在开发一个需要借助(NIST P-256,P-256,prime256v1)公钥来验证签名的应用程序。 公钥是由其他应用程序在较早的时间点生成的,并以十六进制编码存储在我的数据库中。十六进制字符串的格式等效于OpenSSL在调用以前由生成的文件时将生成的十六进制字符串。消息和签名是从其他应用程序接收的。考虑以下测试数据: 现在,这 应该 是有效的签名。 我的目标是使用Java和/或

  • 我正在开发一个应用程序,它需要在(NIST P-256,P-256,prime256v1)公钥的帮助下验证签名。 公钥是由一个不同的应用程序在较早的时间点生成的,并以十六进制编码存储在我的数据库中。这里的十六进制字符串的格式等效于OpenSSL在调用时生成的十六进制字符串,该文件以前是由生成的。消息和签名是从不同的应用程序接收的。考虑以下测试数据: 现在这应该是一个有效的签名。 我的目标是使用Ja

  • 您可以在AWS KMS中创建非对称密钥对(加密/解密)。当前AWS CLI允许访问公钥(https://awscli.amazonaws.com/v2/documentation/api/latest/reference/kms/get-public-key.html) 我无法在Terraform的KMS资源中看到这一点。是我错过了什么还是这只是在最新版本中还没有,

  • 问题内容: 我想从ByteArrayInputStream获取内部字节数组。我不想扩展该类或将其写入另一个字节数组。有实用程序类可以帮助我做到这一点吗? 谢谢, 问题答案: 扩展,则可以访问这些字段。这是这样做的方式。提供了构造函数以从参数获取字节数组。 但是,您可能会发现装饰器模式更有帮助。

  • 问题内容: 我正在尝试学习一些加密编码,并生成了当前保存在字节数组中的32字节私有密钥( byte [] privatekey )。我知道公钥是使用 secp256k1 命名为椭圆曲线参数和一个公式生成的,其中,其中G是椭圆曲线上的某个点(ECPoint?),但是我无法将该命名参数的规范和公式转换为的实际编码公钥。我知道自Java 7起,and包中包含一些类,以简短的代码即可完成此操作,但是我找不

  • 问题内容: 我记得很久以前使用OpenSSL进行过此操作,但是我想知道是否可行以及如何进行,我从未在Java上使用过密码学。 问题答案: 您不能直接从另一个生成任何一个密钥。从数学上讲这是不可能的。如果你有一个含有密钥团 两者 的公钥和私钥,你可以提取它们的相对轻松的任何一个。 编辑,2017年: 多年之后,人们对加密技术有了更深入的了解,现在我很清楚这个答案并不正确。 引用维基百科: 公用密钥由