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

Langage Java Discussion :

[Regex] Encryptage chaine de caractères


Sujet :

Langage Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 109
    Par défaut [Regex] Encryptage chaine de caractères
    Bonjour,

    J'aimerai utiliser une expression régulière pour encrypter une chaine de caractère c-a-d remplacer des caractères par d'autre.

    exple : les 'o' deviennent des 'i' et les 'u' deviennent 'e'.
    "Bonjour" devient "Binjier"

    un simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String text='Bonjour ';
    text=text.replaceAll("o","i");
    text=text.replaceAll("u","e");
    suffirait mais j'aimerais le faire avec une regex pour n'avoir qu'une ligne ...

    et avoir quelque chose comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    text=text.replaceAll("[ou]","[ie]");
    Existe-t-il un moyen en java de faire cela ?

    Merci pour vos pistes.

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 5
    Par défaut
    Bonjour,
    Ton objectif est-il d'optimiser les performances ou la lisibilité du code ?

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Juste pour information, cela n'est pas du cryptage. Ou disons que c'est du cryptage antique, le genre qu'on met dans les cahiers de jeux pour enfants.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 766
    Par défaut
    Bonjour,

    Ce que tu veux faire, s'appel un chiffrement mono alphabétique.
    Tu remplaces un alphabet par un autre.

    En connaissant la langue employée il faut quelques minutes pour déchiffrer le système. Et effectivement cela date du temps des romains.

    Ensuite on a fait des substitutions par dictionnaire, puis des substitutions poly-alphabétiques avec des machines mécaniques.
    Mais tout ça c'est complètement obsolète et enseigné au titre de l'histoire.

    La cryptologie est une matière très avancée et très spécialisée de nos jours.
    Que veux tu protéger en fait et pour quel usage ?

  5. #5
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par Jimmy_ Voir le message
    Et effectivement cela date du temps des romains.
    Rendons à César ce qui est à César, c'est le code de César justement.

    Un peu de lecture ? Introduction à la Cryptographie
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  6. #6
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 766
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Rendons à César ce qui est à César, c'est le code de César justement.

    Un peu de lecture ? Introduction à la Cryptographie

    Merci oui je connais bien le sujet.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 109
    Par défaut
    Bah non, c'est pour être conforme à la cnil et avoir des données anonymisées conforme à la cnil pour mettre en ligne une BD de formation issue d'une BD de prod.

    Monsieur "Bernardini" devient "Burnirdana" voir "Vurnirdana"

    Ok le terme de cryptage est mal choisi .....

    mais cela ne me fait pas avancé mon chmilblick

  8. #8
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 766
    Par défaut
    Citation Envoyé par ouioui2000 Voir le message
    Bah non, c'est pour être conforme à la cnil et avoir des données anonymisées pour une BD de formation issue d'une BD de prod.

    Monsieur "Bernardini" devient "Burnirdana" voir "Vurnirdana"

    Ok le terme de cryptage est mal choisi .....

    mais cela ne me fait pas avancé mon chmilblick

    Bon ok tu veux donc anonymiser des noms ... il fallait le dire.
    Donc de la substitution mono-alphabétique est un très mauvais choix. Il est très simple de reconstitué le nom.

    Je m'explique ... si tu gères des français, tu auras très probablement des 'Dupont' dans ta base. Donc pour un attaquant il lui suffit de tester toutes les substitutions alphabétique jusqu’à trouver le nom Dupont ... avec nos machines actuelle ça doit prendre pas plus de quelques millisecondes.


    Il te faut donc chiffrer tes noms avec un algorithme robuste (AES par exemple) et réencoder le résultat sur une plage de caractère lisible par un être humain.

    Tu as le choix des armes, les tutos ne manquent pas.

  9. #9
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    +1 pour le remplacement qui pourra être "casser" assez facilement.

    Par contre perso je pense que le chiffrement est inutile et lourd si tu veux juste anonymiser (sans pouvoir retrouver la valeur d'origine).
    Un simple remplacement "random" peut amplement faire l'affaire.

    Exemple :
    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
    	private static String LETTERS = "azertyuiopqsdfghjklmwxcvbn";
    	private static Random RANDOM = new Random();
     
    	public static String anonymize(String str) {
    		char[] chars = str.toCharArray();
    		for (int i=0; i<chars.length; i++) {
    			char c = chars[i];
    			if (Character.isLetter(c)) {
    				// On tire une lettre au hasard
    				c = LETTERS.charAt(RANDOM.nextInt(LETTERS.length()));
    				if (Character.isUpperCase(chars[i])) {
    					c = Character.toUpperCase(c);
    				}
    				chars[i] = c;
    			}
    		}
    		return new String(chars);
    	}



    Sinon pour répondre à ta question original : un tel remplacement est possible en recodant un peut le replaceAll().
    Ca peut faire un peu peur mais c'est assez facile : il suffit de faire un Patter/Matcher puis de boucler sur les résultats pour faire le remplacement que l'on souhaite.

    Ca donnerait ceci :
    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
    	public static String replaceLetters(String input, String searchList, String replaceList) {
    		if (searchList.length() != replaceList.length()) {
    			throw new IllegalArgumentException("searchList.length() != replaceList.length()");
    		}
    		// On crée un pattern qui recherche un des caractères à remplacer :
    		Pattern pattern = Pattern.compile("[" + Pattern.quote(searchList) + "]");
    		Matcher matcher = pattern.matcher(input);
    		if (matcher.find()) {
    			// Si on trouve au moins un caractère :
    			StringBuffer sb = new StringBuffer(input.length());
     
    			do {
    				// On récupère le caractère trouvé :
    				char c = matcher.group().charAt(0);
    				// On recherche son index dans la première liste :
    				int index = searchList.indexOf(c);
    				// On récupère le caractère de remplacement :
    				String replacement = replaceList.substring(index, index+1);
    				// Et on effectue le remplacement 
    				matcher.appendReplacement(sb, Matcher.quoteReplacement(replacement));
    			} while (matcher.find());
     
    			matcher.appendTail(sb);
    			return sb.toString();
    		}
    		// si on n'arrive là c'est qu'il n'y a rien à modifier
    		return input;
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String result = replaceLetters("Bonjour", "ou", "ie"); // => Binjier

    a++

  10. #10
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 766
    Par défaut
    Le masque aléatoire est une solution de chiffrement comme une autre, à condition d'initialiser de manière toujours différentes pour chaque nom ta fonction random et de ne jamais réutilisé la même séquence deux fois.

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Pourquoi ne pas faire un simple hash, si on a pas besoin de retrouver la valeur d'origine ?

  12. #12
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par fr1man Voir le message
    Pourquoi ne pas faire un simple hash, si on a pas besoin de retrouver la valeur d'origine ?
    C'est tout aussi moyen le hash dans ce cas là. Disons que ce soient des données bancaires, et je veux voir le compte de ma femme. J'ai "juste" à hasher son nom pour retrouver sa ligne....


    L'anonymisation d'une base de donnée, c'est un sacré boulot.

    Accessoirement, c'est en général plus facile de le faire directement en SQL

    J'avais fait ça à une époque. Les noms étaient devenus aléatoires, les dates subissaient une variance aléatoire dans la zone des 6 mois, les chiffres subissaient une variation aléatoire de 30%

    Et même comme ça, je suis sur qu'en analysant bien un dossier, on peut trouver qui est l'employé derrière. L'avantage, ce que comme tout le reste est plus ou moins faux.... C'est pas utile :p

  13. #13
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Pour moi, anonymiser ce n'est pas seulement "brouiller" les données, c'est aussi ne pas les laisser en clair, mais pouvoir les retrouver d'une manière ou d'une autre, selon les besoins.

  14. #14
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par fr1man Voir le message
    mais pouvoir les retrouver d'une manière ou d'une autre, selon les besoins.
    C'est un risque, car si on sait les retrouver, et que quelqu'un a la main sur les données anonymisée et montre qu'on peut les retrouver, tu va avoir de sacrés soucis sur le plan légal

Discussions similaires

  1. Regex : Recherche chaine de caractère dans une autre chaine de caractère (Unix)
    Par framus.class dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 18/01/2011, 22h05
  2. Regex chaine à n caractère
    Par saturn1 dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 16/07/2009, 15h44
  3. [RegEx] Regex simple: Verfier premier caractère d'une chaine.
    Par yann123456 dans le forum Langage
    Réponses: 2
    Dernier message: 07/04/2009, 15h50
  4. Récupération chaine de caractére (via regex)
    Par Micke7 dans le forum Général Java
    Réponses: 3
    Dernier message: 09/01/2009, 10h10
  5. [regex] chaines de caractères
    Par ghohm dans le forum Langage
    Réponses: 4
    Dernier message: 11/06/2007, 16h28

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