在Java中以十六进制生成公钥和私钥

时间:2018-12-25 23:05:24

标签: java

我想请生成十六进制的公钥和私钥。 当前输出以中文书写。 我想要用十六进制编写的公钥和私钥的输出。 谢谢你。

// Class
public class GenerateKeys {

private final KeyPairGenerator keyGen;
private KeyPair pair;
private PrivateKey privateKey;
private PublicKey publicKey;

// Constructor
public GenerateKeys(int keylength) throws NoSuchAlgorithmException, NoSuchProviderException {
    this.keyGen = KeyPairGenerator.getInstance("RSA"); // Algorithm 
    this.keyGen.initialize(keylength);
    }

public void createKeys() {
    this.pair = this.keyGen.generateKeyPair();
    this.privateKey = pair.getPrivate();
    this.publicKey = pair.getPublic();
}

public PrivateKey getPrivateKey() {
    return this.privateKey;
}

public PublicKey getPublicKey() {
    return this.publicKey;
}

public void writeToFile(String path, byte[] key) throws IOException {
    File f = new File(path);
    f.getParentFile().mkdirs();

        try (FileOutputStream fos = new FileOutputStream(f)) {
            fos.write(key);
            fos.flush();
        }
}
    // Main
    public static void main(String[] args)
    {
    GenerateKeys gk;
    try {
        gk = new GenerateKeys(1024);
        gk.createKeys();
        gk.writeToFile("MyKeys/publicKey",gk.getPublicKey().getEncoded());
        gk.writeToFile("MyKeys/privateKey",gk.getPrivateKey().getEncoded());
    } catch (NoSuchAlgorithmException | NoSuchProviderException | IOException e) {
        System.err.println(e.getMessage());
    }
}

}

1 个答案:

答案 0 :(得分:4)

看来您实际上并不是在创建用中文编写的文件。您似乎正在做的是创建所谓的“二进制”文件。这些是您的计算机可以理解的文件,但是当您在文本编辑器中打开它们时,由于它们没有任何意义,因此您无法阅读它们。经常会出现其他语言的符号。

使用byte[]写入FileOutputStream数组将始终生成二进制文件。

要创建人类可读的文件并以十六进制显示密钥,可以使用此代码替换writeToFile()方法。

public void writeToFile(String path, byte[] key) throws IOException {
    File f = new File(path);
    f.getParentFile().mkdirs();

    StringBuilder sb = new StringBuilder();
    for(byte b: key) {
        sb.append(String.format("%02X", b) + " ");
    }

    try (FileWriter fos = new FileWriter(f)) {
        fos.write(sb.toString());
        fos.flush();
    }
}

这会生成一个文本文件,其中byte[]数组中的每个键值都将转换为十六进制。