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
相关产品推荐
相关产品推荐

