Опитвам се да криптирам някакво съдържание с RSA частен ключ.
Следвам този пример: http://www.junkheap.net/content/public_key_encryption_java
но го преобразува да използва частни ключове, а не публични. Следвайки този пример, мисля, че това, което трябва да направя, е:
- Прочетете в частен ключ във формат DER
- Генерирайте PCKS8EncodedKeySpec
- извикайте generatePrivate() от KeyFactory, за да получите частен ключов обект
- Използвайте този частен ключ с обекта Cipher, за да извършите криптирането
И така, стъпките:
Ключът е генериран от openssl с:
openssl genrsa -aes256 -out private.pem 2048
и след това беше преобразуван във формат DER с:
openssl rsa -in private.pem -outform DER -out private.der
Генерирам PKCS8EncodedKeySpec с:
byte[] encodedKey = new byte[(int)inputKeyFile.length()];
try {
new FileInputStream(inputKeyFile).read(encodedKey);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(encodedKey);
return privateKeySpec;
И след това генерирайте частния ключов обект с:
PrivateKey pk = null;
try {
KeyFactory kf = KeyFactory.getInstance(RSA_METHOD);
pk = kf.generatePrivate(privateKeySpec);
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidKeySpecException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return pk;
Въпреки това, при обаждане до:
pk = kf.generatePrivate(privateKeySpec);
Взимам:
java.security.spec.InvalidKeySpecException: Unknown key spec.
at com.sun.net.ssl.internal.ssl.JS_KeyFactory.engineGeneratePrivate(DashoA12275)
at com.sun.net.ssl.internal.ssl.JSA_RSAKeyFactory.engineGeneratePrivate(DashoA12275)
at java.security.KeyFactory.generatePrivate(KeyFactory.java:237)
Въпроси:
- Правилен ли е общият подход?
- Дали PCKS8EncodedKeySpec е правилната ключова спецификация за използване?
- Някакви мисли относно грешката в спецификацията на невалидния ключ?