Создание открытого ключа из ключей Azure B2C с помощью phpseclib3

#php #azure #azure-ad-b2c #public-key-encryption #phpseclib3

Вопрос:

Большинство примеров создания открытого ключа из модуля и экспоненты Azure B2C используют phpseclib и передают строку XML в библиотеку для создания открытого ключа.

Однако phpseclib3, похоже, переключает это, предоставляя PublicKeyLoader, который принимает массив с ключами, в котором ключи e и n для показателя и модуля являются экземплярами BigInteger.

Какие преобразования должны произойти со значениями e и n, предоставленными Azure B2C, чтобы сделать их подходящими для использования с PublicKeyLoader?

Многие примеры для более старых версий phpseclib будут преобразованы из base64url в base64, но я не знаю, является ли это исключительно в интересах метода преобразования XML и будет ли это работать с функцией BigInteger.

Генерация этого открытого ключа предназначена для проверки подписи маркера доступа с помощью lcobucci/jwt.

Ответ №1:

После небольшого экспериментирования и дальнейших поисков можно использовать следующий метод.

Преобразуйте каждое значение из base64url в base64 и декодируйте. Возможно, вы захотите использовать PHP-пакет spomky-labs/base64url.

Распакуйте значение из hex

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

затем преобразуйте в BigInteger, используя базу 16

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

Единственное, что следует отметить, это то, что некоторые примеры декодирования Base64URL добавляют заполнение при подготовке к коду base64_decode. Цитируемая библиотека этого не делает, но у меня это сработало.