Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для Tessay
0 / 0 / 0
Регистрация: 22.12.2022
Сообщений: 33

Преобразование G

14.08.2023, 21:25. Показов 531. Ответов 3

Студворк — интернет-сервис помощи студентам
Доброй ночи! помогите пожалуйста добиться разделения строки fedcba9876543210
(a1, a0) = (fedcba98, 76543210),
G[K1](a1, a0) = (76543210, 28da3b14)
через точку останова выявил, ошибка у меня во функции G, но её вроде бы правильно реализовал по примеру:
Преобразование g
g[87654321](fedcba98) = fdcbc20c,
g[fdcbc20c](87654321) = 7e791a4b,
g[7e791a4b](fdcbc20c) = c76549ec,
g[c76549ec](7e791a4b) = 9791c849

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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
typedef uint8_t Vector[4];
 
Vector key_iteracial[32];
 
void PrintBytes(const uint8_t* data, size_t length);
void KeyRounds(const uint8_t* key);
void G(const uint8_t* k, const uint8_t* a, uint8_t* out_data);
void g(const uint8_t* k, const uint8_t* a, uint8_t* out_data);
void Add(const uint8_t* a, const uint8_t* b, uint8_t* c);
void AddMod32(const uint8_t* a, const uint8_t* b, uint8_t* c);
void Transform_T(const uint8_t* in_data, uint8_t* out_data);
void FinalG(const uint8_t* k, const uint8_t* a, uint8_t* out_data);
void Encrypt(const uint8_t* blk, uint8_t* out_blk);
 
const unsigned char Pi[8][16] = {
    {12,4,6,2,10,5,11,9,14,8,13,7,0,3,15,1},
    {6,8,2,3,9,10,5,12,1,14,4,7,11,13,0,15},
    {11,3,5,8,2,15,10,13,14,1,7,4,12,9,6,0},
    {12,8,2,1,13,4,15,6,7,0,10,5,3,14,9,11},
    {7,15,5,10,8,1,6,13,0,9,3,14,11,4,2,12},
    {5,13,15,6,9,2,12,10,11,7,8,1,4,3,14,0},
    {8,14,2,5,6,9,1,12,15,4,11,0,13,10,3,7},
    {1,7,14,13,0,5,8,3,4,15,10,6,9,12,11,2}
};
 
const unsigned char key[32] = {
    0xff, 0xee, 0xdd, 0xcc,
    0xbb, 0xaa, 0x99, 0x88,
    0x77, 0x66, 0x55, 0x44,
    0x33, 0x22, 0x11, 0x00,
    0xf0, 0xf1, 0xf2, 0xf3,
    0xf4, 0xf5, 0xf6, 0xf7,
    0xf8, 0xf9, 0xfa, 0xfb,
    0xfc, 0xfd, 0xfe, 0xff
};
 
const unsigned char encrypt_test_string[8] = {
    0x10, 0x32, 0x54, 0x76, 0x98, 0xba, 0xdc, 0xfe
};
 
int main(void) {
    setlocale(LC_ALL, "ru");
 
    {
        string str;
 
        ifstream in("open.txt");
        if (in.is_open()) {
            while (getline(in, str)) {
                cout << "Данные из файла считаны: " << str << endl;
 
            }
        }
        in.close();
        
        const unsigned char* buffer = reinterpret_cast<const unsigned char*>(str.c_str());
 
        KeyRounds(key);
        cout << endl << "Итерационные шифр ключи:" << endl;
        for (int i = 0; i < 32; i++) {
            printf("K%d=", i + 1);
            PrintBytes(key_iteracial[i], 4);
        }
 
        uint8_t out_blk[4];
        Encrypt(encrypt_test_string, out_blk);
    }
    cin.get();
    return 0;
}
 
void PrintBytes(const uint8_t* data, size_t length) {
    for (size_t i = 0; i < length; i++) {
        printf("%02x", data[i]);
    }
    cout << endl;
}
 
void KeyRounds(const uint8_t* key) {
     for (int i = 0, k = 0; i < 24; ++i)
     {
        k = k % 32;
        for (int j = 0; j < 4; ++j)
            key_iteracial[i][j] = key[k++];
     }
     for (int i = 24, k = 7; i < 32; ++i, --k)
     {
        for (int j = 0; j < 4; ++j)
            key_iteracial[i][j] = key[k * 4 + j];
     }
    }
 
void G(const uint8_t* k, const uint8_t* a, uint8_t* out_data) {
    uint8_t a_0[4]; //Правая половина блока
    uint8_t a_1[4]; //Левая половина блока
    uint8_t G[4];
    int i;
    for (i = 0; i < 4; i++) //Делим исходный блок на две части
    {
        a_1[i] = a[4 + i];
        a_0[i] = a[i];
    }
    g(k, a_0, G); //Преобразование g
    Add(a_1, G, G); //Результат преобразования g и XOR c левой половиной блока
    for (i = 0; i < 4; i++)
    {
        a_1[i] = a_0[i]; //Пишем в левую половину значение правого блока
        a_0[i] = G[i]; //Пишем результат Magma_Add в правую половину блока
    }
    for (i = 0; i < 4; i++) //Сводим правую и левую части блока в одно целое
    {
        out_data[i] = a_0[i];
        out_data[4 + i] = a_1[i];
    }
    cout << endl; cout << "g" << endl;
    PrintBytes(out_data, 8);
}
 
void g(const uint8_t* k, const uint8_t* a, uint8_t* out_data) {
    uint8_t internal[4];
    uint32_t out_data_32;
 
    AddMod32(a, k, internal); //Складываем по модулю 32 правую половину блока с итерационным ключом
    Transform_T(internal, internal); //Производим нелинейное биективное преобразование результата
 
    out_data_32 = internal[3]; //Преобразовываем четырехбайтный вектор в одно 32-битное число
    out_data_32 = (out_data_32 << 8) + internal[2];
    out_data_32 = (out_data_32 << 8) + internal[1];
    out_data_32 = (out_data_32 << 8) + internal[0];
    out_data_32 = (out_data_32 << 11) | (out_data_32 >> 21); //Циклически сдвигаем все влево на 11 разрядов
 
    out_data[3] = out_data_32; //Преобразовываем 32-битный результат сдвига обратно в 4-байтовый вектор
    out_data[2] = out_data_32 >> 8;
    out_data[1] = out_data_32 >> 16;
    out_data[0] = out_data_32 >> 24;
 
    cout << endl; cout << "g" << endl;
    PrintBytes(out_data, 8);
}
 
void Add(const uint8_t* a, const uint8_t* b, uint8_t* c) {
    int i;
    for (i = 0; i < 4; i++) //Размер блока 4 байта (или 32 бита)
        c[i] = a[i] ^ b[i]; //Конъюнкция с двумя блоками
    cout << endl; cout << "Add" << endl;
    PrintBytes(c, 8);
}
 
void AddMod32(const uint8_t* a, const uint8_t* b, uint8_t* c) {
    int i;
    unsigned int internal = 0;
    for (i = 0; i < 4; i++)
    {
        internal = a[i] + b[i] + (internal >> 8);
        c[i] = internal & 0xff;
    }
    cout << endl; cout << "AddMod32" << endl;
    PrintBytes(c, 8);
}
 
void Transform_T(const uint8_t* in_data, uint8_t* out_data) {
    uint8_t first_part_byte, sec_part_byte;
    int i;
    for (i = 0; i < 4; i++)
    {
        first_part_byte = (in_data[i] & 0x0f) >> 4; //Извлекаем первую 4-битную часть байта
        sec_part_byte = (in_data[i] & 0xf0); //Извлекаем вторую 4-битную часть байта
        first_part_byte = Pi[i * 2][first_part_byte];
        sec_part_byte = Pi[i * 2 + 1][sec_part_byte];
        out_data[i] = (first_part_byte << 4) | sec_part_byte; //Склеиваем обе 4-битные части обратно в байт
    }
    cout << endl; cout << "Transform_T" << endl;
    PrintBytes(out_data, 8);
}
 
void FinalG(const uint8_t* k, const uint8_t* a, uint8_t* out_data) {
    uint8_t a_0[4]; //Правая половина блока
    uint8_t a_1[4]; //Левая половина блока
    uint8_t G[4];
    int i;
    for (i = 0; i < 4; i++) //Делим 64-битный исходный блок на две части
    {
        a_1[i] = a[4 + i];
        a_0[i] = a[i];
    }
    g(k, a_0, G); //Производим преобразование g
    Add(a_1, G, G); //Результат преобразования g и XOR c левой половиной блока
    for (i = 0; i < 4; i++) //Пишем результат Magma_Add в левую половину блока
        a_1[i] = G[i];
    for (i = 0; i < 4; i++) //Сводим правую и левую части блока в одно целое
    {
        out_data[i] = a_0[i];
        out_data[4 + i] = a_1[i];
    }
    cout << endl; cout << "FinalG" << endl;
    PrintBytes(out_data, 8);
}
 
void Encrypt(const uint8_t* blk, uint8_t* out_blk) {
    int i;
    G(key_iteracial[0], blk, out_blk);  //Первое преобразование G
    for (i = 1; i < 31; i++) //Последующие (со 2 по 31) преобразования G
    G(key_iteracial[i], out_blk, out_blk);
    FinalG(key_iteracial[31], out_blk, out_blk); //Последнее (32) преобразование G
 
    cout << endl; cout << "Зашифрованный текст:" << endl;
    PrintBytes(out_blk, 8);
 
    ofstream out("encrypt.txt");
    if (out.is_open()) {
        out.write(reinterpret_cast<const char*>(out_blk), 8);
        out.close();
    }
    else {
        cerr << "Ошибка при создании файла encrypt.txt" << endl;
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.08.2023, 21:25
Ответы с готовыми решениями:

Преобразование типа или преобразование типа указателя ?
Добрый день. Помогите пожалуйста понять что делает вот эта команда: out.write ((char *) &amp;n, sizeof n); Она что, перед записью в...

Преобразование
О каком преобразовании идет речь в строке 34, если конструктор принимает тип double и аргумент (10.0) записывается в double dReal? // ...

Преобразование С++
Не знаю как разрулить один ньюанс. Есть динамический массив симолов.(char mass=new char; ) Есть динамический массив даблов.(double...

3
Заблокирован
15.08.2023, 00:34
Лучший ответ Сообщение было отмечено Tessay как решение

Решение

Цитата Сообщение от Tessay Посмотреть сообщение
Преобразование G
Я немного смотрел по документации, там коптить и коптить.
Там же разбито все по этапах. Вот эти мелкие этапы тестируйте каждую в отдельности.

Для других, адрес с алгоритмом шифрования "Блочны шифры" (5.2 Преобразования)
Где мог ошибиться, что зашифрованный текст компилируется другой

Добавлено через 3 часа 2 минуты
Tessay, ВСЕ преобразования проверил.
У вас ошибка в исходном Ключе. key

Я взял из примера, и все сходится. (Попутно большую часть переписал)
BlockCrypt64.cpp - функции преобразования
Кликните здесь для просмотра всего текста
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
#include <cstdint>
using i32 = std::uint32_t;
using i64 = std::uint64_t;
 
unsigned char Pi[8][16] =
{
    {12,4,6,2,10,5,11,9,14,8,13,7,0,3,15,1},
    {6,8,2,3,9,10,5,12,1,14,4,7,11,13,0,15},
    {11,3,5,8,2,15,10,13,14,1,7,4,12,9,6,0},
    {12,8,2,1,13,4,15,6,7,0,10,5,3,14,9,11},
    {7,15,5,10,8,1,6,13,0,9,3,14,11,4,2,12},
    {5,13,15,6,9,2,12,10,11,7,8,1,4,3,14,0},
    {8,14,2,5,6,9,1,12,15,4,11,0,13,10,3,7},
    {1,7,14,13,0,5,8,3,4,15,10,6,9,12,11,2}
};
// Key = ffeeddcc bbaa9988 77665544 33221100 f0f1f2f3 f4f5f6f7 f8f9fafb fcfdfeff.
i32 key[8] = 
{
    0xffeeddcc,
    0xbbaa9988,
    0x77665544,
    0x33221100,
    0xf0f1f2f3,
    0xf4f5f6f7,
    0xf8f9fafb,
    0xfcfdfeff
};
 
i32 key_iteracial[32];
 
void init(){
    for(int i = 0; i != 24; )
        for(int k = 0; k != 8; ++k)
            key_iteracial[i++] = key[k];
    for(int i = 24; i != 32; )
        for(int k = 7; k>=0; --k)
            key_iteracial[i++] = key[k];
}
 
i32 t(i32 dw){
    i32 res;
    uint8_t first_part_byte, sec_part_byte;
    int i;
    uint8_t *in_data = (uint8_t*)&dw;
    uint8_t *out_data = (uint8_t*)&res;
    for (i = 0; i < 4; i++)
    {
        first_part_byte = (in_data[i] & 0x0f); //Извлекаем первую 4-битную часть байта
        sec_part_byte = (in_data[i] & 0xf0) >> 4; //Извлекаем вторую 4-битную часть байта
        first_part_byte = Pi[i * 2][first_part_byte]; //Выполняем замену в соответствии с таблицей подстановок
        sec_part_byte = Pi[i * 2 + 1][sec_part_byte];
        out_data[i] = (sec_part_byte << 4) | first_part_byte; //Склеиваем обе 4-битные части обратно в байт
    }
    return res;
}
 
//Сложение в кольце вычетов по модулю 2 в степени 32
void Magma_Add_32(const uint8_t* a, const uint8_t* b, uint8_t* c) 
{
    int i;
    unsigned int internal = 0;
    for (i = 0; i < 4; i++)
    {
        internal = a[i] + b[i] + (internal >> 8);
        c[i] = internal & 0xff;
    }
}
 
i32 g(i32 k, i32 a){
    uint32_t out_data_32;
    i32 res;
    Magma_Add_32((uint8_t*)&a, (uint8_t*)&k, (uint8_t*)&res); //Складываем по модулю 32 правую половину блока с итерационным ключом
    res = t(res); //Производим нелинейное биективное преобразование результата
    return (res << 11) | (res >> 21); //Циклически сдвигаем все влево на 11 разрядов
}
 
    
i32 G(i32 k, i32 a1, i32 a0){
    return g(k, a0) ^ a1;
}


test.cpp - тесты функций преобразований
Кликните здесь для просмотра всего текста
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
#include "BlockCrypt64.cpp"
#include <iostream>
#include <iomanip>
#include <set>
#include <string>
using std::cout; using std::endl;
// using std::hex; using std::setfill; using std::setw;
std::ostream& hex(std::ostream& out){
    return out << std::hex << std::setfill('0') << std::setw(8);
}
int main(){
    const std::set<std::string> test_set{"Keys", "t", "g", "G", "G_with_Keys"};
    // const std::set<std::string> test_set{"G"};
    init();
    if (test_set.count("Keys"))
    {   // itaration keys
        // itaration keys
        cout << "1. View itaration keys : " << endl;
        for(int i = 0; i!=32; ++i)
            hex(cout) << key_iteracial[i] << endl;
        cout << endl;
        // passed
    }
    if (test_set.count("t"))
    {   // transforming 't' 
        enum TestT{Input, Result};
        i32 data_test[4][2] {
            {0xfdb97531, 0x2a196f34},
            {0x2a196f34, 0xebd9f03a},
            {0xebd9f03a, 0xb039bb3d},
            {0xb039bb3d, 0x68695433},
        };
        cout << "Test transformation \'t\' : " << endl;
        for (int i = 0; i != 4; ++i){
            auto res = t(data_test[i][Input]);
            cout << "Test " << i << " : " 
                 << ( (data_test[i][Result] == res) ? "passed" : "fail" )
                 << endl;
            hex(cout) << data_test[i][Result];
            cout << " <-> ";
            hex(cout) << res << endl;
        }
        cout << endl;
        // passed
    }
    if (test_set.count("g"))
    {   // transforming 'g'
        enum Testg{Key, Input, Result};
        i32 data_test[4][3] {
            {0x87654321, 0xfedcba98, 0xfdcbc20c},
            {0xfdcbc20c, 0x87654321, 0x7e791a4b},
            {0x7e791a4b, 0xfdcbc20c, 0xc76549ec},
            {0xc76549ec, 0x7e791a4b, 0x9791c849},
        };
        cout << "Test transformation \'g\' : " << endl;
        for (int i = 0; i != 4; ++i){
            auto res = g(data_test[i][Key], data_test[i][Input]);
            cout << "Test " << i << " : " 
                 << ( (data_test[i][Result] == res) ? "passed" : "fail" )
                 << endl;
            hex(cout) << data_test[i][Result];
            cout << " <-> ";
            hex(cout) << res << endl;
        }
        cout << endl;
        // passed
    }
    if (test_set.count("G"))
    {   // transforming 'G'
        enum TestG{Key, InputA1, InputA0, Result};
        i32 data_test[4][4] {
            {0xffeeddcc, 0xfedcba98, 0x76543210, 0x28da3b14},
            {0xbbaa9988, 0x76543210, 0x28da3b14, 0xb14337a5},
            {0x77665544, 0x28da3b14, 0xb14337a5, 0x633a7c68},
            {0x33221100, 0xb14337a5, 0x633a7c68, 0xea89c02c},
        };
        cout << "Test transformation \'G\' : " << endl;
        for (int i = 0; i != 4; ++i){
            auto res = G(data_test[i][Key], data_test[i][InputA1], data_test[i][InputA0]);
            cout << "Test " << i << " : " 
                 << ( (data_test[i][Result] == res) ? "passed" : "fail" )
                 << endl;
            hex(cout) << data_test[i][Result];
            cout << " <-> ";
            hex(cout) << res << endl;
        }
        cout << endl;
        // passed
    }
    
    if (test_set.count("G_with_Keys"))
    {   // transforming 'G'
        enum TestG{InputA1, InputA0, Result};
        i32 data_test[4][3] {
            {0xfedcba98, 0x76543210, 0x28da3b14},
            {0x76543210, 0x28da3b14, 0xb14337a5},
            {0x28da3b14, 0xb14337a5, 0x633a7c68},
            {0xb14337a5, 0x633a7c68, 0xea89c02c},
        };
        cout << "Test transformation \'G\' : " << endl;
        for (int i = 0; i != 4; ++i){
            auto res = G(key_iteracial[i], data_test[i][InputA1], data_test[i][InputA0]);
            cout << "Test " << i << " : " 
                 << ( (data_test[i][Result] == res) ? "passed" : "fail" )
                 << endl;
            hex(cout) << data_test[i][Result];
            cout << " <-> ";
            hex(cout) << res << endl;
        }
        cout << endl;
        // passed
    }
}


Результат всех тестов :
Кликните здесь для просмотра всего текста
Code
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
1. View itaration keys :
ffeeddcc
bbaa9988
77665544
33221100
f0f1f2f3
f4f5f6f7
f8f9fafb
fcfdfeff
ffeeddcc
bbaa9988
77665544
33221100
f0f1f2f3
f4f5f6f7
f8f9fafb
fcfdfeff
ffeeddcc
bbaa9988
77665544
33221100
f0f1f2f3
f4f5f6f7
f8f9fafb
fcfdfeff
fcfdfeff
f8f9fafb
f4f5f6f7
f0f1f2f3
33221100
77665544
bbaa9988
ffeeddcc
 
Test transformation 't' :
Test 0 : passed
2a196f34 <-> 2a196f34
Test 1 : passed
ebd9f03a <-> ebd9f03a
Test 2 : passed
b039bb3d <-> b039bb3d
Test 3 : passed
68695433 <-> 68695433
 
Test transformation 'g' :
Test 0 : passed
fdcbc20c <-> fdcbc20c
Test 1 : passed
7e791a4b <-> 7e791a4b
Test 2 : passed
c76549ec <-> c76549ec
Test 3 : passed
9791c849 <-> 9791c849
 
Test transformation 'G' :
Test 0 : passed
28da3b14 <-> 28da3b14
Test 1 : passed
b14337a5 <-> b14337a5
Test 2 : passed
633a7c68 <-> 633a7c68
Test 3 : passed
ea89c02c <-> ea89c02c
 
Test transformation 'G' :
Test 0 : passed
28da3b14 <-> 28da3b14
Test 1 : passed
b14337a5 <-> b14337a5
Test 2 : passed
633a7c68 <-> 633a7c68
Test 3 : passed
ea89c02c <-> ea89c02c


Итого. вам осталось сделать один цикл, цепочку преобразований.
3
 Аватар для Tessay
0 / 0 / 0
Регистрация: 22.12.2022
Сообщений: 33
15.08.2023, 09:08  [ТС]
ошибка в key, что не написал в little endian?

Добавлено через 20 минут
SmallEvil, благодарю Вас, добрый человек!
Понял свою ошибку.
0
Заблокирован
15.08.2023, 12:18
Лучший ответ Сообщение было отмечено Tessay как решение

Решение

Цитата Сообщение от Tessay Посмотреть сообщение
ошибка в key, что не написал в little endian?
Ошибка в том что вы именно привязываетесь к endian.
Естественно что при входных данных, ключа, какими они ни были, массив, строка, вы знаете где младший байт а где старший.
Его заранее подготавливать не нужно.
Ключевой момент, именно в алгоритме его развертывания.

Думаю , код ниже, да и представленный мною выше, привязан к Little endian memory model.

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
#include <iostream>
#include <iomanip>
#include <cstdint>
 
using std::cout; using std::endl;
// using std::hex; using std::setfill; using std::setw;
std::ostream& hex(std::ostream& out){
    return out << std::hex << std::setfill('0') << std::setw(8);
}
 
int main()
{
    unsigned int i = 1;
    char *c = (char*)&i;
    if (*c)
        cout<<"Little endian\n";
    else
        cout<<"Big endian\n";
 
    uint8_t key[32] = {
        0xff, 0xee, 0xdd, 0xcc, 
        0xbb, 0xaa, 0x99, 0x88,
        0x77, 0x66, 0x55, 0x44, 
        0x33, 0x22, 0x11, 0x00,
        0xf0, 0xf1, 0xf2, 0xf3,
        0xf4, 0xf5, 0xf6, 0xf7,
        0xf8, 0xf9, 0xfa, 0xfb,
        0xfc, 0xfd, 0xfe, 0xff,
    };
    uint32_t key_iteracial[32];
    for(int i = 0; i != 24; )
        for(int k = 0; k != 8; ++k){
            uint8_t* pk = (uint8_t*)&key_iteracial[i++];
            *pk++ = key[k*4+3];
            *pk++ = key[k*4+2];
            *pk++ = key[k*4+1];
            *pk++ = key[k*4+0];
        }
    for(int i = 24; i != 32; )
        for(int k = 7; k>=0; --k){
            uint8_t* pk = (uint8_t*)&key_iteracial[i++];
            *pk++ = key[k*4+3];
            *pk++ = key[k*4+2];
            *pk++ = key[k*4+1];
            *pk++ = key[k*4+0];
        }
    
    cout << "View itaration keys : " << endl;
    for(int i = 0; i!=32; ++i)
        hex(cout) << key_iteracial[i] << endl;
    cout << endl;
}
Добавлено через 2 минуты
p.s. Вот если бы можно было протестировать на разных memory model.

Добавлено через 3 минуты
Цитата Сообщение от Tessay Посмотреть сообщение
const unsigned char key[32] = {
    0xff, 0xee, 0xdd, 0xcc,
    0xbb, 0xaa, 0x99, 0x88,
    0x77, 0x66, 0x55, 0x44,
    0x33, 0x22, 0x11, 0x00,
    0xf0, 0xf1, 0xf2, 0xf3,
    0xf4, 0xf5, 0xf6, 0xf7,
    0xf8, 0xf9, 0xfa, 0xfb,
    0xfc, 0xfd, 0xfe, 0xff
};
Кстати, я ориентировался на старый ваш ключ, он был в другом порядке...
Тут я уже запутался.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.08.2023, 12:18
Помогаю со студенческими работами здесь

преобразование
Господа как преобразовать из LPTSTR в - LPCTSTR

Преобразование из С в С++
Нужно преобразовать данный код в С++. #include &lt;stdio.h&gt; #include &lt;conio.h&gt; int i,j, n, nsqr, q; int dx, dy, h; void...

Преобразование +'0'
Приветствую. Возможно кто-то сможет объяснить почему так получается : ) Нужно было создать шаблон функции. Которая будет находить...

Преобразование
есть переменная чар. есть куча переменных типа инт. int a,b,c,d,e.. как сделать чтобы при вызове cout&lt;&lt;char c; этот чар...

С++ преобразование типов
Есть переменная целочисленного типа например int A(например 2356).Нужно преобразовать ее к типу LPTCSTR и передать ее WinAPI функции...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru