OVH Cloud OVH Cloud

Problème C++

106 réponses
Avatar
Steph
boujour

J'ai créé un programme dont voici une partie :


#include <iostream>
using namespace std;

int main (void)

{
char pw[20];
const char valide[20]="12H12";

cout << " Password :";
cin >> pw;

while (strcmp(pw,valide) = =1)

{

cout << " ACCESS REFUSED\n ";
cout << " Password :";
cin >> pw;

}


cout << "\n ACCESS GARANTED ";
}

Le problème est que si j'entre seulement le premiere lettre ou chiffre il
accepte alors que celles qui suivent sont fausses. Comment je peux faire
pour que le programme teste un à un les caratères?

merci

10 réponses

1 2 3 4 5
Avatar
TERENCE
"Steph" a écrit dans le message de news:
boujour

J'ai créé un programme dont voici une partie :


#include <iostream>
using namespace std;

int main (void)

{
char pw[20];
const char valide[20]="12H12";

cout << " Password :";
cin >> pw;

while (strcmp(pw,valide) = =1)


while ( 0 != strcmp(pw,valide) )


{

cout << " ACCESS REFUSEDn ";
cout << " Password :";
cin >> pw;

}


cout << "n ACCESS GARANTED ";
}

Le problème est que si j'entre seulement le premiere lettre ou chiffre il
accepte alors que celles qui suivent sont fausses. Comment je peux faire
pour que le programme teste un à un les caratères?

merci




Avatar
Etienne Rousee
"Steph" a écrit ...
while (strcmp(pw,valide) = =1)

{

cout << " ACCESS REFUSEDn ";
cout << " Password :";
cin >> pw;

}


strcmp renvoie 0 si les chaînes sont égales,
- 1 ou +1 suivant que pw est avant valide dans l'ordre
alphabétique ou après. Et tu ne testes que le +1.
D'autre part, pour strcmp, j'incluerais <string.h>,
mais c'est plutôt du C, alors va voir du côté du type
string et inclues <string>.

Etienne

Avatar
Cyrille
boujour

J'ai créé un programme dont voici une partie :


#include <iostream>


ajouter:
#include <string>

using namespace std;

int main (void)

{
char pw[20];
const char valide[20]="12H12";


remplacer ces deux lignes par:
string pw;
const string valide = "12H12";


cout << " Password :";
cin >> pw;

while (strcmp(pw,valide) = =1)


remplacer cette ligne par:
while(valide != pw)


{

cout << " ACCESS REFUSEDn ";
cout << " Password :";
cin >> pw;

}


cout << "n ACCESS GARANTED ";
}

Le problème est que si j'entre seulement le premiere lettre ou chiffre il
accepte alors que celles qui suivent sont fausses. Comment je peux faire
pour que le programme teste un à un les caratères?


Voir la réponse d'Etienne Rousee. Mais j'insiste vraiment sur
l'utilisation de std::string. Les tableaux de char à taille fixe,
surtout dans un contexte de sécurité, comme ici, sont à proscrire.

--
C'est ma signature qu'elle est la mieux. Pas la vôtre.

Avatar
Sylvain
Cyrille wrote on 21/06/2006 22:15:

Voir la réponse d'Etienne Rousee. Mais j'insiste vraiment sur
l'utilisation de std::string. Les tableaux de char à taille fixe,
surtout dans un contexte de sécurité, comme ici, sont à proscrire.


peux-tu détailler ce qui a avantage à ne pas avoir une taille fixe ?

pense-tu qu'une implémentation non balancée, à temps variable et
proportionnel à la longueur de la phrase de passe candidate, soit plus
pertinente ?

Sylvain.

Avatar
Fabien LE LEZ
On Wed, 21 Jun 2006 13:53:12 +0100, "Steph"
:

char pw[20];
const char valide[20]="12H12";

cout << " Password :";
cin >> pw;


Horriblement casse-gueule, tout ça.
Je ne saurais trop te conseiller d'utiliser std::string à la place des
tableaux de char du C.

Accessoirement, demande-toi ce qui se passerait si je tapais le mot de
passe suivant :

abcdefghijklmnopqrstabcdefghijklmnopqrst

Avatar
Cyrille
Cyrille wrote on 21/06/2006 22:15:

Voir la réponse d'Etienne Rousee. Mais j'insiste vraiment sur
l'utilisation de std::string. Les tableaux de char à taille fixe,
surtout dans un contexte de sécurité, comme ici, sont à proscrire.


peux-tu détailler ce qui a avantage à ne pas avoir une taille fixe ?


Ben utilisés comme ça, il suffit que l'utilisateur balance plus de 20
caractères pour écrire dans de la mémoire dans laquelle il ne devrait
pas écrire. Je suppose que tu ne l'ignores pas.

Bon, c'est vrai on peut aussi utiliser des versions sécurisées des
fonctions de string C pour éviter les problèmes les plus évidents.

pense-tu qu'une implémentation non balancée, à temps variable et
proportionnel à la longueur de la phrase de passe candidate, soit plus
pertinente ?


Généralement oui.

--
C'est ma signature qu'elle est la mieux. Pas la vôtre.


Avatar
Sylvain
Cyrille wrote on 21/06/2006 22:43:
Cyrille wrote on 21/06/2006 22:15:

Voir la réponse d'Etienne Rousee. Mais j'insiste vraiment sur
l'utilisation de std::string. Les tableaux de char à taille fixe,
surtout dans un contexte de sécurité, comme ici, sont à proscrire.


peux-tu détailler ce qui a avantage à ne pas avoir une taille fixe ?


Ben utilisés comme ça, il suffit que l'utilisateur balance plus de 20
caractères pour écrire dans de la mémoire dans laquelle il ne devrait
pas écrire. Je suppose que tu ne l'ignores pas.


je l'ignore pas, et c'est pour cela que je n'utilise jamais gets() ni ce
pale wrapper de "cin".

la question des buffer overflow n'est toutefois pas liée au "contexte de
sécurité", donc je repose ma question: en quoi une taille variable
serait un plus ici?

Bon, c'est vrai on peut aussi utiliser des versions sécurisées des
fonctions de string C pour éviter les problèmes les plus évidents.


on aimerait aussi/surtout définir dynamiquement des opérateurs pour des
types inconnus de la std; difficile pour une classe fournie par le runtime.

pense-tu qu'une implémentation non balancée, à temps variable et
proportionnel à la longueur de la phrase de passe candidate, soit plus
pertinente ?


Généralement oui.


hmmm, 100% des cryptologes sont dans l'erreur alors, j'aimerais en lire
plus ici aussi.

Sylvain.



Avatar
Sylvain
Gabriel Dos Reis wrote on 22/06/2006 01:44:
Sylvain writes:

| pense-tu qu'une implémentation non balancée, à temps variable et
| proportionnel à la longueur de la phrase de passe candidate, soit plus
| pertinente ?

Pardon ?



une "implémentation balancée" garantirait que chaque cycle d'instruction
omis (du fait de la taille des registres, du nombre d'opérations
scalairisées (faite en simultanée)) serait balancé par un NOP
fournissant un temps constant pour une opération donnée.

la proposition de Cyrille - utiliser std::string operator==(const
std::string& - n'est pas "moins balancée" que la fonction strcmp, mais
elle est aussi mauvaise.


une implémentation à temps constant non proportionelle au passphrase
candidat garantirait qu'aucune attaque basée sur le temps (les plus
faciles) ne peut être utilisée.

un passphrase de n caractères d'entropie p (eg 56 pour de l'alpha maj &
min) est censé fournir une entropie totale p^n, ici (strcmp comme
string==) s'arrète dès le premier caractère différent, l'entropie
effective n'est donc que de p * n.


une telle implémentation de vérification de phrase de passe se
révèlerait donc un système très facile à casser.

Sylvain.

Avatar
Sylvain
Gabriel Dos Reis wrote on 22/06/2006 01:44:
Sylvain writes:

| pense-tu qu'une implémentation non balancée, à temps variable et
| proportionnel à la longueur de la phrase de passe candidate, soit plus
| pertinente ?

Pardon ?

[reposté après correction des coquilles]


une "implémentation balancée" garantirait que chaque cycle d'instruction
omis (du fait de la taille des registres, du nombre d'opérations
scalairisées (faite en simultanée) serait balancé par un NOP fournissant
un temps constant pour une opération donnée.

la proposition de Cyrille - utiliser std::string operator==(const
std::string&) - n'est pas "moins balancée" que la fonction strcmp, mais
elle est aussi mauvaise (sur ce point; elle corrige bien sur l'erreur
faite sur la gestion de la taille des phrases).


une implémentation à temps constant non proportionelle à la longueur du
passphrase candidat garantirait qu'aucune attaque basée sur le temps
(les plus faciles) ne peut être utilisée.

un passphrase de n caractères d'entropie p (eg 52 pour de l'alpha maj &
min) est censé fournir une entropie totale p^n, ici strcmp() comme
string==() s'arrète dès le premier caractère différent, l'entropie
effective n'est donc que de p * n.


une telle implémentation de vérification de phrase de passe se
révèlerait donc un système très facile à casser.

Sylvain.

Avatar
Gabriel Dos Reis
Cyrille writes:

| Bon, c'est vrai on peut aussi utiliser des versions sécurisées des
| fonctions de string C pour éviter les problèmes les plus évidents.

pourquoi faire compliquer (C string) lorsqu'on peut faire simple
(std::string) ?

-- Gaby
1 2 3 4 5