IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Sécurité Java Discussion :

BouncyCastle CMS et S/MIME


Sujet :

Sécurité Java

  1. #41
    Membre éclairé Avatar de Piolet
    Inscrit en
    Février 2004
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 469
    Par défaut
    jusqu'a la mort
    bon voila le code que je viens de faire tiré du PDF cité ci-dessus et remis a ma sauce, pour mon cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    String b2File = ""; // string de taille % 8
    DirContext ctx = this.getContext();
    //récupère le certificat dont j'ai besoin
    X509Certificate certificate = this.getCertificate(ctx);
    this.closeContext(ctx);
     
     
    try {
    	KeyStore ks = Utils.createCredentials(certificate);
    	byte[] plain_byte = b2File.getResult().getBytes();
    	PrivateKey privateKey = (PrivateKey)  ks.getKey(Utils.ROOT_ALIAS, Utils.KEY_PASSWD);
    	Signature sign = Signature.getInstance("SHA1withRSA");
    	sign.initSign(privateKey);
    	sign.update(plain_byte);
    	byte[] plainSign = sign.sign();
     
    	KeyGenerator kg = KeyGenerator.getInstance("DESede");
    	kg.init(new SecureRandom());
    	Key sessionKey = kg.generateKey();
    	Cipher cph = Cipher.getInstance("DESede/CBC/NoPadding");
    	cph.init(Cipher.ENCRYPT_MODE,sessionKey);
    	byte[] cipher_byte = cph.doFinal(plain_byte);
    	byte[] iv = cph.getIV();
     
    //			cph = Cipher.getInstance("RSA/ECB/PKCS#1");
    	cph = Cipher.getInstance("RSA/ECB/NoPadding");
    	System.out.println(certificate);
    	cph.init(Cipher.ENCRYPT_MODE, certificate.getPublicKey());
    	byte[] cipherKey = cph.doFinal(sessionKey.getEncoded());
     
    	String ourDistName = certificate.getSubjectDN().toString();
     
    	ByteArrayOutputStream byteOutput = new ByteArrayOutputStream();
    	DataOutputStream dataOutput = new DataOutputStream(byteOutput);
    	dataOutput.writeUTF(ourDistName);
    	dataOutput.writeInt(iv.length);
    	dataOutput.write(iv);
    	dataOutput.writeInt(cipherKey.length);
    	dataOutput.write(cipherKey);
    	dataOutput.writeInt(plainSign.length);
    	dataOutput.write(plainSign);
     
    	dataOutput.writeInt(cipher_byte.length);
    	dataOutput.write(cipher_byte);
    	byte[] cipher_bytes = byteOutput.toByteArray();
     
    	Properties props = System.getProperties();
    	props.put("mail.smtp.host", "smtp.free.fr");
    	Session session = Session.getDefaultInstance(props, null);
     
    	Address fromUser = new InternetAddress("mon_adresse1@free.fr");
    	Address toUser = new InternetAddress("mon_adresse2@gmail.com");
     
    	MimeMessage message = new MimeMessage(session);
    	message.setFrom(fromUser);
    	message.setRecipient(Message.RecipientType.TO, toUser);
    	message.setSubject("Cipher Mail");
    	message.setText(new String(cipher_bytes));
    	Transport.send(message);
    } catch (Exception e) {
    	// TODO Auto-generated catch block
    	e.printStackTrace();
    }
    bon bah croyé ou pas...mais la...je recois un mail...attention...il est juste illisible
    je sais pas non plus si c'est bon du coup

    ah oui...pis aussi ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //cph = Cipher.getInstance("RSA/ECB/PKCS#1");
    cph = Cipher.getInstance("RSA/ECB/NoPadding");
    la ligne commentée plante, visible le padding indiqué n'existe pas...c'est currieux, j'en ai mis un par défaut...

    enfin...je pense pas que le mail recu corresponde vraiment a un mail comme celui attendu MIME dans CMS puis dans SMIME etc...(comme présenté au depart de ce topic)

    bref...un peu galère

  2. #42
    Membre éclairé Avatar de Piolet
    Inscrit en
    Février 2004
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 469
    Par défaut
    Finalement j'ai trouvé un truc pas mal...sous mes yeux depuis le début
    dans les sources BouncyCastle, y a des exemples, dont un CreateSignedAndCryptedMail (je crois de mémoire) et ca...ca a l'air de correspondre a ce que je veux faire...reste à bien l'utiliser, mais visiblement c'est compréhensible et réponds à mes attentes, si jamais ca marche, j'essaierais de penser à mettre la finalité du code

  3. #43
    Invité de passage
    Profil pro
    Inscrit en
    Août 2008
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1
    Par défaut
    Salut, je travail sur le meme projet que toi en utilisant bouncy castel mais via le C#.
    Petites questions comptes tu envoyer tes messages en multi-part ou single part. Travailles tu sur le CDC V1.40? Moi de mon coté j'essaie de terminer le module d'envoi de télétransmission avant de le tester avec la sécu.

  4. #44
    Membre éclairé Avatar de Piolet
    Inscrit en
    Février 2004
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 469
    Par défaut
    Citation Envoyé par LowerOnTheWall Voir le message
    Salut, je travail sur le meme projet que toi en utilisant bouncy castel mais via le C#.
    Petites questions comptes tu envoyer tes messages en multi-part ou single part. Travailles tu sur le CDC V1.40? Moi de mon coté j'essaie de terminer le module d'envoi de télétransmission avant de le tester avec la sécu.
    a priori je suis sur les dernières normes...mais je n'ai pas le numéro exact, pour l'instant j'essai de comprendre.

  5. #45
    Membre éclairé Avatar de Piolet
    Inscrit en
    Février 2004
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 469
    Par défaut
    Je reviens à la charge avec mon problème
    et je vais mettre ce dont j'ai réellement besoin, tel que c'est décrit dans le document officiel :

    1. Le fichier est encapsulé dans une entité MIME; L’entité MIME ne doit contenir qu’un et un seul fichier.
    2. L’entité MIME est chiffrée conformément à la RFC 2630; elle doit être chiffrée une seule fois et ne doit pas être signée. L’entité MIME chiffrée ainsi que la clé de chiffrement chiffrée sont regroupées dans un objet CMS.

    3. L’objet CMS est encapsulé dans une entité S/MIME; cette entité S/MIME peut avoir une structure « multipart » ou « single part ».
    4. L’entité S/MIME est attachée à un message SMTP. Le message SMTP ne doit contenir qu’une et une seule entité S/MIME.

    voila...alors je me dis, présenté comme ca, c'est plus clair
    je dispose de l'entité MIMEMessage (object javamail) ca pas de soucis, et d'un certificat (Object X509Certificat de java, pas un fichier, ptet qu'a terme il faudra que je le stock dans un fichier pour éviter de le télécharger à chaque envoie, mais pour l'instant, un objet)

    Comment puis-je faire pour réaliser l'étape numéro 2 ?
    BouncyCastle a l'air de proposer les bonnes classes, mais...j'ai pas l'air de comprendre le mécanisme

    autre précision importante qui peut aider :

    Le chiffrement de transport devant être utilisé possède les caractéristiques suivantes:
    - le chiffrement des messages s’effectue en utilisant l’algorithme 3-DES en mode CBC (clé de session de 128 bits);
    - la clé de session est chiffrée avec la clé publique RSA du destinataire du message (clé publique de 1024 bits);
    - les clés publiques sont certifiées, les certificats sont au format X509 V3.
    a vot' bon coeur m'sieur dame

  6. #46
    Membre éclairé Avatar de Piolet
    Inscrit en
    Février 2004
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 469
    Par défaut
    Alors je reviens a la charge avec mon problème
    il semblerait que j'ai trouvé le code nécessaire à ce dont j'ai besoin, le code serait, hypothétiquement, le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public MimeBodyPart getEncrypt(MimeMessage content, X509Certificate cert) {
       SMIMEEnvelopedGenerator  fact = new SMIMEEnvelopedGenerator();
       fact.addKeyTransRecipient(cert);
       MimeBodyPart smime = fact.generate(content, SMIMEEnvelopedGenerator.DES_EDE3_CBC , "BC");
       return smime;
    }
    la dessus aucun soucis visiblement.
    le hic c'est qu'en suite j'ajoute ce BodyPart dans un multipart que je joint a un MimeMessage que j'envoie.
    Et lors de cet envoi, je me retrouver avec des exceptions de levées qui me disent que la "key size is inappropriate for this algorithm"

    alors j'explique un peu plus. Dans mon certificate, il y a une clé publique RSA de 1024 bits, et celle de DES_EDE3_CBC devrait être logiquement de 128, d'après les specs que j'ai.

    mais visiblement, en laissant la taille par défaut, au niveau du generator, j'ai cette exception...

    quelqu'un voit-il une solution ?
    pour info, c'est java 1.5 (sous mac), mais l'appli finale doit tourner sur n'importe quelle plateforme (avec java 1.5)

  7. #47
    Membre éclairé Avatar de Piolet
    Inscrit en
    Février 2004
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 469
    Par défaut
    l'erreur exact est celle-ci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    javax.mail.MessagingException: IOException while sending message;
      nested exception is:
    	org.bouncycastle.mail.smime.SMIMEEnvelopedGenerator$WrappingIOException: org.bouncycastle.cms.CMSException: key inappropriate for algorithm.
    	at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:676)
    	at javax.mail.Transport.send0(Transport.java:189)
    	at javax.mail.Transport.send(Transport.java:118)
    	at MyClass.send(IrisStream.java:143)
    	at MyMain.main(Main.java:46)
    Caused by: org.bouncycastle.mail.smime.SMIMEEnvelopedGenerator$WrappingIOException: org.bouncycastle.cms.CMSException: key inappropriate for algorithm.
    	at org.bouncycastle.mail.smime.SMIMEEnvelopedGenerator$ContentEncryptor.write(Unknown Source)
    	at org.bouncycastle.mail.smime.handlers.PKCS7ContentHandler.writeTo(Unknown Source)
    	at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:839)
    	at javax.activation.DataHandler.writeTo(DataHandler.java:295)
    	at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1403)
    	at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:874)
    	at javax.mail.internet.MimeMultipart.writeTo(MimeMultipart.java:444)
    	at com.sun.mail.handlers.multipart_mixed.writeTo(multipart_mixed.java:102)
    	at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:839)
    	at javax.activation.DataHandler.writeTo(DataHandler.java:295)
    	at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1403)
    	at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1745)
    	at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:636)
    	... 4 more
    Caused by: org.bouncycastle.cms.CMSException: key inappropriate for algorithm.
    	at org.bouncycastle.cms.CMSEnvelopedDataStreamGenerator.open(Unknown Source)
    	at org.bouncycastle.cms.CMSEnvelopedDataStreamGenerator.open(Unknown Source)
    	... 17 more
    Caused by: java.security.InvalidKeyException: Illegal key size or default parameters
    	at javax.crypto.Cipher.a(DashoA12275)
    	at javax.crypto.Cipher.init(DashoA12275)
    	at org.bouncycastle.cms.CMSEnvelopedGenerator$RecipientInf.toRecipientInfo(Unknown Source)
    	... 19 more

Discussions similaires

  1. Cryptographie avec BouncyCastle (CMS)
    Par layloun dans le forum Général Java
    Réponses: 0
    Dernier message: 15/04/2015, 11h36
  2. Quel est le meilleur script PHP de portail (CMS) ?
    Par Lana.Bauer dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 187
    Dernier message: 18/10/2012, 08h45
  3. [BouncyCastle] PrivateKey pour déchiffrer un CMS
    Par Piolet dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 01/08/2009, 01h44
  4. [struts] déterminer le type Mime d'un fichier
    Par k4eve dans le forum Struts 1
    Réponses: 4
    Dernier message: 14/06/2004, 11h28
  5. utilisation d'objets ADO pour CMS sur POSTGRESQL7.3.2
    Par turbok dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 10/10/2003, 10h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo