Je suis en train de chiffrer un contenu avec une clé privée RSA.
je suis cet exemple:
http://www.junkheap.net/content/public_key_encryption_java
mais la conversion à utiliser les clés privées plutôt que publiques. À la suite de cet exemple, je pense que ce que je dois faire est: p>
Ainsi, les étapes: p>
La clé a été générée à partir OpenSSL avec: p>
puis a été converti en format DER avec: p> Je générer le PKCS8EncodedKeySpec avec: p> OpenSSL genrsa -aes256 private.pem 2048 -out code > p> openssl rsa -in private.pem -outform DER -out private.der code> p> 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)
5 Réponses :
Tout d'abord, je suis confus pourquoi vous envisagez d'utiliser un Réglage de côté, je pense que vous essayez de charger un Touche de format OpenSL non standard. La convertir en der avec à la place, après Ceci produira une clé privée non cryptée pouvant être chargée avec un chiffrer code> pour chiffrer avec une clé privée, plutôt que de vous connecter avec une signature code>. Je ne suis pas sûr que tous les fournisseurs code> Cipher code> utiliseront le type de blocage correct pour la configuration, mais cela vaut la peine d'essayer. RSA code> est essentiellement juste un décodeur de base-64; La structure de la clé n'est pas pkcs # 8. p> genrsa code>, utilisez la commande openssl pkcs8 code> pour convertir la touche générée en PKC non crypté. # 8, format der: p> pkcs8encodedkeyspec code>. P> p >
Honnêtement, je n'étais pas au courant de la signature. Pour vous assurer de bien comprendre son utilisation, j'initialiserais l'objet de signature, mettre en appelais la mise à jour avec les octets que je veux signer, puis appeler le signe? Et puis je peux stocker les octets retournés du signe comme ma signature numérique?
Bonjour. Quelqu'un a finalement résolu le problème? J'ai une veille privée que je ne peux pas charger Java pour continuer la phase de signature WIHT. Mon privéKey est RSA, PKCS # 8 DER et il a un mot de passe. Comment puis-je charger cela en Java? L'exception dans mon cas est java.security.spec.invalidkeyspecException: java.security.invalidKeyException: IoException: DER Entrée, Erreur d'étiquette entier Code>
@ Brabbit27 Pour charger une clé privée directement, il doit être non crypté. Utilisez la commande openssl pkcs8 code> i Afficher ci-dessus, ajoutant l'option -Inform der code>; Cela vous incitera au mot de passe. Si vous souhaitez garder votre clé privée cryptée ( que je recommande vivement b>), vous devez l'ajouter à un magasin de clé (comme un fichier PKCS # 12) et l'accéder via le KeyStore Code> API en Java.
@erickson J'ai essayé la commande mais cela montre une erreur (j'utilise WinOnSensSL) Clé de déchiffrement d'erreur B>. La commande que j'ai utilisée était openssl pkcs8 -topk8 -nocrypt -in -in mykey.key -inform der -outformkey.key code>
Mise à jour B> Qu'est-ce qui est censé faire l'option -Nocrypt? Je pense que j'ai fait une solution de contournement comme celui-ci openssl pkcs8 -inform der -in mykey.key -outform pem -out mykeyinpem.key code> Il m'a demandé mon mot de passe, puis openssl pkcs8 -topk8 -nocrypt -in mykeyinpem -outform der -out mykeyindernocrypted.key code> Il n'a pas demandé mon mot de passe, mais le fichier de résultats semble égal à mykey.key
@ Brabbit27 L'option -Nocrypt signifie que le fichier de sortie ne sera pas crypté par mot de passe. Le fichier "semble" égal ou le fichier est i> égal? Vous pouvez calculer le hachage des deux fichiers à l'aide d'OpenSSL, non?
@erickson semble égal. En fait, j'ai calculé le hachage et c'est différent. Enfin, je pourrais le charger de Java. Les seules questions restantes sont, pourquoi je dois passer de Der-crypté à PEM à Der-Nocrypt? Pour toutes les clés, je dois les convertir en der-nocrypt pour pouvoir les charger de Java? Merci beaucoup!
Je ne sais pas pourquoi vous deviez utiliser le fichier PEM intermédiaire. Je ne serais probablement pas capable de vous dire sans l'essayer moi-même avec une de vos clés. Lorsque j'ai essayé le processus en utilisant mes clés, je n'avais pas à passer à travers cette étape.
Vous ne pouvez pas chiffrer avec une clé privée. Si JCE vous permet de faire cela, c'est juste par accident.
Vous devez utiliser la signature. Voici l'extrait de code pour le faire, P>
signer = Signature.getInstance("SHA1withRSA");
signer.initSign(privateKey); // PKCS#8 is preferred
signer.update(dataToSign);
byte[] signature = signer.sign();
s / public / privé / code> dans votre première ligne.
Ce n'est pas un accident que le cryptage avec une clé privée est autorisé. Si vous souhaitez casser une signature en hachage et cryptage individuels, le cryptage avec une clé privée est essentiel. Disons que j'ai un document que j'ai besoin de signer et ma clé réside sur un réseau HSM. Maintenant, je diffuse le document entier sur le HSM pour signer ou je peux créer un hachage local et le diffuser au HSM pour le cryptage seul. Mon choix dépendra de la question de savoir si le calcul de hachage local me donne de meilleures performances VIZ un calcul de hachage délégué à VIZ avec la latence de réseau. P>
Cette question est assez ancienne, mais je suis récemment trébuché sur le problème (je suis en train de mettre en œuvre des exigences de certains protocoles nécessitant un cryptage avec une clé privée). Je vais simplement citer le message de Forum :
Je suis récemment tombé sur le même problème, soumis le PMR 22265,49R et le support IBM après consultation de "Développement" (quiconque celles-ci) ont statué que les clés privées ne peuvent pas être utilisées pour cryptage. Peu importe combien j'ai essayé de discuter avec eux que des clés privées ne doivent pas être utilisées pour la protection des données, ce qui n'est qu'un seul but derrière le cryptage, et qu'il convient parfaitement à utiliser des clés privées pour le cryptage pour réaliser une non-répudiation, ils étaient inébranlables. dans leur croyance. Vous devez aimer les gens, qui insistent pour que 2x2 = 5. P>
Voici comment j'ai travaillé autour de ce problème: essentiellement, j'ai créé un objet clé de clé avec le matériau crypto de la clé privée. Vous devrez faire l'inverse, créer un objet de clé privé avec le matériel Crypto de la clé publique, pour déchiffrer avec la clé publique si vous souhaitez éviter que la "clé publique ne peut pas être utilisée pour déchiffrer" Exception. P> blockQuote>
xxx pré> p>
C'est très risqué si vous traitez l'exposant clé privé comme l'exposant public et le distribuez, car étant donné la clé privée (que vous appelez la "clé publique"), il est facile de dériver la clé publique (que vous appelez maintenant la "clé privée"). Ne laissez pas accidentellement cette "clé publique" en public ou votre système sera compromis. Il peut être aussi simple que deviner que l'exposant de la "clé privée" est 65537.
Je cherchais ça si longtemps. Je suis tellement reconnaissant pour cette réponse. Le nom "Touche privée et publique" est totalement erroné dans ce cas d'utilisation, mais il existe des situations où cela est pertinent.
@JIMFLOOD Si je comprends bien, et ma situation est similaire, Dmitry a créé un rsublickeyspec code> pour contenir les données de clé privées. Évidemment, il ne va pas distribuer la clé privée, juste la clé publique d'origine qui peut désormais être utilisée pour prouver (déchiffrer) que la clé privée était pour le cryptage - c'est-à-dire non-répudiation.
Essayez ceci:
java.security.Security.addProvider(
new org.bouncycastle.jce.provider.BouncyCastleProvider()
);
J'ai traversé celui-ci et j'ai généré avec Java: Stackoverflow.com/Questtions/19640735/...