Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/48: Рейтинг темы: голосов - 48, средняя оценка - 4.79
2 / 1 / 1
Регистрация: 16.01.2018
Сообщений: 40
1

Шифрование строк на этапе компиляции

16.08.2023, 08:43. Показов 8631. Ответов 4

Author24 — интернет-сервис помощи студентам
Добрый день!
нашел алгоритм base64 https://github.com/tobiaslocke... base64.hpp и вот идея во время компиляции шифровать с его помощью строки, а на этапе выполнения их расшифровывать! как это сделать? при попытке испльзовать constexpr возникает ошибка error C3615: constexpr function 'to_base' cannot result in a constant expression
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.08.2023, 08:43
Ответы с готовыми решениями:

Ошибка на этапе компиляции
Добрый вечер. Ребят помогите, не могу понять в чем дело. Есть программа в которой описан 1 класс...

Ошибка на этапе компиляции
в чём может быть проблема?

C++14: вычисления на этапе компиляции
Добрый день. Есть такой код:struct Qaz { constexpr Qaz(uint8_t index) : _index(index) {} ...

Чтение файла на этапе компиляции
Можно ли считать файл настроек на этапе компиляции? Нужно что бы выбросить код который в рантайме...

4
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
16.08.2023, 09:15 2
Цитата Сообщение от kapusta_007 Посмотреть сообщение
при попытке испльзовать constexpr возникает ошибка
Чтобы функция считалась constexpr внутри нее должна быть работа с constexpr. А у вас там std::string.
Начать нужно с того, что избавиться от всех динамических сущностей, продумать как будет организовано заполнение результата (а это зависит от того какой стандарт С++ разрешено использовать).

Цитата Сообщение от kapusta_007 Посмотреть сообщение
как это сделать?
Я бы сказал, что до сих пор не смотря на многие упрощения на этом поприще, чтобы это сделать нужен уровень в С++ выше среднего. Короче говоря, случайно залетевший в C++ человек никогда это не сделает.
1
0 / 0 / 0
Регистрация: 22.01.2024
Сообщений: 8
22.01.2024, 16:37 3
Этможно сделать простым и сложным путем: простым - самостоятельно закодировать строки и поместить их в исходник; сложным - написать макрос корорый будет запускаться в событии перед сборкой, искать строки, кодировать их и заменять в исходнике.
0
фрилансер
5834 / 5351 / 1101
Регистрация: 11.10.2019
Сообщений: 14,312
23.01.2024, 06:46 4
kapusta_007, вот такая заготовка получилась (тут только расчёт размеров, самого шифрования ещё нет. См todo)

C++
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
#include <iostream>
#include <array>
#include <string_view>
 
template<size_t SRC_SIZE>
constexpr auto toBase64(const char(&src)[SRC_SIZE])
{
    const size_t from_size=3;
    const size_t to_size=4;
    std::array<unsigned char,from_size> from{};
    std::array<unsigned char,to_size> to{};
 
    const size_t DST_SIZE_solid=SRC_SIZE / from_size * to_size + (SRC_SIZE % from_size ? SRC_SIZE % from_size +1 : 0);
    const size_t DST_SIZE_tail=(SRC_SIZE % from_size ? from_size-SRC_SIZE % from_size : 0);
    const size_t DST_SIZE=DST_SIZE_solid+DST_SIZE_tail;
 
    std::array<char,DST_SIZE+1> dst{};
    
    //тут в цикле формируем содержимое dst из src
    for(size_t i=0; i<DST_SIZE-DST_SIZE_tail;i++)
    {
        //todo
        (void)src[i];
        
        dst[i]='A';
    }
    for(size_t i=DST_SIZE-DST_SIZE_tail; i<DST_SIZE;i++)
    {
        dst[i]='=';
    }
    
    return dst;
}
 
int main()
{
    {constexpr char s[]={0}                ; static_assert(std::string_view{toBase64(s).data()}=="AA=="        );}
    {constexpr char s[]={0,0}              ; static_assert(std::string_view{toBase64(s).data()}=="AAA="        );}
    {constexpr char s[]={0,0,0}            ; static_assert(std::string_view{toBase64(s).data()}=="AAAA"        );}
    {constexpr char s[]={0,0,0,0}          ; static_assert(std::string_view{toBase64(s).data()}=="AAAAAA=="    );}
    {constexpr char s[]={0,0,0,0,0}        ; static_assert(std::string_view{toBase64(s).data()}=="AAAAAAA="    );}
    {constexpr char s[]={0,0,0,0,0,0}      ; static_assert(std::string_view{toBase64(s).data()}=="AAAAAAAA"    );}
    {constexpr char s[]={0,0,0,0,0,0,0}    ; static_assert(std::string_view{toBase64(s).data()}=="AAAAAAAAAA==");}
    {constexpr char s[]={0,0,0,0,0,0,0,0}  ; static_assert(std::string_view{toBase64(s).data()}=="AAAAAAAAAAA=");}
    {constexpr char s[]={0,0,0,0,0,0,0,0,0}; static_assert(std::string_view{toBase64(s).data()}=="AAAAAAAAAAAA");}
}
0
фрилансер
5834 / 5351 / 1101
Регистрация: 11.10.2019
Сообщений: 14,312
23.01.2024, 16:58 5
стало интересно, заморочился. Получилось вот такое решение
C++
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include <iostream>
#include <array>
#include <string_view>
 
template<size_t SRC_SIZE>
constexpr auto toBase64(const unsigned char(&src)[SRC_SIZE])noexcept
{
    struct s_from
    {
        unsigned char data_33333322;//младший байт исходных данных
        unsigned char data_22221111;//
        unsigned char data_11000000;//старший байт исходных данных
        
        static constexpr char index_to_symbol(const size_t i)noexcept
        {
            constexpr char symbols[64]
            {
            'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
            'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',
            'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',
            'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/',
            };
            return symbols[i&0b111111];
        }
 
        constexpr char char_0()const noexcept{return index_to_symbol( data_33333322>>2 );}
        constexpr char char_1()const noexcept{return index_to_symbol( (data_33333322&0b11)<<4 | data_22221111>>4 );}
        constexpr char char_2()const noexcept{return index_to_symbol( (data_22221111&0b1111)<<2 | data_11000000>>6 );}
        constexpr char char_3()const noexcept{return index_to_symbol( data_11000000&0b111111 );}
    };
 
    const size_t from_size=sizeof(s_from);
    const size_t to_size  =4;
 
    const size_t DST_SIZE_solid=SRC_SIZE / from_size * to_size + (SRC_SIZE % from_size ? SRC_SIZE % from_size +1 : 0);
    const size_t DST_SIZE_tail=(SRC_SIZE % from_size ? from_size-SRC_SIZE % from_size : 0);
    const size_t DST_SIZE=DST_SIZE_solid+DST_SIZE_tail;
 
    std::array<char,DST_SIZE+1> dst{};
 
    //целые шаги
    const size_t SRC_solid_steps=SRC_SIZE/sizeof(s_from);
    for(size_t step=0; step<SRC_solid_steps; step++)
    {
        const s_from f
        {
            src[from_size-3+step*sizeof f],
            src[from_size-2+step*sizeof f],
            src[from_size-1+step*sizeof f],
        };
 
        dst[to_size-4+step*to_size]=f.char_0();
        dst[to_size-3+step*to_size]=f.char_1();
        dst[to_size-2+step*to_size]=f.char_2();
        dst[to_size-1+step*to_size]=f.char_3();
    }
    
    //хвостик
    if(const size_t SRC_tail_steps=SRC_SIZE%sizeof(s_from))
    {
        if(SRC_tail_steps>=2)
        {
            const s_from f
            {
                src[from_size-3+SRC_solid_steps*sizeof f],
                src[from_size-2+SRC_solid_steps*sizeof f],
                {}
            };
 
            dst[to_size-4+SRC_solid_steps*to_size]=f.char_0();
            dst[to_size-3+SRC_solid_steps*to_size]=f.char_1();
            dst[to_size-2+SRC_solid_steps*to_size]=f.char_2();
            dst[to_size-1+SRC_solid_steps*to_size]='=';
        }
        else
        {
            const s_from f{src[from_size-3+SRC_solid_steps*sizeof f],{},{}};
 
            dst[to_size-4+SRC_solid_steps*to_size]=f.char_0();
            dst[to_size-3+SRC_solid_steps*to_size]=f.char_1();
            dst[to_size-2+SRC_solid_steps*to_size]='=';
            dst[to_size-1+SRC_solid_steps*to_size]='=';
        }
    }
 
    return dst;
}
 
int main()
{
    using ssv=std::string_view;
    {constexpr unsigned char s[]{0x00}               ; static_assert("AA=="    ==ssv{toBase64(s).data()});}
    {constexpr unsigned char s[]{0x01}               ; static_assert("AQ=="    ==ssv{toBase64(s).data()});}
    {constexpr unsigned char s[]{0xfe}               ; static_assert("/g=="    ==ssv{toBase64(s).data()});}
    {constexpr unsigned char s[]{0xff}               ; static_assert("/w=="    ==ssv{toBase64(s).data()});}
    {constexpr unsigned char s[]{0xff,0x00}          ; static_assert("/wA="    ==ssv{toBase64(s).data()});}
    {constexpr unsigned char s[]{0xff,0x01}          ; static_assert("/wE="    ==ssv{toBase64(s).data()});}
    {constexpr unsigned char s[]{0xff,0xfe}          ; static_assert("//4="    ==ssv{toBase64(s).data()});}
    {constexpr unsigned char s[]{0xff,0xff}          ; static_assert("//8="    ==ssv{toBase64(s).data()});}
    {constexpr unsigned char s[]{0x00,0xff}          ; static_assert("AP8="    ==ssv{toBase64(s).data()});}
    {constexpr unsigned char s[]{0x01,0xff}          ; static_assert("Af8="    ==ssv{toBase64(s).data()});}
    {constexpr unsigned char s[]{0xfe,0xff}          ; static_assert("/v8="    ==ssv{toBase64(s).data()});}
    {constexpr unsigned char s[]{0xaa,0xcc,0x00}     ; static_assert("qswA"    ==ssv{toBase64(s).data()});}
    {constexpr unsigned char s[]{0xaa,0xcc,0x01}     ; static_assert("qswB"    ==ssv{toBase64(s).data()});}
    {constexpr unsigned char s[]{0xaa,0xcc,0xfe}     ; static_assert("qsz+"    ==ssv{toBase64(s).data()});}
    {constexpr unsigned char s[]{0xaa,0xcc,0xff}     ; static_assert("qsz/"    ==ssv{toBase64(s).data()});}
    {constexpr unsigned char s[]{0xcc,0xaa,0x00}     ; static_assert("zKoA"    ==ssv{toBase64(s).data()});}
    {constexpr unsigned char s[]{0xcc,0xaa,0x01}     ; static_assert("zKoB"    ==ssv{toBase64(s).data()});}
    {constexpr unsigned char s[]{0xcc,0xaa,0xfe}     ; static_assert("zKr+"    ==ssv{toBase64(s).data()});}
    {constexpr unsigned char s[]{0xcc,0xaa,0xff}     ; static_assert("zKr/"    ==ssv{toBase64(s).data()});}
    {constexpr unsigned char s[]{0xaa,0xcc,0x77,0x00}; static_assert("qsx3AA=="==ssv{toBase64(s).data()});}
    {constexpr unsigned char s[]{0xaa,0xcc,0x77,0x01}; static_assert("qsx3AQ=="==ssv{toBase64(s).data()});}
    {constexpr unsigned char s[]{0xaa,0xcc,0x77,0xfe}; static_assert("qsx3/g=="==ssv{toBase64(s).data()});}
    {constexpr unsigned char s[]{0xaa,0xcc,0x77,0xff}; static_assert("qsx3/w=="==ssv{toBase64(s).data()});}
    {constexpr unsigned char s[]{0xcc,0x77,0xaa,0x00}; static_assert("zHeqAA=="==ssv{toBase64(s).data()});}
    {constexpr unsigned char s[]{0xcc,0x77,0xaa,0x01}; static_assert("zHeqAQ=="==ssv{toBase64(s).data()});}
    {constexpr unsigned char s[]{0xcc,0x77,0xaa,0xfe}; static_assert("zHeq/g=="==ssv{toBase64(s).data()});}
    {constexpr unsigned char s[]{0xcc,0x77,0xaa,0xff}; static_assert("zHeq/w=="==ssv{toBase64(s).data()});}
    {constexpr unsigned char s[]{0x77,0xcc,0xaa,0x00}; static_assert("d8yqAA=="==ssv{toBase64(s).data()});}
    {constexpr unsigned char s[]{0x77,0xcc,0xaa,0x01}; static_assert("d8yqAQ=="==ssv{toBase64(s).data()});}
    {constexpr unsigned char s[]{0x77,0xcc,0xaa,0xfe}; static_assert("d8yq/g=="==ssv{toBase64(s).data()});}
    {constexpr unsigned char s[]{0x77,0xcc,0xaa,0xff}; static_assert("d8yq/w=="==ssv{toBase64(s).data()});}
}
0
23.01.2024, 16:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.01.2024, 16:58
Помогаю со студенческими работами здесь

Несистематическая ошибка на этапе компиляции
#pragma hdrstop #pragma argsused #include &lt;iostream.h&gt; void main() { double a; int...

Определение ошибочных данных на этапе компиляции
возможно ли в C++ создавать свои ошибки? чисто теоретически есть класс, в котором есть интовое...

Проверка типа переменной на этапе компиляции
Добрый день. Прошу экспертов( ну или всех, кто это знает ) показать, как правильно &quot;повешать&quot;...

Уменьшение исполняемого кода на этапе компиляции
Существует набор регистров (переменных), которые нужно заполнять. Например есть набор Reg1...Reg10...

Вычисление размера массива на этапе компиляции
Нашел код который вычисляет размер массива на этапе компиляции Но сам код мне не понятен....

Как выполнить код на этапе компиляции?
Предположим есть функция(может быть какая угодно часть кода). void Funkz(){ /*...*/ } Далее...

Потоки. Ввод-вывод. Ошибка на этапе компиляции.
#include &lt;windows.h&gt; #include &lt;fstream&gt; #include &lt;iostream&gt; #include &lt;iomanip&gt; using namespace...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru