Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Генерация пароля, проблема с русскими буквами / 23 сообщений из 23, страница 1 из 1
28.05.2020, 15:55
    #39963431
neteurt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация пароля, проблема с русскими буквами
Код для генерации пароля
Код: pascal
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.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
procedure cxButton1Click(Sender: TObject);
var
 pass : string;
 passl: string;
 passk: string;
 passt : string;
 passm: string;
 passo: string;
 L: Integer;
begin
  begin
    pass := '';
    repeat
    L := Random(256);
    if Chr(L) in ['0'..'9' ] then
    begin
    pass := pass+Chr(L);
    end;
    until Length(pass)=1;
    ePassword.Text := pass;
  end;

  begin
    repeat
    L := Random(256);
    if (Pos (Chr(L), '!@#$%^&*_+-') > 0) then
    begin
    passl := passl+Chr(L);
    end;
    until Length(passl)=1;
    ePassword.Text := pass + passl;
  end;

  begin
    repeat
    L := Random(256);
    if Chr(L) in ['a'..'z'] then
    begin
    passk := passk+Chr(L);
    end;
    until Length(passk)=2;
    ePassword.Text := pass + passl +  passk;
  end;

  begin
    repeat
    L := Random(256);
    if Chr(L) in ['A'..'Z'] then
    begin
    passt := passt+Chr(L);
    end;
    until Length(passt)=2;
    ePassword.Text := pass + passl + passk + passt;
  end;

  begin
    repeat
    L := Random(256);
  //  if (Pos (Chr(L), 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя') > 0) then
    if Chr(L) in ['А'..'Я'] then
    begin
    passm := passm+Chr(L);
    end;
    until Length(passm)=2;
    ePassword.Text := pass + passl + passk + passt + passm;
  end;

  begin
    repeat
    L := Random(256);
//    if (Pos (Chr(L), 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ') > 0) then
    if Chr(L) in ['а'..'я'] then
    begin
    passo := passo+Chr(L);
    end;
    until Length(passo)=2;
    ePassword.Text := pass + passl + passk + passt + passm + passo;
  end;
  DialogInfo('Пароль сгенерирован:' + ePassword.Text );

end;


собственно на скриншоте можете увидеть, что русские буквы поплыли, что с этим можно сделать?
...
Рейтинг: 0 / 0
28.05.2020, 15:59
    #39963436
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация пароля, проблема с русскими буквами
neteurt,

А версия Delphi какая?
...
Рейтинг: 0 / 0
28.05.2020, 16:01
    #39963440
neteurt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация пароля, проблема с русскими буквами
alekcvp, Delphi Berlin 10.1 XE. На delphi 7 таких проблем нету.
...
Рейтинг: 0 / 0
28.05.2020, 16:13
    #39963452
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация пароля, проблема с русскими буквами
neteurt
собственно на скриншоте можете увидеть, что русские буквы поплыли

Идеальный пароль.

neteurt
Код: pascal
1.
DialogInfo


Ансишная процедура?
...
Рейтинг: 0 / 0
28.05.2020, 16:16
    #39963454
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация пароля, проблема с русскими буквами
neteurt
alekcvp, Delphi Berlin 10.1 XE. На delphi 7 таких проблем нету.

Код: pascal
1.
2.
3.
  L := Random(256);
//    if (Pos (Chr(L), 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ') > 0) then
    if Chr(L) in ['а'..'я'] then


Ну тогда очевидно что это и не будет работать. in не работает с юникодом, у русских символов коды намного больше 256.

Надо делать как-то так:
Код: pascal
1.
2.
L := Ord('а') + Random(33); // первая буква + смещение
passo := passo+Chr(L);

И не надо никаких циклов.
...
Рейтинг: 0 / 0
28.05.2020, 16:23
    #39963459
neteurt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация пароля, проблема с русскими буквами
alekcvp,

сразу писал так
Код: pascal
1.
(Pos (Chr(L), 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ') > 0)


но на ХЕ делфи зафисала на этом месте
...
Рейтинг: 0 / 0
28.05.2020, 16:27
    #39963467
neteurt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация пароля, проблема с русскими буквами
alekcvp, ваш код генерирует только маленькие буквы, а как большие можно так сгенерировать?
...
Рейтинг: 0 / 0
28.05.2020, 16:28
    #39963468
neteurt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация пароля, проблема с русскими буквами
wadman,

это доработанная функция MessageShow
...
Рейтинг: 0 / 0
28.05.2020, 16:33
    #39963470
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация пароля, проблема с русскими буквами
neteurt
это доработанная функция MessageShow

Смотря ведь как доработанная... Но она юникод не понимает.
alekcvp
Надо делать как-то так:

CharInSet не вариант?
...
Рейтинг: 0 / 0
28.05.2020, 16:40
    #39963476
neteurt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация пароля, проблема с русскими буквами
wadman,

DialogInfo это для удобства чтобы можно было посмотреть, в плавающем веди русские буквы выводятся и в Edit
...
Рейтинг: 0 / 0
28.05.2020, 16:51
    #39963483
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация пароля, проблема с русскими буквами
neteurt
DialogInfo это для удобства чтобы можно было посмотреть, в плавающем веди русские буквы выводятся и в Edit

Значит проблема в том, что в юникоде русские буквы чуть другие коды имеют.

https://www.embarcadero.com/images/dm/technical-papers/delphi-and-unicode-marco-cantu.pdf

Замени все string на AnsiString.
...
Рейтинг: 0 / 0
28.05.2020, 17:13
    #39963490
neteurt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация пароля, проблема с русскими буквами
wadman, с AnsiString выводит вместо русских букв английские пример последнее четыре символа должны были быть русскими "3&vuGRIYiy"
...
Рейтинг: 0 / 0
28.05.2020, 17:43
    #39963509
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация пароля, проблема с русскими буквами
neteurt,

видимо проще самому написать. :)

Chr раньше просто преобразовывал тип, сейчас это нормальная конвертация. Замени на AnsiChar. Вдруг поможет?
...
Рейтинг: 0 / 0
28.05.2020, 18:30
    #39963533
neteurt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация пароля, проблема с русскими буквами
wadman,
сделал так
Код: pascal
1.
2.
3.
4.
  R := RandomRange(1,33);
    passo := Copy('АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ', R, 1);
    R := RandomRange(1,33);
    passo := passo + Copy('АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ', R, 1);
...
Рейтинг: 0 / 0
28.05.2020, 19:06
    #39963556
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация пароля, проблема с русскими буквами
neteurt
alekcvp, ваш код генерирует только маленькие буквы, а как большие можно так сгенерировать?

Код: pascal
1.
2.
3.
4.
5.
L := Ord('а') + Random(33); // маленькие русские
L := Ord('А') + Random(33); // большие русские
L := Ord('a') + Random(26); // маленькие латинские
L := Ord('A') + Random(26); // большие латинские
L := Ord('0') + Random(10); // цифры


Может вам сначала книжки какие-нибудь по программированию для начинающих почитать, м?..
...
Рейтинг: 0 / 0
28.05.2020, 19:07
    #39963557
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация пароля, проблема с русскими буквами
wadman
alekcvp
Надо делать как-то так:

CharInSet не вариант?

А вы в её исходники смотрели? Она только TAnsiCharSet понимает, насколько я понял.
...
Рейтинг: 0 / 0
28.05.2020, 19:39
    #39963582
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация пароля, проблема с русскими буквами
alekcvp
Она только TAnsiCharSet понимает, насколько я понял.
Множество, по определению, не может содержать элементы больше чем 255
...
Рейтинг: 0 / 0
28.05.2020, 21:34
    #39963644
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация пароля, проблема с русскими буквами
_Vasilisk_
alekcvp
Она только TAnsiCharSet понимает, насколько я понял.
Множество, по определению, не может содержать элементы больше чем 255

Тут важный момент: больше 255 элементов или элементы со значением (Ord()) больше 255?
...
Рейтинг: 0 / 0
28.05.2020, 23:07
    #39963715
Cobalt747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация пароля, проблема с русскими буквами
neteurt,

объяви L как AnsiChar
...
Рейтинг: 0 / 0
29.05.2020, 02:52
    #39963807
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация пароля, проблема с русскими буквами
Пробежал глазами, особо не вникал. А не проще сделать строчную константу со всеми допустимыми символами и по рандому дергать оттуда символы?
...
Рейтинг: 0 / 0
29.05.2020, 03:47
    #39963824
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация пароля, проблема с русскими буквами
white_nigger
Пробежал глазами, особо не вникал. А не проще сделать строчную константу со всеми допустимыми символами и по рандому дергать оттуда символы?

Ну в хорошем пароле должны присутствовать все классы, а с тупым рандомом так не получится.
Видел в инете генератор фонетических паролей - вот это вещь была, жаль там описание алгоритма на пару страниц. Он пароли генерировал легко запоминающиеся на основании слогов, замены подходящих букв цифрами и символами и т.п. Что-то типа: Th3b!RD0f
...
Рейтинг: 0 / 0
29.05.2020, 11:00
    #39963929
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация пароля, проблема с русскими буквами
white_nigger
А не проще сделать строчную константу со всеми допустимыми символами и по рандому дергать оттуда символы?

+1
...
Рейтинг: 0 / 0
29.05.2020, 12:33
    #39963999
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация пароля, проблема с русскими буквами
alekcvp
Тут важный момент: больше 255 элементов или элементы со значением (Ord()) больше 255?
Значения элементов может быть от 0 до 255.

Можешь проверить
Код: pascal
1.
2.
type
  TSet = set of 300..315;
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Генерация пароля, проблема с русскими буквами / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]