【问题标题】:Java load public keyJava 加载公钥
【发布时间】:2016-07-21 07:44:21
【问题描述】:

我有一个像这样返回的公钥

"kty" : "RSA",
"alg" : "RS256",
"ext" : false,
"n": "vswzzDmrqLSHUu61YDxUhM87hjcVjg42NwpFOyLQK8CyW5YRcr1YUkFRNDbb92MTNW3CsSWJX3DSuilnxf8n3_JW-A9R5JAqwmEygYIXuFcoJ_pb923bph0-ayWPBfD-qwYrELvpiEHBf1QSLJYkRb1wzAlwhCeYJorifu2WhCZoOVVYQAEyNqYF7AVhNImioT8-lhFWGqHp2Jt7-oXtCjVVyyShRHUMYyCRzGj1VGI6AU5DgVebXYD2GJawUhX    -AD2CzsX8lMXeaVu88sBU9XLL1Zb_cOvAC7wTXxcls0taKx-8PiWUWKjSg0-O2ZXbfFROyQpQYHQH0BkO8XRh8w"
"e" : "AQAB"

而且,我想用java来加载它,我的代码是这样的

package key;

import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;

public class PublicKeyReader {

    public static PublicKey get() throws Exception {
        String key = "vswzzDmrqLSHUu61YDxUhM87hjcVjg42NwpFOyLQK8CyW5YRcr1YUkFRNDbb92MTNW3CsSWJX3DSuilnxf8n3_JW-A9R5JAqwmEygYIXuFcoJ_pb923bph0-ayWPBfD-qwYrELvpiEHBf1QSLJYkRb1wzAlwhCeYJorifu2WhCZoOVVYQAEyNqYF7AVhNImioT8-lhFWGqHp2Jt7-oXtCjVVyyShRHUMYyCRzGj1VGI6AU5DgVebXYD2GJawUhX-AD2CzsX8lMXeaVu88sBU9XLL1Zb_cOvAC7wTXxcls0taKx-8PiWUWKjSg0-O2ZXbfFROyQpQYHQH0BkO8XRh8w";

        X509EncodedKeySpec spec = new X509EncodedKeySpec(key.getBytes());
        KeyFactory kf = KeyFactory.getInstance("RSA");
        return kf.generatePublic(spec);
    }

    public static void main(String[] args) {
        try {
            new PublicKeyReader().get();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

我抛出了异常,java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: invalid key format

如何正确加载?

【问题讨论】:

  • 所以回答类似问题:stackoverflow.com/questions/26867840/…
  • 我不确定我是否收到您的评论。这个问题是关于加密密钥并将其存储到文件中,然后从文件中加载它。为什么和我的问题一样?好吧,我也不太了解我的问题中的“AQAB”...
  • AQAB 只是公共指数的基数 64,通常是十六进制的010001(费马的第四个素数)。如果您按 6 位组按位查看,则数字为 000000 010000 000000 000001,数字为 0 16 0 1,als je dat vertaald naar base 64 个字符,AQABA 是 base64 字母表中的第一个字符) .
  • 在上面的评论中有一些荷兰语:如果你把它翻译成 base 64...

标签: java rsa public-key


【解决方案1】:

仅 Java 方法(看 ma,没有库):

package nl.owlstead.stackoverflow;

import java.io.File;
import java.math.BigInteger;
import java.nio.file.Files;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.RSAPublicKeySpec;
import java.util.Base64;
import java.util.Base64.Decoder;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class LoadRSAKeyFromText {

    public static void main(String[] args) throws Exception {
        // parse the lines to find the modulus n and public exponent e
        List<String> all = Files.readAllLines(new File(args[0]).toPath());
        String nString = null, eString = null;
        for (String line : all) {
            Pattern nPattern = Pattern.compile("\"n\"\\s*:\\s*\"(.*?)\",?");
            Matcher nMatcher = nPattern.matcher(line);
            if (nMatcher.matches()) {
                nString = nMatcher.group(1).replaceAll("\\s+", "");
            }

            Pattern ePattern = Pattern.compile("\"e\"\\s*:\\s*\"(.*?)\",?");
            Matcher eMatcher = ePattern.matcher(line);
            if (eMatcher.matches()) {
                eString = eMatcher.group(1);
            }
        }

        // decode base 64 (with _ and -, so URL safe)
        Decoder urlDecoder = Base64.getUrlDecoder();
        byte[] nData = urlDecoder.decode(nString);
        byte[] eData = urlDecoder.decode(eString);

        // convert to *positive* integers
        BigInteger n = new BigInteger(1, nData);
        BigInteger e = new BigInteger(1, eData);

        // create RSA specification and convert to key
        RSAPublicKeySpec keySpec = new RSAPublicKeySpec(n, e);
        KeyFactory kf = KeyFactory.getInstance("RSA");
        RSAPublicKey pk = (RSAPublicKey) kf.generatePublic(keySpec);
        System.out.println(pk.getAlgorithm());
    }
}

Java 不知道这种格式,所以你必须自己解析它,或者找到一个解码器。我很懒,就编程了。

【讨论】:

  • 非常好。谢谢!
  • 谢谢。 new BigInteger(1, nData); 拯救了我的一天!
猜你喜欢
  • 2017-05-16
  • 2021-08-17
  • 2012-04-14
  • 1970-01-01
  • 1970-01-01
  • 2015-05-14
  • 2013-07-22
  • 2020-11-29
  • 2012-07-09
相关资源
最近更新 更多