- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
// https://habr.com/ru/post/451830/ Кратко с реализацией о AES 128 ECB
// ...
byte_t hex(char ch) { return (ch - '0') % 39; }
byte_t sbox(byte_t x, bool decrypt = false) {
std::string s = (decrypt ? INV_SBOX : SBOX)[x >> 4][x & 15];
return hex(s[0]) << 4 | hex(s[1]);
}
byte_t mult_by_2(byte_t x) { return (x < 128) ? x << 1 : (x << 1 & 0xff) ^ 0x1b; }
byte_t mult_by_8(byte_t x) { return mult_by_2(mult_by_2(mult_by_2(x))); }
const std::unordered_map<byte_t, std::function<byte_t(byte_t)>> mapper = {
{0x1, [](byte_t x) { return x; }},
{0x2, mult_by_2},
{0x3, [](byte_t x) { return mult_by_2(x) ^ x; }},
{0x9, [](byte_t x) { return mult_by_8(x) ^ x; }},
{0xb, [](byte_t x) { return mult_by_8(x) ^ mult_by_2(x) ^ x; }},
{0xd, [](byte_t x) { return mult_by_8(x) ^ mult_by_2(mult_by_2(x)) ^ x; }},
{0xe, [](byte_t x) { return mult_by_8(x) ^ mult_by_2(mult_by_2(x)) ^ mult_by_2(x); }},
};
byte_t vector_mult(const std::array<byte_t, 4>& v1, std::array<byte_t, 4>&& v2) {
std::transform(begin(v1), end(v1), begin(v2), begin(v2),
[](byte_t x, byte_t y) { return mapper.at(y)(x); });
return std::accumulate(begin(v2), end(v2), byte_t(0), std::bit_xor<byte_t>());
}
const std::vector<std::vector<std::string>> SBOX = { // блядь сука долбоеб нахуя это так делать?
{ "63", "7c", "77", "7b", "f2", "6b", "6f", "c5", "30", "01", "67", "2b", "fe", "d7", "ab", "76" },
{ "ca", "82", "c9", "7d", "fa", "59", "47", "f0", "ad", "d4", "a2", "af", "9c", "a4", "72", "c0" },
{ "b7", "fd", "93", "26", "36", "3f", "f7", "cc", "34", "a5", "e5", "f1", "71", "d8", "31", "15" },
{ "04", "c7", "23", "c3", "18", "96", "05", "9a", "07", "12", "80", "e2", "eb", "27", "b2", "75" },
{ "09", "83", "2c", "1a", "1b", "6e", "5a", "a0", "52", "3b", "d6", "b3", "29", "e3", "2f", "84" },
// ...
j123123 16.01.2020 19:38 # +3
Поинт статьи — показать как можно нагородить на ровном месте какого-то тупого и бессмысленного крестодерьма.
bormand 16.01.2020 19:52 # +8
Противодействие атакам, которым подвержены наивные реализации AES. Пока строка скопируется да распарсится - уже все тайминги размыты и кеш засран.
gost 16.01.2020 20:17 # +4
> byte_t hex(char ch)
Сука, SBOX в строках хранить не лень, а лишний раз нажать кнопочки и дать адекватное название функции — не лень.
> return (ch - '0') % 39
Ой бля.
> [x >> 4][x & 15]
Почему, сука, 15? Неужели так трудно писать так, чтобы тебя понимали? «x & 0x0F» — и сразу становится понятно, что автор имел в виду.
> mult_by_2
Ну вот, более-менее адекватное название функции!
> return (x < 128) ? x << 1 : (x << 1 & 0xff) ^ 0x1b;
…чо, бля?
> const std::unordered_map<byte_t, std::function<byte_t(byte_t)>>
Ебать нахуй ебать!..
> mapper
Какое точное и информативное название.
> const std::array<byte_t, 4>
Я такое пишу когда мне хочется повыёбываться и высрать максимально запутанное крестоговно. А автору норм.
> && v2
Знакомые симптомы: аффтар где-то вычитал, что двойные амперсанды быстрее одинарных, и теперь везде их суёт, совершенно не понимая, что это и зачем оно нужно. Ничего не напоминает?
> begin(v1), end(v1), begin(v2), begin(v2)
Именно поэтому я против «begin(STL), end(STL)».
> [](byte_t x, byte_t y) { return mapper.at(y)(x); }
«Как проебать любые оптимизации и написать тормозное говно, том 7».
> const std::vector<std::vector<std::string>> SBOX
Пизде-е-е-е-е-е-е-ец. Ну хоть бы std::array, блядь!..
Тупое говно тупого дебила.
HoBorogHuu_nemyx 16.01.2020 20:28 # +3
Кокококой скилл )))
Если ch > '9', то из кода заглавных букв нужно дополнительно вычесть 7, а из кода строчных — 7 + 32 = 39, чтобы перевести 'a'...'f' в 10...15.
Код с задачей преобразования строчных 16-ричных символов в число справляется. Только обычный человек до операции взятия остатка не додумается.
HoBorogHuu_nemyx 16.01.2020 20:48 # +2
Ну или если считать char беззнаковым, то несколько первых строчек будут выглядеть так:
1024-- 16.01.2020 20:41 # +1
> Именно поэтому я против «begin(STL), end(STL)».
У них же уже есть initializer list, variadic templates и ещё какая-то питушня с распаковкой массивов зачаточным паттерн матчингом вылупляется.
Почему бы тогда не сделать operator argument_list?
Для ко-ко-контейнеров он бы возвращал {begin(xs), end(xs)} и прозрачно вставлялся.
Было бы так (при условии, что код std::transform никак не поменялся:
gost 16.01.2020 20:47 # +2
А теперь, вон, всё переводят на «ranges», потому что внезапно оказалось, что никто (кроме сумасшедших) не любит писать тонну вербозного говна для выражения элементарных действий.
AnalBoy 17.01.2020 01:05 # 0
bootcamp_dropout 16.01.2020 20:47 # +2
>> [](byte_t x, byte_t y) { return mapper.at(y)(x); }
Ахаха
Я в js тоже так пишу когда накатывается ненависть к switch
j123123 16.01.2020 21:14 # +1
То ли дело PHP - там массив это ordered map
bormand 16.01.2020 21:53 # 0
Умножение на 2 в поле галуа, очевидно же.
HoBorogHuu_nemyx 16.01.2020 21:54 # 0
gost 16.01.2020 22:19 # +2
Fike 16.01.2020 22:42 # 0
0x1b чем-то отличается от 0x1?
bormand 17.01.2020 06:46 # 0
1024-- 17.01.2020 09:20 # 0
27
bormand 17.01.2020 10:59 # 0
3.14159265 17.01.2020 15:41 # 0
N_BCE_3ACMERJINCb 17.01.2020 18:53 # 0
gostinho 18.01.2020 23:30 # 0
1024-- 19.01.2020 01:03 # 0
HoBorogHuu_nemyx 17.01.2020 10:11 # 0
Fike 17.01.2020 12:11 # 0
3.14159265 17.01.2020 15:50 # +3
Причём это не только сишка, а кресты, ява, шарп и жс.
HoBorogHuu_nemyx 17.01.2020 16:14 # +2
bormand 17.01.2020 16:16 # 0
bootcamp_dropout 17.01.2020 16:19 # 0
Бтв, твой пример отработает корректно и "0х80" будет шестнадцатеричным числом
Koko 19.01.2020 02:05 # +2
gost 17.01.2020 17:30 # +2
Кстати, то ли в «C++17», то ли в «C++20» эти восьмеричные литералы убрали к херам. Именно поэтому…
3.14159265 17.01.2020 17:45 # +3
>Кстати, то ли в «C++17», то ли в «C++20» эти восьмеричные литералы убрали к херам
Хаха. То есть кресты настолько дно, что старые сишные программы в них работать уже не будут?
Или хуже того: 0016 станет интепретироваться правильно, как 16. И поведение программы изменится.
>Нафига вообще эта дрисня восьмеричная нужна?
Вопрос в другом.
Зачем это древнее говно 70х было тянуть в относительно новые языки яву, жс, шарп и пхп?
Царь был прав: всё воруют из сишки, даже восьмеричное хукирское говно и то своровали, сидят дрочат и обмазываются.
gostinho 18.01.2020 15:33 # 0
bormand 17.01.2020 18:06 # +1
Ещё инструкции PDP-11 удобно было составлять.
N_BCE_3ACMERJINCb 17.01.2020 18:54 # 0
a
r
AnalBoy 17.01.2020 19:29 # 0
Кстати, видел у одного прогера крутую майку - God-the fucker
Там шлюха дрочит крестом.
inkanus_gray 18.01.2020 00:25 # 0
AnalBoy 18.01.2020 00:45 # −1
1024-- 18.01.2020 20:35 # +2
Konardyan 18.01.2020 21:11 # 0
Konardyan 16.01.2020 20:21 # 0
hormand 16.01.2020 20:33 # +1
gostinho 16.01.2020 21:51 # 0
Хуле вы доебались, пидорашки?
HoBorogHuu_nemyx 16.01.2020 21:55 # +2
AnalBoy 17.01.2020 01:05 # 0
phpBidlokoder2 16.01.2020 23:39 # 0
phpBidlokoder2 16.01.2020 23:41 # 0