Re: Случайный пароль
От: Carc Россия http://www.amlpages.com/home.php
Дата: 19.05.23 06:08
Оценка: -1
Здравствуйте, TailWind, Вы писали:

TW>Как сделать случайный пароль на 24 символа?

TW>И потом ещё один такой же

TW>Нужно чтобы между символами и паролями не было математической зависимости


TW>То есть rand(), rand(), rand(), rand() не подходит


TW>Единственное, что мне пришло в голову rand(GetTickCount())

TW>Но этого мало. А дальше то как?
void gen_random(TCHAR *s
    , const int len
    , const TCHAR* pszSymbols
    ,  const UINT nSizeSymbols) 
{
    for (int i = 0; i < len; ++i) {
        //const TCHAR sz== alphanum[rand() % (nSizeSymbols - 1)]
        const TCHAR sz = *(pszSymbols+ (rand() % (nSizeSymbols - 1)));
        s[i] =sz;
    }

    s[len] = 0;
}

void gen_random(TCHAR *s, const int len, const bool bSpecialSymbols)
{
    const TCHAR alphanum[] =
        TEXT("0123456789")
        TEXT("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
        TEXT("abcdefghijklmnopqrstuvwxyz");

    const TCHAR szSpec[]=TEXT("!@#$%^&*()_-\\/|\"'~");

    typedef std::vector<TCHAR> V;
    V v;
    UINT nSize=ARRAYSIZE(alphanum);
    if (bSpecialSymbols)
        nSize += ARRAYSIZE(szSpec);

    nSize += 1;
    v.reserve(nSize);

    std::back_insert_iterator<V> bi(v);
    std::copy(alphanum,alphanum+ARRAYSIZE(alphanum),bi);
    const int nnnsdfs=v.size();
    if (bSpecialSymbols)
        std::copy(szSpec, szSpec+ARRAYSIZE(szSpec),bi);

    const int nsd=v.size();
    
    gen_random(s, len, &v[0],v.size());
}

CString Generate(const UINT nMaxLen,const bool bUseSpecSymbols)
{
    ASSERT(nMaxLen > 0);
    if (0 == nMaxLen)
        return TEXT("");

    enum {MAX_LEN=1000};
    if (nMaxLen > MAX_LEN) {
        ASSERT(FALSE);
        return TEXT("");
    };

    TCHAR sz[MAX_LEN+1];
    gen_random(sz,nMaxLen,bUseSpecSymbols);
    ASSERT(!IsBadStringPtr(&sz[0],INFINITE));

    CString s(sz);
    UINT nTryCount=0;
    enum {MAX_TRY_COUNT=10};
    while (nTryCount < MAX_TRY_COUNT) {
        if (s.GetLength() == nMaxLen)
            break;

        ++nTryCount;
        s=Generate(nMaxLen,bUseSpecSymbols);
    };

    return s;
}
Aml Pages Home
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.