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

Flutter导入后端JWK公钥:如何将e、n转为List<int>

Flutter中JWK公钥字符串转RsaPublicKey类型的解决方法

问题核心

服务器返回的JWK公钥中,e(公钥指数)和n(模值)是URL安全的Base64字符串(例如e: AQAB),但RsaPublicKey要求这两个参数为List<int>类型;部分其他公钥实现则要求传入BigInt,需完成这两种类型的转换。

解决步骤

1. Base64字符串转List

JWK采用URL安全的Base64编码(替换+为-、/为_,可能省略末尾的=),需先补全缺失的padding再解码:

// 补全Base64 padding的工具函数
String _padBase64(String input) {
  int padLength = (4 - input.length % 4) % 4;
  return input.padRight(input.length + padLength, '=');
}

// 转换e和n为List<int>
String eStr = key['e'];
String nStr = key['n'];
List<int> eBytes = base64UrlDecode(_padBase64(eStr));
List<int> nBytes = base64UrlDecode(_padBase64(nStr));

2. List转BigInt(适配其他公钥类型)

如果使用的公钥实现要求传入BigInt,可将字节数组转换为对应类型:

BigInt eBigInt = BigInt.parse(
  eBytes.map((byte) => byte.toRadixString(16).padLeft(2, '0')).join(),
  radix: 16,
);
BigInt nBigInt = BigInt.parse(
  nBytes.map((byte) => byte.toRadixString(16).padLeft(2, '0')).join(),
  radix: 16,
);

修改后的完整代码示例

import 'dart:convert';
import 'dart:typed_data';
import 'package:jose/jose.dart';

// ... 你的请求逻辑 ...
var signature = JsonWebSignature.fromCompactSerialization(response.body);
var payload = signature.unverifiedPayload;
Map<String, dynamic> jwkData = jsonDecode(payload.jsonContent["jwk"]);

// 补全Base64 padding
String _padBase64(String input) {
  int padLength = (4 - input.length % 4) % 4;
  return input.padRight(input.length + padLength, '=');
}

// 转换为RsaPublicKey所需的List<int>
List<int> eBytes = base64UrlDecode(_padBase64(jwkData['e']));
List<int> nBytes = base64UrlDecode(_padBase64(jwkData['n']));

// 生成RsaPublicKey并转为Jwk
PublicKey rsaKey = RsaPublicKey(e: eBytes, n: nBytes);
Jwk jwk = Jwk.fromPublicKey(rsaKey);

额外提示

部分JWK处理库支持直接从JSON加载完整密钥,无需手动转换字段,例如Jwk.fromJson(jwkData),可优先尝试这种简化方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 14:05:24