You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin使用Curve25519时公钥长度44字节不符合32字节要求如何解决

Curve25519公钥加载长度异常问题解答

产生原因

  • Java加密体系中PublicKey接口的encoded属性默认返回X.509标准的SubjectPublicKeyInfo(SPKI)结构的DER编码结果,并非Curve25519原生的32字节公钥原始值。
  • SPKI结构除了包含32字节的Curve25519公钥有效数据外,还额外携带了算法标识、算法参数等元数据头信息,这部分头信息长度固定为12字节,加上32字节原始公钥刚好得到你遇到的44字节总长度。

解决方法

你可以选择以下任意一种方式获取符合要求的32字节原生公钥:

方案1:直接截取末尾字节(简单高效)

Curve25519的SPKI编码结构固定,44字节编码的最后32字节就是原生公钥,直接截取即可:

val public = loadPublicKey(publicTxt)
// 截取最后32字节作为Curve25519原生公钥
val rawCurve25519PublicKey = public.encoded.takeLast(32).toByteArray()
// 验证长度,输出为32
println(rawCurve25519PublicKey.size)

方案2:通过BouncyCastle API显式提取(兼容性更强)

如果需要适配更多场景避免结构变动风险,可以通过解析SPKI结构的方式获取原始公钥:

private fun extractRawCurve25519PublicKey(publicKey: PublicKey): ByteArray {
    val spki = SubjectPublicKeyInfo.getInstance(publicKey.encoded)
    return spki.parsePublicKey().encoded
}

将加载得到的PublicKey实例传入该方法,即可直接得到32字节的有效公钥。

内容的提问来源于stack exchange,提问作者Anath43ema

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 00:09:00