После второго двоеточия (т.е. в списке неизменных параметров): "r"(string) -- передать адрес string как регистровый параметр который мы только читаем.
После третьего двоеточия (т.е. в списке clobbered): "memory", потому что этот код в качестве побочного эффекта меняет память.
> думал очень ясно разложил вопрос
Приведя кусок кода, не относящийся к вопросу вообще никак? Написав что-то про "строки с++", при этом имея в виду строки с? Хм....
В документации на EncryptUpdate/DecryptUpdate говорится "as a result the amount of data written may be anything from zero bytes to (inl + cipher_block_size - 1) so outl should contain sufficient room". Я вам предлагаю поставить после {encrypt,decrypt}{Update,Final} assert, что len <= BUFF_SIZE. И если заассёртится -- увеличить размер буфера соответственно.
> в статье используется запись параметра именно так как было у меня до этого.
в этой статье автор заполняет непрерывный буфер, а вы заполняете огрызок длиной не превышающей BUFF_SIZE и складываете огрызки в std::string.
> Шифровать стало правильно. А вот при расшифровке проблема с последним блоком:
Неа, не стало. "Дошифровываем" неверно: вместо
if (1 != EVP_EncryptFinal_ex(ctx, out_buffer + len, &len))
должно быть
if (1 != EVP_EncryptFinal_ex(ctx, out_buffer, &len))
А почему, например, = имеет смысл только с объектами класса? Вдруг я захочу побочным эффектом посчитать количество выполненных присваиваний какого-нибудь енума?
@lexforceterror can't create directory 'test' -- наверняка у вас файловая система в которой вы пытаетесь создать каталог смонтирована ro, root тут не поможет без перемонтирования её в rw.