如何在Dart中为ED25519公钥生成DER编码的PEM字符串
实现方案
ED25519公钥的SPKI格式DER编码有固定前缀,无需引入额外第三方包,手动拼接即可完成转换,生成的PEM可直接被Node.js标准库解析。
工具函数代码
import 'dart:convert'; import 'package:cryptography/cryptography.dart'; // ED25519公钥对应的SPKI格式固定DER头 const List<int> _ed25519SpkiHeader = [0x30, 0x2a, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70, 0x03, 0x21, 0x00]; String ed25519PublicKeyToPem(List<int> rawPublicKeyBytes) { // 校验ED25519公钥长度 if (rawPublicKeyBytes.length != 32) { throw ArgumentError('无效ED25519公钥:长度必须为32字节'); } // 拼接得到完整DER编码字节 final derBytes = [..._ed25519SpkiHeader, ...rawPublicKeyBytes]; // Base64编码后按PEM规范每64字符换行 final base64Content = base64.encode(derBytes); final pemBuffer = StringBuffer(); pemBuffer.writeln('-----BEGIN PUBLIC KEY-----'); for (int i = 0; i < base64Content.length; i += 64) { final end = i + 64 > base64Content.length ? base64Content.length : i + 64; pemBuffer.writeln(base64Content.substring(i, end)); } pemBuffer.writeln('-----END PUBLIC KEY-----'); return pemBuffer.toString(); } // 使用示例 void main() async { final keyPair = await Ed25519().newKeyPair(); final publicKey = await keyPair.extractPublicKey(); final publicKeyPem = ed25519PublicKeyToPem(publicKey.bytes); // 输出的publicKeyPem可直接发送到Node.js服务端 }
兼容性说明
生成的PEM完全符合SPKI标准,你Node.js端的crypto.createPublicKey代码无需任何修改即可直接解析该公钥。
内容的提问来源于stack exchange,提问作者Abhishek729
相关产品推荐
相关产品推荐

