java - 从 (RSA) PublicKey 手动创建 JWK

标签 java rsa public-key jwk

我需要将 RSA 公钥转换为有效的 JWK。特别是 JWK 的值“n”和“e”是我正在努力解决的问题。在查看位于 https://www.rfc-editor.org/rfc/rfc7517#page-25 的示例 JWK 时,编码似乎不正确

目前我的代码基本上是这样的:

private Map<String, Object> generateJWK(PublicKey publicKey){

    RSAPublicKey rsa = (RSAPublicKey) publicKey;

    Map<String, Object> values = new HashMap<>();

    values.put("kty", rsa.getAlgorithm()); // getAlgorithm() returns kty not algorithm
    values.put("kid", "someuniqueid");
    values.put("n", Base64.encode(rsa.getModulus().toString()));
    values.put("e", Base64.encode(rsa.getPublicExponent().toString()));
    values.put("alg", "RS256");
    values.put("use", "sig");

    return values;
}

但是输出似乎没有正确编码或类似的东西,例如 e 看起来像这样:NjU1Mzc=

n 不包括特殊字符,如 -_+。 :

jMzk1MNT0xTk2NED1xzzgNyQ00IykADzMAM0c0wz0M0MONj2z5TgNzI3yAM0OONYzzMjzwNzDxgAzxDxzMMAjTwNNDYMINMgNQDOEAkIM2jMQzkjUTDUYONNg1A00Tw1Nx4YEzAzjUT1MTNMjDjMM1MNNAjyTMIzxNADDINQANwT5yTDEMjEzNz2z2gOgjDDDNyNDjTzz43ETOYMI35gDjE00MYYM2DzDjDgww53Mwz0ME1NMgOM3MIzYTzMwzOMIQU5MjOzUjMNQNNg50U5NIDNzw2DMMOggNcQQM21TI5NMzDTN5Mj123O33MNNMkyNTNONxMM5wMMc04jTgAUE3MM1zMg4NNMT4MNDMM5yTO2j4jNDEMy1yNANNAzOIEUDzNwzExwTIkNjUjkN54Uz0DT5x0zM51k2MxYkx0zMNzxMkDUDTTQN3gAYODATQDDwMDMjMMcONjxMNTYMT5kgxNkMjNMQU0jzMEwIIMzTzUD4MgYDkDNzcAzN0TN4yNTz11DMxDUjDM2MyDMy4DEINMwT22QxjNNEzNDATy1OM1NNDxYgz5TxDkj3gQ32kIwNNkDO3xczDAENcTMNO0MOjTDwE3g11wNUcgNTwQk30kjjNNzTz4jTj4OOjQNYzMzcMjTQMkyzNNNUQOTOMMkMMMNzwNxDOEkg4xADIT4DNxMz2TENT4yN4z2I2zjyMU3DTOEQN4MIQjNDMU5Y11QkccwMNI0kNzyNjMMN4NMTTNMzMwxMjjDzgAANO1zwjYIEUjM1ADgDNjxTITMNNkIYxzyzzEEDMzDzNjzM4NjNNjc3ITTD0T5jzN=

我假设值 n 和 e 都没有正确编码吗? 我应该如何将 PublicKey 转换为 JWK? (不能使用第三方库)

最佳答案

JWK 使用与 base64 略有不同的 base64url 编码。此外,不要对 BigInteger 值使用 toString() 方法。直接获取字节数组形式的数据

改变

Base64.encode(rsa.getModulus().toString())
Base64.encode(rsa.getPublicExponent().toString())

Base64.getUrlEncoder().encodeToString(rsa.getModulus().toByteArray())
Base64.getUrlEncoder().encodeToString(rsa.getPublicExponent().toByteArray())

关于java - 从 (RSA) PublicKey 手动创建 JWK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51323689/

相关文章:

java - Java中计算两个地理坐标之间的距离

rsa - 使用 pkcs#11 api 使用 RSA 签署 sha256 哈希?

java - 将字符串转换为加密 key ,反之亦然java

firebase - 在 Tapkey 上处理过期 Firebase token 的最佳方法

Java 可以替代 AWT 来捕获鼠标事件吗?

java - 从堆栈中删除一个元素

java - 获取星期几和时间的 Date 实例

c# - 使用 .Net 进行 RSA 签名并使用 OpenSSL 命令进行验证

cryptography - X.509 和 pem 的区别

encryption - 在命令行中使用 openssl 使用公钥解密