我使用 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/