使用 phpseclib3

问题描述

从 Azure B2C 模数和指数生成公钥的大多数示例使用 PHPseclib 并将 XML 字符串传递给库以生成公钥。

然而,PHPseclib3 似乎通过提供一个 PublicKeyLoader 来改变这一点,它接受一个键控数组,其中键是 e 和 n 作为 BigInteger 实例的指数和模数。

需要对 Azure B2C 提供的 e 和 n 值进行哪些转换才能使其适合与 PublicKeyLoader 一起使用?

旧版本的 PHPseclib 的许多示例都会从 base64url 转换为 base64,但我不知道这是否纯粹是为了 XML 转换方法的好处,以及是否可以与 BigInteger 函数一起使用。

此公钥的生成是为了通过 lcobucci/jwt 验证访问令牌签名。

解决方法

经过一些实验,进一步搜索可以使用以下方法。

将每个值从 base64url 转换为 base64 并解码。您可能喜欢使用 PHP 包 spomky-labs/base64url。

从十六进制解包一个值

$value = unpack('H*',$value);

然后转换为 BigInteger,使用基数 16

new BigInteger($value[1],16);

唯一需要注意的是,一些 Base64URL 解码示例在准备 base64_decode 时会添加填充。引用的库没有,但对我有用。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...