0
votes

Générer des chaînes aléatoires de caractères, y compris des caractères spéciaux

J'ai un code qui génère des chaînes aléatoires de caractères (mots de passe) contenant exactement 8 caractères. Mon problème est qu'il ne remplit que des chiffres et des caractères.

1) J'aimerais inclure des caractères spéciaux au mélange et assurez-vous que au moins un caractère spécial est toujours inclus dans chaque chaîne. P>

2 ) Je dois ajouter une condition que chaque chaîne contient toujours au moins un caractère majuscule, au moins un minuscule, au moins un nombre. P>

C'est le code que j'ai mais je ne peux pas comprendre Comment inclure ces conditions pour le faire fonctionner comme dont j'ai besoin. J'ai essayé beaucoup de googling pour le faire fonctionner spécifiquement pour ce code mais ne peut pas le comprendre. Pouvez-vous s'il vous plaît conseiller? P>

Sub MakeRandom()
    Dim J As Integer
    Dim K As Integer
    Dim L As Double
    Dim iTemp As Integer
    Dim sNumber As String
    Dim bOK As Boolean

    Range("G5:G148").Activate
    Randomize
    L = InputBox("Amount of Passwords:")
      For J = 1 To L
        sNumber = ""
        For K = 1 To 8
            Do
                iTemp = Int((122 - 48 + 1) * Rnd + 48)
                Select Case iTemp
                    Case 48 To 57, 97 To 122
                        bOK = True
                    Case Else
                        bOK = False
                End Select
            Loop Until bOK
            bOK = False
            sNumber = sNumber & Chr(iTemp)
        Next K
        ActiveCell.Value = sNumber
        ActiveCell.Offset(1, 0).Select
    Next J
End Sub


0 commentaires

3 Réponses :


0
votes

Pourquoi ne pas introduire de longues chaînes, contenant tous les caractères légaux, puis avoir les caractères de votre algue de positions aléatoires de cette chaîne? De cette façon, vous avez un contrôle facile de ce qui peut être dans vos mots de passe.

Pour que les conditions soient vraies, je placerais la génération de mot de passe dans une boucle infinie, qui ne finit que lorsque toutes les conditions sont satisfaites. Tant que cela est réellement possible (c'est-à-dire que vos conditions peuvent toutes être vraies en même temps), cette boucle finira par finir (en raison de la loi des grands nombres).


0 commentaires

0
votes

J'ai quelque chose qui pourrait vous aider. J'utilise une méthode différente, mais le résultat devrait être similaire. Je l'ai adapté à vos contraintes, mais j'ai peut-être manqué quelque chose.

Mine fonctionne comme ceci: j'ai une feuille appelée chrrsrc avec tous les caractères que je veux pouvoir inclure dans la chaîne . Les caractères ont été divisés en quatre colonnes. De la colonne A à D Il est des lettres minuscules, des lettres majuscules, des chiffres, des caractères spéciaux.

Un tableau est conçu pour stocker les caractères et créer la chaîne aléatoire. Le tableau contient 3 'colonnes'. Le premier donne un nombre compris entre 1 et 4 pour déterminer à partir de quelle colonne il devrait obtenir son caractère. Les quatre premiers sont toujours 1,2,3,4 pour veiller à ce que chaque type de caractère soit utilisé au moins une fois. Les 4 autres (ou plus si la chaîne aléatoire est plus longue) sont remplies au hasard.

La deuxième "colonne" est ensuite remplie avec le caractère réel à ajouter à la chaîne aléatoire. Et enfin la troisième "colonne" est remplie de zéros. Celles-ci seront utilisées pour suivre quels caractères ont été utilisés dans la chaîne aléatoire.

une fois que la matrice a été remplie, le DOLE TOUT tandis que la boucle est utilisée pour sélectionner l'ordre des caractères. au hasard. Une fois qu'un caractère a été ajouté, le zéro de la matrice est changé en un, pour vous assurer que chaque caractère est utilisé une fois.

à la fin de votre chaîne aléatoire est dans la variable aléatoire et vous pouvez l'écrire à une cellule ou faire quoi que ce soit avec elle.

Si vous souhaitez créer plusieurs chaînes en une fois, je suggérerais d'écrire un petit utilisateur de l'appelant, qui appelle celui-ci x quantité de fois. Ou ajoutez une boucle et une boîte à entrée dans celui-ci.

espère que cela aide. xxx


0 commentaires

0
votes
  • Si possible, il est conseillé d'éviter d'utiliser activate et sélectionner . Dans votre cas, vous pouvez créer un tableau de chaînes aléatoires, puis écrivez la matrice sur la feuille. La longueur de la matrice pourrait être contrôlée par la valeur renvoyée par entréebox .
  • Votre code peut bénéficier de: l = entréebox ("quantité de mots de passe:", type: = 1) qui, si je lis la documentation correctement, valide que l'entrée est numérique.
  • Ma compréhension est que vous devez utiliser le type long au lieu de entier dans des circonstances normales (comme integer s est désormais converti en Long s sous la hotte). De plus, dans ce contexte où vous recevez une entrée de l'utilisateur arbitraire, INTEGER Type Overflows à 32768. Si vous entrez 32768 (par exemple) ou tout numéro plus grand dans la section INPUTBOX devrait voir une erreur de débordement non gérée.

    En référence à l'approche décrite dans cette réponse ( https://stackoverflow.com/a/57903244/8811778 ): xxx

    • Ce n'est que mon interprétation de l'approche postée par l'utilisateur. Cet utilisateur a peut-être mis en œuvre leur approche différemment.
    • la majorité du travail est effectué par le GetRandomcharActersfromText .
    • Vous pouvez probablement vous débarrasser du pour K = 1 à 8 BOOP et remplacer par quelque chose comme ActiveCell.value = Createrecell.Value = CreaterAndomstring (longueur de l'encombrement: = 1, minimumcountofsymbols : = 1) (bien que vous devriez éviter d'utiliser ActiveCell et, en général, s'appuyer sur des objets à être actifs).
    • Enfin, sur la base de certaines parties de votre code, il semble que ce code est destiné à générer des mots de passe. Je ne suis pas expert en matière de sécurité, je m'abstiendrai de fournir des suggestions / conseils liés à la sécurité. Vous pouvez ou non profiter de la lecture https://xkcd.com/936/ et la discussion associée < Un href = "https://security.stackexchange.com/a/6096/71460"> https://security.stackexchange.com/a/6096/71460 .

0 commentaires