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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 00:27:06