Все ли функции нужно шифровать

Добрый день!
В своем ПО реализую слегка нестандартный алгоритм RSA.

Полученный ключ кодируется в base64 функцией из стандартной библиотеки (при проверке, соответственно, декодируется).
Если я не ошибаюсь, это потенциальная дыра, т.к. можно навесить бряк, и прочитать память.

Вопрос следующий:
Ошибаюсь я или нет? :slight_smile: И как лучше поступать в таких случаях? Делать копии функ-и специально для защиты, например, Crpt_EncodeBase64, Crpt_DecodeBase64, Crpt_SHA1… и на них вешать защиту?

Если вы работаете с RSA, то в первую очередь нужно защитить ваш открытый ключ и всю работу с ним. Дальше переходите на функции, которые возвращают признак зарегистрированности и дальше на функции, использующие этот признак.

В общем случае понятно, но в силу моей параноидальности :slight_smile: меня интересует следующее:

const
  OURKEY = "AAE70sUQID3ZS7UcBmr9MDdWs0Ej4RNZaJZHOJoERscAb1ldXodaeUa....";

procedure TMyKey.LoadFromStream(AStream: TmemoryStream);
begin
  ...
   AStream.Read(self.fmodulus.memory^,modlen);
   AStream.Read(self.fexp.memory^,explen);
...
end;

procedure OpenPublicKey;
var
MyPublicKey:TMyKey;
begin
  ...
  KeyStrStream:=TStringStream.Create(OURKEY );
  DecodeBase64(KeyStrStream,RawStream);
  MyPublicKey.LoadFromStream(RawStream);
  ... 
end;

Если мы накроем Ультра защитой функции OpenPublicKey и DecodeBase64, то защита все равно будет дырявая.
Примерный алгоритм взлома будет такой:

  1. ищем по сигнатуре функцию TCustomMemoryStream.Read. Вычисляем ее адрес.
  2. Ставим бряк на адрес, дампим память по указателям и собираем ключик.
    Вывод: при реализации защитных механизмов не использовать библиотечные функции и классы, а писать свои и их накрывать мутацией и т.п.
    Правильно?

До TCustomMemoryStream даже дело не дойдет. У вас пропатчат OURKEY, который будет виден в виде строки в самом ехе-нике.

P.S. Для работы с открытым ключем мы писали отдельный класс, который хранит ключ в памяти в зашированном виде и достается для RSA данные кусочками. Это все дело работает под виртуализацией.

Вот и я нечто подобное делаю (Реализую более длинный лицензионный ключ с длиной полей более 255). ourkey, естественно, для примера без защиты)
Спасибо за ответы.