Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Java密钥库在加载OpenPGP密钥时失败?_Java_Encryption_Rsa_Public Key_Openpgp - Fatal编程技术网

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

为什么Java密钥库在加载OpenPGP密钥时失败?,java,encryption,rsa,public-key,openpgp,Java,Encryption,Rsa,Public Key,Openpgp,我愿意花一些时间为桌面Java应用程序开发另一个许可证管理器。环顾四周后,我发现Iakin可以免费使用,并且可以在我发现的大多数带有本机libs的操作系统上使用 我的想法是做两个模块:主应用程序将显示带有CPU ID和验证文本字段的弹出窗口,以及密钥生成器应用程序。用户将CPU ID传递给keygen所有者,后者将验证码(使用keygen生成)返回给用户。用户提交正确的验证代码后,将在文件系统中创建带有该代码的许可证文件。每次应用程序启动时,它都会检查该文件的存在性和正确性,然后加载主应用程序屏

我愿意花一些时间为桌面Java应用程序开发另一个许可证管理器。环顾四周后,我发现Iakin可以免费使用,并且可以在我发现的大多数带有本机libs的操作系统上使用

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

关于代码验证,我认为最好的选择是使用非对称加密,特别是RSA。公钥将内置于应用程序中,而机密将内置于密钥生成器中。所以CPUID将被传递给密钥生成器所有者,然后用RSA签名。该签名将被传输回用户,用户将使用内置公钥验证其有效性

我使用Kleopatra和gpglinux命令行工具本身生成了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");
我想知道:

  • 这种方法到底有多好

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


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

    要么使用X.509证书(您也可以为此创建自己的CA),要么依赖OpenPGP for Java的实现。就开源库而言,您可以选择本机Java实现(MIT许可证)或通过(LGPL)的接口(GPL)

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