【问题标题】:X509 Public Key to HEXX509 十六进制公钥
【发布时间】:2015-12-23 05:57:01
【问题描述】:

我有一个PublicKey (java.security.PublicKey)。 我需要将其转换为 HEX 字符串。

就像您打开证书(例如在 Windows 上)并查看公钥信息时一样。你会看到:

04 40 ad 77 10 45 08 f2 3a ae 1d 1d 95 22 2f b3 f5 e5 2f da db 8c 39 3a 03 15 fb 4b 36 28 46 de 7b 00 f4 73 11 ae b9 ac 00 aa 19 34 6d fb 7c 56 b1 93 c0 1b 86 7c d0 a2 0b 4d 22 a9 d2 4d b0 f6 34 c4 (*)

任何想法如何做到这一点?

编辑:

我试过了:

Hex.encodeHexString(cert.getPublicKey.getEncoded)

它返回一个字符串:

3063301c06062a8503020213301206072a85030202230106072a850302021e01034300_0440ad77104508f23aae1d1d95222fb3f5e52fdadb8c393a0315fb4b362846de7b00f47311aeb9ac00aa19346dfb7c56b193c01b867cd0a20b4d22a9d24db0f634c4

此字符串包含 HEX 值 (*)(我将 _ 放在它开始的位置)。

【问题讨论】:

  • 您尝试过任何东西了吗? PublicKey 有一个 getEncoded() 方法来返回字节,然后你只需要一个字节数组到十六进制的转换——在 Stack Overflow 上有很多例子。
  • @JonSkeet 是的,我试过了。 getEncoded 以其主要编码格式返回密钥。就我而言,它是 X.509。那么,如何解码呢?
  • 是什么让您认为您需要对其进行解码?如果您将getEncoded() 返回的字节转换为十六进制,与您在问题中显示的十六进制相比如何?
  • 你想用这个公钥做什么?这是 RSA 密钥吗?您需要它的哪些部分:模数 (n) 或公共指数 (e) 或两者兼而有之?以什么格式? (我不知道 Windows for ex. 使用什么格式。)

标签: java cryptography hex x509certificate public-key


【解决方案1】:

您在 Java 中拥有的称为SubjectPublicKeyInfo,它确实在 Java 中指定。您可以在线查看here。正如我们所见,它是俄罗斯 GOST 椭圆曲线公钥。它包含公钥格式的 OID(对象标识符)、椭圆曲线域参数和哈希标识符。

您还可以看到,您从 Microsoft 获得的价值有点奇怪。实际公钥值为:

ad77104508f23aae1d1d95222fb3f5e52fdadb8c393a0315fb4b362846de7b00f47311aeb9ac00aa19346dfb7c56b193c01b867cd0a20b4d22a9d24db0f634c4

0440 只是表示该值被编码为八位字节字符串(又名字节数组)。更确切地说是重点:

(78460489894733727260622807718072211860518873236604684346084533999519831849728, 110567644507038660207162091352707227223755109412227308137485312229644099269828)

在 256 位曲线上。您可以通过 middel 精确拆分二进制字符串来获得这些值(由于它们的编码方式,任何一个坐标都与曲线具有相同的大小)。

现在,如果您想获得公钥值,您可以(至少)采取两种方式。要么解析从getEncoded 返回的字节,要么找出PublicKey 的实际类型,将其转换为该类型,然后使用特定类的附加功能来检索有关公钥的信息,例如作为椭圆曲线点。

【讨论】:

  • 非常感谢。我将公钥转换为 GostPublicKey,然后调用 getDecoded.asInstanceOf[SubjectPublicKeyInfo](来自 ru.CryptoPro.JCP.ASN.PKIX1Explicit88.SubjectPublicKeyInfo 包)。并且可以从 SubjectPublicKeyInfo 中获取 subjectPublicKey,它返回给我 Asn1BitString。
【解决方案2】:

您可以使用下面的代码以与 windows 相同的表示形式获取公钥值。

PublicKey publicKey = ...;
String publickKeyHexValue = Hex.toHexString(publicKey.getEncoded());

ps:我使用了BouncyCastle 库,尤其是org.bouncycastle.util.encoders 包中的HEX 类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 2018-07-26
    • 2011-12-09
    • 2018-07-09
    相关资源
    最近更新 更多