java - KeyStore.getKey() 返回 null

标签 java encryption

我使用 keytool 和以下命令生成了一个 keystore :

keytool -genkey -alias serverprivate -keystore serverprivate.jks -storetype JKS -keyalg RSA -sigalg SHA256withRSA -keysize 2048 -storepass doyouknowdewey

key 通行证和商店通行证是相同的。然后我提取公钥并将其插入到它自己的 keystore 中:

keytool -export -alias serverprivate -keystore serverprivate.jks -file temp.key -storepass doyouknowdewey
keytool -import -noprompt -alias serverpublic -keystore serverpublic.jks -file temp.key -storepass public

现在我使用 keystore 在 java 中创建一个 InputStream 并创建一个 KeyStore 对象:

InputStream is = getClass().getResourceAsStream("keys/serverprivate.jks");
KeyStore serverPrivate = KeyStore.getInstance("JKS");
serverPrivate.load(is, "doyouknowdewey".toCharArray());

我提取 key 来创建密码实例,以便可以加密和解密文本:

Key key = serverPrivate.getKey("serverprivate", "douyouknowdewey".toCharArray());

一切正常,我可以使用私钥加密数据。但是,如果我尝试使用公钥解密/加密,则 Key 对象为 null:

InputStream is = getClass().getResourceAsStream("keys/serverpublic.jks");
KeyStore serverPublic = KeyStore.getInstance("JKS");
serverPublic.load(is, "public".toCharArray());
Key key = serverPrivate.getKey("serverpublic", "public".toCharArray());
if(key == null) {
    System.err.println("Key is null");
} 
//returns null

那么我该如何完成这项工作呢?

编辑:

显然 serverpublic 不是 key ,而是证书。我通过运行 serverPublic.isKeyEntry("serverpublic"); 发现,它返回 false,而 serverPublic.isCertificateEntry("serverpublic"); 返回 true。所以我将代码更改为:

InputStream is = getClass().getResourceAsStream("keys/serverpublic.jks");
KeyStore serverPublic = KeyStore.getInstance("JKS");
serverPublic.load(is, "public".toCharArray());
Certificate cert = serverPrivate.getCertificate("serverpublic");
if(cert == null) {
    System.err.println("Key is null");
} 

这不再返回 null。但是当我运行这个时,cipher.init仍然抛出一个空指针异常:

Cipher cipher;
cipher.init(Cipher.ENCRYPT_MODE, cert);

最佳答案

serverpublic 不是 key ,而是证书。我必须使用

加载它
Certificate cert = serverPrivate.getCertificate("serverpublic");

然后调用

Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, cert);

关于java - KeyStore.getKey() 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48325491/

相关文章:

java - Ant 的新手,JUnit 的 ClassNotFoundException

Java:为什么java不能自动将 "finalize"局部变量包含在lambda表达式的封闭范围内?

java - 如何获取特定时间间隔的位置

java - 根据规范,EJB 计时器调用是否可以与指定计时器重叠?

Java 的 CipherOutputStream 与 A​​pache 的 CryptoOutputStream 性能

java - java中interrupt()方法与线程状态的精确行为

python - 没有名为 crypto.cipher 的模块

java - 使用 AES 256 和 SHA-2 加密

java - 有效数字字符串上的 NumberFormatException

Java RSA 为什么每次都有不同的密文?