Chiffrement avec une clé privée RSA en Java
Je suis en train de chiffrer certains contenus avec une clé privée RSA.
Je suis en suivant cet exemple:
http://www.junkheap.net/content/public_key_encryption_java
mais la conversion à l'utilisation des clés privées plutôt que publiques. Suivant cet exemple, je pense que ce que j'ai à faire est:
- Lire dans un DER-format de la clé privée
- Générer un PCKS8EncodedKeySpec
- appel generatePrivate() à partir de KeyFactory pour obtenir une clé privée d'objet
- Utiliser que la clé privée de l'objet avec le Chiffrement objet de faire le cryptage
Donc les étapes:
La clé a été générée à partir d'openssl avec:
openssl genrsa -aes256 -out private.pem 2048
puis a été converti au format DER avec:
openssl rsa -in private.pem -outform DER -out private.der
- Je générer la PKCS8EncodedKeySpec avec:
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;
Puis générer la clé privée de l'objet avec:
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;
Cependant, sur l'appel de:
pk = kf.generatePrivate(privateKeySpec);
J'obtiens:
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)
Questions:
- Est l'approche générale de droit?
- Est le PCKS8EncodedKeySpec le droit keyspec à utiliser?
- Toute réflexion sur la clé non valide spec erreur?
source d'informationauteur wadesworld
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, je ne comprends pas pourquoi vous avez décidé d'utiliser un
Cipher
pour crypter avec une clé privée, plutôt que de signer avec uneSignature
. Je ne suis pas sûr que tous les RSACipher
fournisseurs d'utiliser le bon type de bloc pour la configuration, mais il vaut la peine d'essayer.Réglage de cela de côté, cependant, je pense que vous essayez de charger un non-standard OpenSSL-clé de format. Convertir en DER avec
rsa
est avant tout une base 64 décoder; la structure de la clé n'est pas PKCS #8.Au lieu de cela, après
genrsa
utilisez leopenssl pkcs8
commande pour convertir la clé générée de non chiffrés PKCS #8, DER format:Ceci produira le chiffrement d'une clé privée peut être chargée d'un
PKCS8EncodedKeySpec
.Vous ne pouvez pas chiffrer avec la clé privée. Si JCE vous permet de le faire, c'est seulement par accident.
Vous devez utiliser la signature. Voici l'extrait de code pour le faire,
Ses pas un accident que le chiffrement avec la clé privée est autorisée. Si vous voulez briser une signature individuelle de hachage et de chiffrement, cryptage à clé privée est essentielle.
Disons que j'ai un document que j'ai besoin de signer et de ma clé réside sur un réseau de HSM. Maintenant que j'ai écouter l'intégralité du document au HSM pour signer ou je peux créer un local de hachage et de le transmettre à la HSM pour le chiffrement seul.
Mon choix va dépendre de ce que le local de hachage calcul me donne de meilleures performances, à savoir un savoir délégués de hachage calcul avec la latence du réseau.
Cette question est assez vieux, mais je suis récemment tombé sur le problème (je suis la mise en œuvre des exigences de certaines protocole qui exige de chiffrement avec la clé privée). Je vais juste citer le post de forum:
essayez ceci: