基于模数和指数生成Google Sign-in公钥的通用方法咨询
从Google JWK的模数(n)和指数(e)生成RSA公钥实现思路
JWK规范中RSA密钥的
n(模数)、e(公钥指数)均为URL安全Base64编码格式,并非十六进制字符串,这是此前调试报错的核心原因。
核心实现步骤(通用伪代码)
步骤1:将Base64URL编码的n、e转换为原始二进制字节
// 输入:jwk_n(JWK中n字段的字符串)、jwk_e(JWK中e字段的字符串) // 输出:n_bytes(模数的原始字节数组)、e_bytes(指数的原始字节数组) 函数 base64url_to_bytes(input_str): // 先把Base64URL转为标准Base64格式 standard_b64 = input_str.replace('-', '+').replace('_', '/') // 补全末尾的填充字符=,长度需为4的倍数 padding_length = (4 - len(standard_b64) % 4) % 4 standard_b64 = standard_b64 + '=' * padding_length // 标准Base64解码得到原始字节 return base64_decode(standard_b64) n_bytes = base64url_to_bytes(jwk_n) e_bytes = base64url_to_bytes(jwk_e)
步骤2:处理二进制字节的ASN.1正整数标识
ASN.1 DER规范要求:如果正整数的首字节最高位为1(即数值 >= 0x80),需要在字节数组开头补一个
0x00字节,避免被解析为负整数
函数 to_asn1_positive_integer(byte_arr): if byte_arr[0] >= 0x80: return [0x00] + byte_arr else: return byte_arr asn1_n = to_asn1_positive_integer(n_bytes) asn1_e = to_asn1_positive_integer(e_bytes)
步骤3:拼接成完整的DER格式公钥
RSA公钥的DER结构为固定头部 + 密钥内容序列,通用拼接逻辑:
// 2048位RSA公钥OID固定头部(谷歌OAuth2证书均为2048位RSA,可直接使用;其他长度密钥需按ASN.1规则调整头部长度位) rsa_oid_header = hex_to_bytes("30820122300D06092A864886F70D01010105000382010F00") // 拼接得到完整DER公钥字节 der_public_key = rsa_oid_header + asn1_n + asn1_e
步骤4:可选转换为PEM格式公钥(大部分场景通用的文本格式)
// 输入:der_public_key(DER字节数组) // 输出:pem_public_key(文本格式公钥) 函数 der_to_pem(der_bytes): b64_str = base64_encode(der_bytes) // 每64个字符插入换行 wrapped_b64 = insert_newline_every_64_chars(b64_str) return "-----BEGIN PUBLIC KEY-----\n" + wrapped_b64 + "\n-----END PUBLIC KEY-----" pem_public_key = der_to_pem(der_public_key)
内容的提问来源于stack exchange,提问作者Rishav Sharan
相关产品推荐
相关产品推荐

