10
votes

Cryptage avec la clé privée RSA en Java

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>

  • Lire dans une clé privée DER format li>
  • Générer un PCKS8EncodedKeySpec li>
  • appel generatePrivate () de KeyFactory pour obtenir un objet clé privée li>
  • Utilisez cet objet clé privée avec l'objet Cipher pour faire le cryptage li> Ul>

    Ainsi, les étapes: p>

    La clé a été générée à partir OpenSSL avec: p>

    OpenSSL genrsa -aes256 private.pem 2048 -out code > p>

    puis a été converti en format DER avec: p>

    openssl rsa -in private.pem -outform DER -out private.der code> p>

    Je générer le PKCS8EncodedKeySpec avec: 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)
    
    • Le droit d'approche générale? Li>
    • Le PCKS8EncodedKeySpec le droit KeySpec à utiliser? Li>
    • Toute réflexion sur l'erreur spec clé non valide? Li> ul> p>


1 commentaires

J'ai traversé celui-ci et j'ai généré avec Java: Stackoverflow.com/Questtions/19640735/...


5 Réponses :


7
votes

Tout d'abord, je suis confus pourquoi vous envisagez d'utiliser un chiffrer pour chiffrer avec une clé privée, plutôt que de vous connecter avec une signature . Je ne suis pas sûr que tous les fournisseurs Cipher utiliseront le type de blocage correct pour la configuration, mais cela vaut la peine d'essayer.

Réglage de côté, je pense que vous essayez de charger un Touche de format OpenSL non standard. La convertir en der avec RSA est essentiellement juste un décodeur de base-64; La structure de la clé n'est pas pkcs # 8.

à la place, après genrsa , utilisez la commande openssl pkcs8 pour convertir la touche générée en PKC non crypté. # 8, format der: xxx

Ceci produira une clé privée non cryptée pouvant être chargée avec un pkcs8encodedkeyspec .


8 commentaires

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


@ Brabbit27 Pour charger une clé privée directement, il doit être non crypté. Utilisez la commande openssl pkcs8 i Afficher ci-dessus, ajoutant l'option -Inform der ; Cela vous incitera au mot de passe. Si vous souhaitez garder votre clé privée cryptée ( que je recommande vivement ), vous devez l'ajouter à un magasin de clé (comme un fichier PKCS # 12) et l'accéder via le KeyStore API en Java.


@erickson J'ai essayé la commande mais cela montre une erreur (j'utilise WinOnSensSL) Clé de déchiffrement d'erreur . La commande que j'ai utilisée était openssl pkcs8 -topk8 -nocrypt -in -in mykey.key -inform der -outformkey.key


Mise à jour 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 Il m'a demandé mon mot de passe, puis openssl pkcs8 -topk8 -nocrypt -in mykeyinpem -outform der -out mykeyindernocrypted.key 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 é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.



10
votes

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();


1 commentaires

s / public / privé / dans votre première ligne.



4
votes

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.


0 commentaires

3
votes

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.

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. xxx


3 commentaires

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 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.



0
votes

Essayez ceci:

java.security.Security.addProvider(
                     new org.bouncycastle.jce.provider.BouncyCastleProvider()
            );


0 commentaires