Помощь - Поиск - Пользователи - Календарь
Полная версия: Протокол аутентификации Фейге-Фиата-Шамира
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Другие языки
*kitty*
Здравствуйте! Очень нужна помощь в написании небольшой программы с большими числами. smile.gif Необходимо реализовать протокол аутентификации Фейге-Фиата-Шамира, используя длинные ключи. Нашла в инете реализацию цифровой подписи на основе данного протокола с использованием библиотеки ‘lip.h’ (работа с длинными числами, модулярная арифметика), обрадовалась, увидя процедуру генерации ключей, но, начав разбираться в коде поняла, что для цифровой подписи протокол несколько иной…
В протоколе аутентификации ФФШ секретный ключ формируется следующим образом: ищутся квадратичные вычеты по модулю n (n=p*q, где p и q – большие простые числа), далее находят их обратные значения опять же по модулю n, затем из получившегося множества выбирают k значений, из каждого значения извлекается квадратный корень по модулю n – получившийся вектор из k чисел и будет секретным ключом. В цифровой же подписи секретный ключ формируется иным образом. Вот и попала я в тупиковую ситуацию: на Си/Си++ ранее писать не приходилось, работала только на Делфи, поэтому каждый шаг дается пока с трудом, а тут такая головоломка… unsure.gif Не представляю даже каким образом можно реализовать генерацию секретного ключа, а именно нахождение квадратичных вычетов по модулю для длинного числа: осуществлять это перебором? наверное, займет много времени; как хранить найденное множество значений? ведь их будет очень много…
Библиотека, на первый взгляд, приличная, все функции снабжены кратким описанием, присутсвуют все необходимые операции модулярной арифметики: умножение, вычисление обратного значения, квадратного корня и т.д. Сама понимаю, что не справлюсь, поэтому буду очень рада помощи.
Прикрепляю проект с присоединенной библиотекой, ничего не выбрасывала из кода, хотя хэш-функция мне не нужна, а для начала только процедура FFS_gen_keys. Так же выкладываю описание самого алгоритма.
Нажмите для просмотра прикрепленного файла
Lapp
Цитата(*kitty* @ 22.04.2010 14:39) *
Не представляю даже каким образом можно реализовать генерацию секретного ключа, а именно нахождение квадратичных вычетов по модулю для длинного числа: осуществлять это перебором? наверное, займет много времени; как хранить найденное множество значений? ведь их будет очень много…
Непонятен такой момент: сколько тебе нужно вычетов? То есть чему равно то число k?
Собственно поиск вычетов, мне кажется, не так уж и долог. Это не совсем перебор. Смотри.
Берем некторое x (случайно), возводим его в квадрат и находим его остаток (a) по модулю n - это и есть вычет. Так? Вроде, так. Повторяем эту операцию, отсеивая повторы (по a), пока не наберем нужное количество k. Если k не очень велико, то повторов много не будет. Вычетов же довольно много. Если бы n было простым, их было бы порядка n/2. Не знаю, как оценить в случае произведения двух простых, но вряд ли разлчичие составляет много порядков.. )) Так что особой задержки тут ожидать не следует.
Вопрос о хранении тоже сопряжен с их количеством. Чем определяется k?

Ааа.. Ясно: k напрямую связана с криптостойкостью (я все-таки дочитал тот док до конца)). Так что ты выбираешь k, исходя из желаемой прочности. Если устраивает, скажем, 128 бит (при однократной попытке), то k=128. Я прав? smile.gif

Добавлено через 6 мин.
Еще одна маленькая неясность: из какого диапазона выбирать случайное x? По идее, оно может (и, наверное, должно) быть больше n. Если брать маленькие (порядка n), то, боюсь, это перекособочит весь алгоритм и понизит его прочность. Не знаю, как тут быть.. Чисто интуитивно кажется, что достаточно диапазона порядка n2 smile.gif. А это в свою очередь означает, что нужно уметь обрабатывать числа аж до n4..

Реализаций длинных чисел, к слову сказать, на Форуме проскакивало несколько. Одна из них, кажется, в FAQе.. Какой конкретно диапазон тебе нужен?
*kitty*
k действительно отвечает за криптоскойкость, чем больше будет компонентов в секретном ключе, тем лучше smile.gif , выбирается, видимо, из своих собственных соображений. Длина простых чисел p и q, с которых начинается алгоритм, должна быть не меньше 256 бит (опять же, чем больше, тем лучше).
Квадратичные вычеты по модулю n, если использовать способ простого перебора, находятся следующим образом: берутся все целые числа, меньшие n, начиная с единицы, возводятся в квадрат по модулю n, получившиеся остатки и есть искомые квадратичные вычеты. Они могут повторятся. Различных значений должно быть ровно (p-1)*(q-1)/4. Но есть одно существенное "НО": для формирования секретного ключа берутся обратные значения по модулю n для квадратичных вычетов, а не для каждого числа существует обратное значение по модулю n, а именно не существует таких обратных значений для чисел, которые не являются взаимно простыми с n. Поэтому нельзя взять произвольно k целых чисел < n, возвести их в квадрат и найти остаток, так как длина ключа может получиться меньше нужной....

Добавлено через 15 мин.
Ой, сначала не так поняла идею про k blush.gif . Наверное, хорошая идея, искать не всё, а только пока не наберется k квадратичных вычетов, имеющих обратные значения по модулю n.
Lapp
*kitty*, ты хитрая лиса )), если ты все знала - зачем спрашивала? smile.gif
Цитата(*kitty* @ 23.04.2010 20:37) *
Но есть одно существенное "НО": для формирования секретного ключа берутся обратные значения по модулю n для квадратичных вычетов, а не для каждого числа существует обратное значение по модулю n, а именно не существует таких обратных значений для чисел, которые не являются взаимно простыми с n. Поэтому нельзя взять произвольно k целых чисел < n, возвести их в квадрат и найти остаток, так как длина ключа может получиться меньше нужной....
Легко быть взаимно простым с числом, являющимся произведением двух простых. Иначе говоря, НЕ взаимно простых есть только чуть больше двух )).

Цитата
хорошая идея, искать не всё, а только пока не наберется k квадратичных вычетов, имеющих обратные значения по модулю n.
На идею особо не тянет )). Никто не покупает всю картошку в мире, чтоб приготовить себе обед! smile.gif
*kitty*
Цитата
*kitty*, ты хитрая лиса )), если ты все знала - зачем спрашивала? smile.gif


Теория теорией - всегда можно взять почитать и постараться разобраться smile.gif , у меня большие проблемы с реализацией (Си не знаю, проблемы даже с обычными операторами, типа вывода, понять что написано могу, а вот что-то сотворить не получается). Тыкалась в коде как слепыш, постоянно ошибки вылетают, а я и не понимаю в чем дело unsure.gif Нужна помощь.
Цитата

Легко быть взаимно простым с числом, являющимся произведением двух простых. Иначе говоря, НЕ взаимно простых есть только чуть больше двух )).

Вот это не поняла что-то, там в примере 143=11*13, обратных значений нет у 11 чисел, так как они не являются взаимно простыми с числом 143....
Цитата

На идею особо не тянет )). Никто не покупает всю картошку в мире, чтоб приготовить себе обед! smile.gif

Точно smile.gif Ну я вот почему-то до сих пор хотела честно находить все вычеты blush.gif laugh.gif
Lapp
Цитата(*kitty* @ 24.04.2010 1:25) *
большие проблемы с реализацией (Си не знаю, проблемы даже с обычными операторами, типа вывода, понять что написано могу, а вот что-то сотворить не получается). Тыкалась в коде как слепыш, постоянно ошибки вылетают, а я и не понимаю в чем дело
Еслли ты привыкла к Паскалю - это и плюс и минус. Минус, потому что многое все же отличается (в частности, как раз простейший ввод/вывод), но ты тверже держись основных принципов - они все же одни. И как можно больше экспериментируй. И спрашивай, ессно )). Кстати, какой у тя компилятор и какая среда? И вообще, Си - это требование или ты просто так дорожишь той найденной библиотекой?

Цитата
Вот это не поняла что-то, там в примере 143=11*13, обратных значений нет у 11 чисел, так как они не являются взаимно простыми с числом 143....
И ты испугалась? lol.gif Именно это я и назвал словами "чуть больше двух". Каждое из p и q порождает свою линию "невзаимнопростыхсn" чисел: i*p и j*q. Их количество естественным образом зависит от величины p и q. Всего их p+q, грубо говоря (в примере 13+11=24). Но вычетами являются всего несколько меньше половины - вот и получили 11, что в процентном отношении от 143 довольно много. Но если мы возьмем p и q порядка 1010, то их произведение (n) будет порядка 1020, а сумма 2*1010. И процентное отношение легко превращается в микропроцентное )). Еще раз: именно это я и называю "чуть бльше двух" smile.gif. То есть вероятность того, что твой вычет не будет иметь обратного значения стремится к нулю с возрастанием размеров чисел.
Примеры - они хороши безусловно, но нужно понимать, что они не всегда прямо масштабируются.

Цитата
Точно smile.gif Ну я вот почему-то до сих пор хотела честно находить все вычеты blush.gif laugh.gif
Эээ.. так ты рискуешь умереть с голоду, так и не пообедав, восседая на картофельном Эвересте.. wacko.gif
*kitty*
Цитата(Lapp @ 24.04.2010 3:37) *
Кстати, какой у тя компилятор и какая среда? И вообще, Си - это требование или ты просто так дорожишь той найденной библиотекой?

У меня Борланд Си++ Билдер 6. Если честно, то библиотека конкретно эта понравилась: простая, охватывает основные необходимые моменты и самый большой плюс - снабжена понятными, доступными описаниями всех функций, примерами. Для Делфи подобного не нашла, если и есть библиотеки, то либо без описания, либо настолько это какими-то непонятными обрывками... Самостоятельно разбираться в библиотеках (что, где и как там делается) времени не хватает, потому что засяду с этим надолго. А к этой целая книжечка в качестве документации идет smile.gif . Вот я подумала, вдруг кто-нибудь захочет немного помочь и написать небольшой кусочек кода blush.gif
Цитата
И ты испугалась? lol.gif Именно это я и назвал словами "чуть больше двух".

Ну да, я поняла это буквально. Для меня "чуть больше двух" - это три, ну максимум четыре laugh.gif

Lapp
Цитата(*kitty* @ 24.04.2010 16:42) *
я подумала, вдруг кто-нибудь захочет немного помочь и написать небольшой кусочек кода
Гм.
Помочь хотят все, думаю. Но писать за тебя.. Может, ты начнешь? Начальных данных уже достаточно, кажется. Или еще нет?
*kitty*
Эх, если бы я могла сама написать, не обращалась бы за помощью... unsure.gif
volvo
*kitty*, понимаешь, в чем дело... Этих реализаций - полно на каждом шагу. Уж FFS найти - вообще не проблема. Поэтому и не хочется реализовывать то, что уже сделано.

Я бы на твоем месте взял готовую реализацию (если надо - прикреплю сюда PDF-файл, описывающий детали реализации, и содержащий сами исходные коды программы, правда, оно всё по-английски. И еще одно: там для работы с длинными числами используется библиотека GMP), и разобрался бы с ней. Поверь, толку будет больше, чем пытаться сделать то же самое с нуля, тыкаться туда, сюда, и ничего в итоге не продвигается... А когда разберешься - можешь уже и написать все с нуля сама, с использованием LIP.H (так сказать, для закрепления материала smile.gif )

Нужен PDF?
*kitty*
Я уже нашла этот pdf smile.gif (кстати, это единственная реализация этого протокола, который я нашла в сети, а искала долго), но там другая проблема, никак не могу подсоединить эту библиотеку, она написана под Линакс, есть сборки под ХР, но там какае-то сложности подключения все равно... вообщем не получается.
Вы не работали с этой библиотекой? Может у кого-то получилось её подключить и использовать в Билдере Си++? rolleyes.gif
volvo
Получалось... Вот тут: Sources -> gmp-lib and Builder c++ Adil рассказывал что надо делать для подключения GMP к Билдеру. Даже тестовые проекты выкладывались...
*kitty*
Спасибо, буду пробовать smile.gif
*kitty*
Написала протокол с использованием библиотеки "lip.h" в консольном режиме, работает. Теперь нужно реализовать это в визуальном режиме. Создала новый проект с формой, перенесла в папку с проектом файлы "lip.c", "lip.h", добавила в проект. В обработчике кнопки попробовала вызвать библиотечные функции, проект компилируется, но линковщик выдает ошибки по всем функциям:
[Linker Error] Unresolved external 'zrandomb(long *, long * *)' referenced from F:\FFS_VLC\MAINUNIT.OBJ
[Linker Error] Unresolved external 'zrandomprime(long, long, long * *, void (*)(long *, long * *))'
referenced from F:\FFS_VLC\MAINUNIT.OBJ
[Linker Error] Unresolved external 'zswrite(char *, long *)' referenced from F:\FFS_VLC\MAINUNIT.OBJ


Подскажите, пожалуйста, как это исправить?
volvo
#include <mem.h>
#include <stdio.h>
#include <stdlib.h>

// Указать явно, что LIP написана на чистом С:
extern "C"
{
#include "lip.h"
}
#include "MainUnit.h"


Тогда программа будет нормально линковаться. На работоспособность не проверял.
*kitty*
Спасибо, помогло smile.gif
*kitty*
Здравствуйте, по ходу реализации возникла ещё одна проблема:
из формы Form1 нажатием кнопки вызывается форма Form3->Show(). Далее, при нажатии кнопки на Form3, в Memo1 на Form1 должна выводится некоторая информация. Необходимо чтобы обе форме оставались на экране, было переключение между этими формами, то есть вызывать Form3->ShowModal() нельзя.

Подскажите, пожалуйста, как её разрешить.
volvo
Цитата
вызывать Form3->ShowModal() нельзя.
Вызывай просто Show(), не модально...
*kitty*
Цитата(volvo @ 5.05.2010 11:33) *

Вызывай просто Show(), не модально...

Так в том то и дело что выдает ошибку. Когда в обработчике кнопки Form3 пишу
Form1->Memo1->Lines->Add(AnsiString(str) + ";");

проект запускается, но когда нажимаю эту кнопку на стадии выполнения вылетает ошибкаНажмите для просмотра прикрепленного файла
volvo
Не знаю, на тестовом проекте у меня прекрасно отработало заполнение Memo, расположенного на первой форме, по нажатию кнопки на форме третьей... Присоедини свой проект, надо видеть, что и как у тебя делается...
*kitty*
Да и правда, на тестовом и у меня заработало. Значит модули как-то соединены неправильно.... но не пойму, что не так, посмотрите, пожалуйста...
volvo
Хм... smile.gif

[ILINK32 Warning] Warning: Public symbol '_zn' defined in both
module F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\ALICEUNIT.OBJ
and F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\TRUSTEDCENTER.OBJ
[ILINK32 Warning] Warning: Public symbol '_zw' defined in both
module F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\ALICEUNIT.OBJ
and F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\TRUSTEDCENTER.OBJ
[ILINK32 Warning] Warning: Public symbol '_k' defined in both
module F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\ALICEUNIT.OBJ
and F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\TRUSTEDCENTER.OBJ
[ILINK32 Warning] Warning: Public symbol '_t' defined in both
module F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\ALICEUNIT.OBJ
and F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\TRUSTEDCENTER.OBJ
[ILINK32 Warning] Warning: Public symbol '_length' defined in both
module F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\ALICEUNIT.OBJ
and F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\TRUSTEDCENTER.OBJ
[ILINK32 Warning] Warning: Public symbol '_zs' defined in both
module F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\MAINUNIT.OBJ
and F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\ALICEUNIT.OBJ
[ILINK32 Warning] Warning: Public symbol '_zs' defined in both
module F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\MAINUNIT.OBJ
and F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\TRUSTEDCENTER.OBJ
[ILINK32 Warning] Warning: Public symbol '_zv' defined in both
module F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\MAINUNIT.OBJ
and F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\ALICEUNIT.OBJ
[ILINK32 Warning] Warning: Public symbol '_zv' defined in both
module F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\MAINUNIT.OBJ
and F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\TRUSTEDCENTER.OBJ
[ILINK32 Warning] Warning: Public symbol '_zs' defined in both
module F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\ALICEUNIT.OBJ
and F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\TRUSTEDCENTER.OBJ
[ILINK32 Warning] Warning: Public symbol '_zv' defined in both
module F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\ALICEUNIT.OBJ
and F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\TRUSTEDCENTER.OBJ
[ILINK32 Warning] Warning: Public symbol '_Form3' defined in both
module F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\ALICEUNIT.OBJ
and F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\TRUSTEDCENTER.OBJ



И тебя даже ТАКИЕ предупреждения линкера не заставили задуматься, что что-то не так? Напрасно. На подобные вещи нужно всегда обращать внимание...

Теперь о том, что именно не так: А вот это:
Цитата(AliceUnit.cpp)
#include "AliceUnit.h"
#include "TrustedCenter.h"
#include "MainUnit.cpp"

, вот это:
Цитата(TrustedCenter.cpp)
#include "TrustedCenter.h"
#include "AliceUnit.cpp"



Никогда (я повторяю, никогда) не используй #include для того чтобы включить CPP-файл. Только хидер...

Итого, что надо сделать: везде, где при-include-вались CPP-файлы, заменить ".cpp" на ".h", а для того, чтобы после этого линкер мог корректно собрать проект - придется чуть-чуть пошаманить с модулем MainUnit (что-то перенести в хидер, что-то добавить в хидер)... Я сделал это, но у меня Builder 2009, ты открыть не сможешь, просто посмотри в исходниках, что и как получилось, и сделай это в своем проекте сама. smile.gif Больше так делать точно не будешь...

В идеале - пока программа содержит хоть один Warning - она не должна запускаться. Особенно - если это Warning не от компилятора.
*kitty*
Цитата
И тебя даже ТАКИЕ предупреждения линкера не заставили задуматься, что что-то не так?
Я догадывалась, что это не очень хорошо biggrin.gif , но так как не особо разбираюсь в отладке, то раз всё запускалось и работало, вычислялось правильно, то закрывала на это глаза... до поры blush.gif
Цитата
Никогда (я повторяю, никогда) не используй #include для того чтобы включить CPP-файл. Только хидер...
Хорошо, учту. Я просто хидеры вижу первый раз, в Delphi все через модули подключается.
Цитата
Я сделал это, но у меня Builder 2009, ты открыть не сможешь
Запустилось, кстати, приложение, правда с Warning'ами, но работает и в Builder 6 smile.gif

volvo, спасибо большое, что помогаешь разбираться good.gif
Lapp
Цитата(*kitty* @ 5.05.2010 23:08) *
Запустилось, кстати, приложение, правда с Warning'ами, но работает
Прекрасное подтверхдение того, что автор темы "все поняла" lol.gif

Цитата
volvo, спасибо большое, что помогаешь разбираться good.gif
Ты вполне уже вправе подтвердить свою благодарность нажатием на зеленый плюсик..
*kitty*
Цитата(Lapp @ 6.05.2010 7:38) *
Прекрасное подтверхдение того, что автор темы "все поняла"
Ну вот обязательно нужно было подколоть cool.gif Я просто отметила, что и в другой версии получилось запустить. В своей же программе исправила всё, следуя советам volvo, теперь прекрасно работает без всяких предупреждений.

Lapp
Цитата(*kitty* @ 6.05.2010 13:06) *
Ну вот обязательно нужно было подколоть
Не обижайся, это шутка smile.gif.
На самом деле я очень ценю твое отношение к делу give_rose.gif , серьезно.
+1
*kitty*
Добрый день! Возникла ещё одна проблема: как сделать так, чтобы при запуске ехе-файла на других компьютерах формы приложения не меняли свои размеры, и компоненты (а именно надписи и вставленные картинки с формулами), расположенные на них, оставались на своих местах?
(И ещё почему-то пропали установленные мною цвета у GroupBox, стали просто серыми... unsure.gif )

Вернее, не форма меняет размеры, а окно показывает только часть формы с прокруткой, а не всю форму.
volvo
Можно присоединить проект (или какую-то его часть, которая воспроизводит проблему)? И заодно уточнить, есть ли принципиальные отличия между этими разными компьютерами. Точнее - между установками ОС. Еще точнее - например, на одной машине установлена дефолтная тема (которая по умолчанию в XP, синяя), а на другой - классическая тема?

Кстати, насколько разные ОСи на машинах? Это тоже важно: то, что работает на XP может при определенных условиях не так отработать на "Семерке", примеры уже были на форуме.
*kitty*
Я забыла, наверное, самое главное уточнить blush.gif (а слона то я и не заметила... cool.gif ). Из-за того, что были проблемы с vcl60.bpl, пробовала запускать после только на машинах, на которых НЕ установлен Borland C++ Builder. Может именно из-за этого проблемы с цветом?
На рабочем компьютере, на котором делала проект, ХР Service Pack 2 (нелицензионная), тема "Windows XP (изменено)".
Запускала на домашнем ноуте, XP Service Pack 3 (лицензионная), тема "Измененная".
И ещё у друга, XP Service Pack 3 (нелицензионная), тема "Классическая" .
*kitty*
Присоединяю проект просто с формой, которая искажается на других компьютерах, а именно:
1) пропадает голубой цвет "clInactiveCaptionText", установленный у компонента "GroupBox1" (фон картинок с формулами подобран также под этот цвет);
и, соответственно, у компонента "GroupBox2" пропадает серый цвет "clActiveBorder";
2) при запуске отображается не вся форма, а только её часть в окне с прокруткой, то есть приходится вручную подгонять размер окна приложения под форму;
3) часть компонентов смещается друг относительно друга, из-за этого продает (не видна) часть текста, что вообще очень плохо sad.gif

Цвета, конечно, не так страшно, что пропадают, можно обойтись и цветом по умолчанию, а вот сдвиг компонентов нужно как-то исправить. Можно ли как-то зафиксировать их на форме, чтобы такого не происходило? ну и чтобы форма открывалась целиком без прокрутки?

Нажмите для просмотра прикрепленного файла
volvo
Цитата
1) пропадает голубой цвет "clInactiveCaptionText", установленный у компонента "GroupBox1" (фон картинок с формулами подобран также под этот цвет);
С этим и вторым пунктом (хотя у меня пропадает только этот, второй как раз отображается как положено, но это - скорее всего просто повезло) все просто: проблема - как раз в разных темах, как и предполагалось. Как исправить:
1) в режиме Design-а, то есть, еще до запуска программы, пока ты видишь свою форму в визуальном редакторе, для всех RichEdit-ов, лежащих внутри GroupBox-а, устанавливаешь ParentColor в True (тогда цвет не будет устанавливаться вручную, а будет получаться у родительского элемента, что предпочтительнее, достаточно сменить цвет родителя, и все дочерние элементы тоже поменяют цвет). Это можно сделать и в рантайме, скажем, при создании формы, вот так:

    for(int i = 0; i < Form1->ComponentCount; i++)
{
TRichEdit *RE = dynamic_cast<TRichEdit*>(Components[i]);
if(RE)
{
RE->ParentColor = True;
}
}

, но "зачем откладывать на RunTime то, что можно сделать в DesignTime-е?" (почти цитата)

2) А вот что обязательно придется сделать в рантайме - это:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
// Вместо Image4 может быть любое изображение, лежащее на GroupBox1
GroupBox1->Color = Image4->Picture->Bitmap->Canvas->Pixels[0][0];

// аналогично, тут можно использовать любое изображение лежащее на GroupBox2
GroupBox2->Color = Image3->Picture->Bitmap->Canvas->Pixels[0][0];
}

. И проблема решена.

А вот насчет пунктов 2 и 3 - я понимаю, что проблема возникает из-за разного разрешения экрана, что можно сделать - почитай здесь: Multi-Resolution Delphi Applications (к сожалению, тут я помочь тебе чем-то практическим вряд ли смогу, у меня на всех доступных машинах разрешения установлены в 1920х1080, сама понимаешь, что при таких числах маловероятно добиться искажения формы). Если можно - присоедини скриншот, что именно искажается, и относительно чего, тогда хотя бы можно будет посоветовать, какие Anchor-ы выставить...
*kitty*
С цветами проблему исправила good.gif , спасибо smile.gif

На рабочем компьютере расширение 1280 на 1024, но ноуте - 1680 на 1050.
Прикрепляю изображения того, что происходит с формами при запуске на ноуте:
- одна форма:
1) как должно быть: Нажмите для просмотра прикрепленного файла 2) в каком виде открывается: Нажмите для просмотра прикрепленного файла 3) искажения компонентов: Нажмите для просмотра прикрепленного файла

- вторая форма:
1) как должно быть: Нажмите для просмотра прикрепленного файла 2) в каком виде открывается: Нажмите для просмотра прикрепленного файла 3) искажения компонентов: Нажмите для просмотра прикрепленного файла
volvo
Очень интересно. Разрабатывается форма при меньшем разрешении, но при запуске на большем - не отображается полностью. Почему тогда при запуске на разрешении 1920*1080 такого не происходит, и форма отображается совершенно нормально? Неужели дело в версии Билдера?

Попробуй последовать совету, приведенному по ссылке - установи вместо Verdana шрифт Arial, и измени свойство Position формы на poDesktopCenter или на poScreenCenter (это заставит форму отображаться в центре экрана, что возможно решит проблемы с полосами прокрутки)...

Теперь еще один вопрос: а почему, собственно, ты делаешь такую гремучую смесь, как кусок предложения - в RichEdit-е, потом формула - в Image, потом опять RichEdit? Я бы на твоем месте поступил по-другому: набрал бы содержимое каждого из пунктов 1), 2), 3), 4) в отдельном DOC или RTF-файле (прямо вместе с формулами), и вместо TRichEdit+TImage использовал бы один-единственный TOleContainer для каждого пункта (весь абзац имеет смысл только в случае, если на компьютере, где запускается программа гарантированно установлен MS Office. Если нет - то либо оставлять как есть, либо полностью весь пункт, а не только формулу, переводить в изображение и вместо RichEdit+Image пользоваться одним Image).

Но сначала - измени Position и шрифты. Кстати, как вариант - попробуй еще запретить изменение размеров формы (Border установить в bsSingle).

P.S. Кстати, похоже, что дело действительно в версии компилятора: если я запускаю твой EXE-шник, и уменьшаю размер формы вручную, то я получаю эти самые полосы прокрутки. А когда перекомпилирую проект у себя (ничего не изменяя) и пытаюсь уменьшить размер формы - то никаких полос прокрутки уже нет, форма просто уменьшается в размерах, и все, что осталось за ее новыми границами - просто невидимо. Так что тут важно работать с той же версией Билдера, что и у тебя.
TarasBer
Скрины не смотрел - не могу пока, браузер в VGA режиме (640 на 480 при 16 цветах) картинки не показывает, а других режимов нет - дрова слетели, но если по поводу полос прокрутки по краям формы, то у формы 1 у свойств VertScrollBar и HorzScrollBar выставлено Visible в false?
От них зависит наличие полос прокрутки при изменении размеров.
volvo
А в BCB6 что, у этих свойств какое-то другое, отличное от 2009-го Билдера значение? Почему ТАМ полосы появляются, а ЗДЕСЬ - нет, хотя я написал, что ничего не менял.

P.S.
Цитата
у свойств VertScrollBar и HorzScrollBar выставлено Visible в false?
Не влияет. Что True, что False - полосы не появляются.
*kitty*
Цитата
Очень интересно. Разрабатывается форма при меньшем разрешении, но при запуске на большем - не отображается полностью. Почему тогда при запуске на разрешении 1920*1080 такого не происходит, и форма отображается совершенно нормально?
Да, на ноуте расширение больше, единственное экран по ширине меньше... Пробовала выставить расширение как на рабочем компе - та же самая картина. А вот на ещё одном компе, у друга, расширение меньше - 1152 на 864, но экран довольно большой, и открывается без прокруток...

Попробую сейчас сделать то, что посоветовали, надеюсь, поможет.

Цитата
Теперь еще один вопрос: а почему, собственно, ты делаешь такую гремучую смесь, как кусок предложения - в RichEdit-е, потом формула - в Image, потом опять RichEdit?
Действительно, неудачный выбор...blush.gif просто идея с формулами-картинками, пришла позже, чем идея записать последовательность действий, вот и решила просто вставить... Рисковать с TOleContainer не буду, потому что мне показывать проект придется на убитом компе, на котором ничего нет, и преподаватель требует, чтобы ехе полноценно работал при любых условиях... biggrin.gif Поэтому воспользуюсь, наверное, просто Image'ми - так безопаснее будет smile.gif
*kitty*
Цитата
измени свойство Position формы на poDesktopCenter или на poScreenCenter (это заставит форму отображаться в центре экрана, что возможно решит проблемы с полосами прокрутки)...
Помогло respect2.gif
Шрифт меняла, но всё равно сдвигаются текст и картинки относительно друг друга, буду делать сплошными картинками значит.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.