为什么Java KeyStore在加载OpenPGP密钥时失败?

时间:2016-01-26 17:34:47

标签: java encryption rsa public-key openpgp

我愿意花一些时间为桌面Java应用程序开发另一个许可管理器。经过一些环顾四周,我发现Iakin JCPUID可以免费使用,并且应该可以在大多数操作系统中使用我发现here的本机库。

我的想法是做两个模块:主应用程序将显示带有CPU ID和验证文本字段的弹出窗口和密钥生成器应用程序。用户将CPU ID传递给keygen所有者,后者将向用户返回验证码(使用keygen生成)。用户提交正确的验证码后,将在文件系统中创建具有该代码的许可证文件。每次应用程序启动时,它都会检查该文件的存在性和正确性,然后加载主应用程序屏幕。

如何进行代码验证,我认为最好的选择是使用非对称加密技术,特别是RSA。公钥将内置到应用程序中,秘密将内置到密钥生成器中。因此CPUID将传递给密钥生成器所有者,然后与RSA签名。该签名将被转移回用户,用户将使用内置公钥验证其有效性。

我使用Kleopatra和gpg Linux命令行工具本身生成了gpg密钥对。然后我尝试用这种方法签名:

    private byte[] createSignature(byte[] file) {
    byte[] signature = null;

    try {
        java.security.KeyStore keyStoreFile = java.security.KeyStore
                .getInstance("PKCS12");
        keyStoreFile.load(getClass().getClassLoader().getResourceAsStream("/secret.asc"),
        "******".toCharArray());

        PrivateKey privateKey = (PrivateKey) keyStoreFile.getKey(
                "My Name Here", "******".toCharArray());

        Signature dsa = Signature.getInstance("SHA1withRSA");
        dsa.initSign(privateKey);
        dsa.update(file, 0, file.length);
        signature = dsa.sign();

    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return signature;
}

privateKey初始化抛出异常:

java.security.InvalidKeyException: Key must not be null

我想这是因为错误的实例格式:

java.security.KeyStore keyStoreFile = java.security.KeyStore
            .getInstance("PKCS12");

我想知道:

  1. 这种方法有多好?

  2. 不同的OpenPGP密钥格式之间存在什么区别?在这种情况下最好使用哪种格式?如何知道现有OpenPGP文件的格式?

1 个答案:

答案 0 :(得分:1)

Java加密框架不支持OpenPGP。 X.509密钥(例如PKCS12格式)与OpenPGP不兼容 - 尽管它们(主要)依赖于(大部分)相同的加密算法。

使用X.509证书(您也可以为此目的创建自己的CA),或者依赖OpenPGP for Java的实现。在开源库方面,您可以通过BouncyCastle(LGPL)在本机Java实现GnuPG(MIT许可证)或接口Java GPGME binding(GPL)之间进行选择。

BouncyCastle可能是更好的方法,因为您需要做的就是添加另一个Java库,而不是在系统中安装另一个软件。