re1
src
#include <iostream>
#include <algorithm>
#include <list>
using namespace std;
static const string flag = "flag{d2fbe6e547afe2f46a1723e9fb4c443d}";
int main(int argc, char* argv[])
{
std::list<char> res{};
char input[0x100] = { 0 };
cout << "flag:";
cin >> input;
std::copy_if(flag.begin(),flag.end(),std::back_inserter(res),[&, i = 0](auto x) mutable
{
return x == input[i++];
});
cout << (res.size() == flag.size() ? "true" : "false");
}
re2
src
#include <iostream>
#include <algorithm>
#include <list>
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable : 4996)
using namespace std;
int main()
{
const string flag = "666C61677B38303865306337363339393330313734666231633862313065373236346332617D";
char input[0x100] = {0};
cout << "flag:";
cin >> input;
cout << (flag == [](const string& str)
{
#define ToHex(x) ((x) > 9 ? (x) + 55 : (x) + 48)
auto s = str.c_str();
auto res = new char[str.length() * 2];
auto _res = res;
const auto end = s + str.length();
for (; s < end; ++s)
{
*res++ = ToHex(static_cast<uint8_t>(*s) >> 4);
*res++ = ToHex(static_cast<uint8_t>(*s) % 16);
}
*res = 0;
auto r = std::string(_res);
delete[] _res;
return r;
}(input)
? "true"
: "false");
}
re3
src
class IceSubkey
{
public:
unsigned long val[3];
};
static unsigned long ice_sbox[4][1024];
static int ice_sboxes_initialised = 0;
static const int ice_smod[4][4] = {
{333, 313, 505, 369},
{379, 375, 319, 391},
{361, 445, 451, 397},
{397, 425, 395, 505}
};
static const int ice_sxor[4][4] = {
{0x83, 0x85, 0x9b, 0xcd},
{0xcc, 0xa7, 0xad, 0x41},
{0x4b, 0x2e, 0xd4, 0x33},
{0xea, 0xcb, 0x2e, 0x04}
};
static const unsigned long ice_pbox[32] = {
0x00000001, 0x00000080, 0x00000400, 0x00002000,
0x00080000, 0x00200000, 0x01000000, 0x40000000,
0x00000008, 0x00000020, 0x00000100, 0x00004000,
0x00010000, 0x00800000, 0x04000000, 0x20000000,
0x00000004, 0x00000010, 0x00000200, 0x00008000,
0x00020000, 0x00400000, 0x08000000, 0x10000000,
0x00000002, 0x00000040, 0x00000800, 0x00001000,
0x00040000, 0x00100000, 0x02000000, 0x80000000
};
static const int ice_keyrot[16] = {
0, 1, 2, 3, 2, 1, 3, 0,
1, 3, 2, 0, 3, 1, 0, 2
};
static unsigned int gf_mult(unsigned int a, unsigned int b, unsigned int m)
{
unsigned int res = 0;
while (b)
{
if (b & 1)
res ^= a;
a <<= 1;
b >>= 1;
if (a >= 256)
a ^= m;
}
return res;
}
static unsigned long gf_exp7(const unsigned int b, const unsigned int m)
{
if (b == 0)
return (0);
auto x = gf_mult(b, b, m);
x = gf_mult(b, x, m);
x = gf_mult(x, x, m);
return (gf_mult(b, x, m));
}
static unsigned long IcePerm32(unsigned long x)
{
unsigned long res = 0;
auto pbox = ice_pbox;
while (x)
{
if (x & 1)
res |= *pbox;
pbox++;
x >>= 1;
}
return res;
}
static void ice_sboxes_init()
{
for (auto i = 0; i < 1024; i++)
{
const auto col = (i >> 1) & 0xff;
const auto row = (i & 0x1) | ((i & 0x200) >> 8);
auto x = gf_exp7(col ^ ice_sxor[0][row], ice_smod[0][row]) << 24;
ice_sbox[0][i] = IcePerm32(x);
x = gf_exp7(col ^ ice_sxor[1][row], ice_smod[1][row]) << 16;
ice_sbox[1][i] = IcePerm32(x);
x = gf_exp7(col ^ ice_sxor[2][row], ice_smod[2][row]) << 8;
ice_sbox[2][i] = IcePerm32(x);
x = gf_exp7(col ^ ice_sxor[3][row], ice_smod[3][row]);
ice_sbox[3][i] = IcePerm32(x);
}
}
static unsigned long IceF(const unsigned long p, const IceSubkey* sk)
{
const auto tl = p >> 16 & 0x3ff | (p >> 14 | p << 18) & 0xffc00;
const auto tr = p & 0x3ff | p << 2 & 0xffc00;
auto al = sk->val[2] & (tl ^ tr);
auto ar = al ^ tr;
al ^= tl;
al ^= sk->val[0];
ar ^= sk->val[1];
return (ice_sbox[0][al >> 10] | ice_sbox[1][al & 0x3ff]
| ice_sbox[2][ar >> 10] | ice_sbox[3][ar & 0x3ff]);
}
class IceKey
{
public:
explicit IceKey(const int n)
{
if (!ice_sboxes_initialised)
{
ice_sboxes_init();
ice_sboxes_initialised = 1;
}
if (n < 1)
{
_size = 1;
_rounds = 8;
}
else
{
_size = n;
_rounds = n * 16;
}
_keysched = new IceSubkey[_rounds];
}
~IceKey()
{
for (auto i = 0; i < _rounds; i++) for (auto j = 0; j < 3; j++) _keysched[i].val[j] = 0;
_rounds = _size = 0;
delete[] _keysched;
}
void Set(const unsigned char* key) const
{
int i;
if (_rounds == 8)
{
unsigned short kb[4];
for (i = 0; i < 4; i++)
kb[3 - i] = (key[i * 2] << 8) | key[i * 2 + 1];
ScheduleBuild(kb, 0, ice_keyrot);
return;
}
for (i = 0; i < _size; i++)
{
unsigned short kb[4];
for (auto j = 0; j < 4; j++) kb[3 - j] = key[i * 8 + j * 2] << 8 | key[i * 8 + j * 2 + 1];
ScheduleBuild(kb, i * 8, ice_keyrot);
ScheduleBuild(kb, _rounds - 8 - i * 8, &ice_keyrot[8]);
}
}
void Encrypt(const unsigned char* ptext, unsigned char* ctext) const
{
int i;
auto l = static_cast<unsigned long>(ptext[0]) << 24
| static_cast<unsigned long>(ptext[1]) << 16
| static_cast<unsigned long>(ptext[2]) << 8 | ptext[3];
auto r = static_cast<unsigned long>(ptext[4]) << 24
| static_cast<unsigned long>(ptext[5]) << 16
| static_cast<unsigned long>(ptext[6]) << 8 | ptext[7];
for (i = 0; i < _rounds; i += 2)
{
l ^= IceF(r, &_keysched[i]);
r ^= IceF(l, &_keysched[i + 1]);
}
for (i = 0; i < 4; i++)
{
ctext[3 - i] = r & 0xff;
ctext[7 - i] = l & 0xff;
r >>= 8;
l >>= 8;
}
}
void Decrypt(const unsigned char* ctext, unsigned char* ptext) const
{
int i;
auto l = static_cast<unsigned long>(ctext[0]) << 24
| static_cast<unsigned long>(ctext[1]) << 16
| static_cast<unsigned long>(ctext[2]) << 8 | ctext[3];
auto r = (static_cast<unsigned long>(ctext[4]) << 24)
| (static_cast<unsigned long>(ctext[5]) << 16)
| (static_cast<unsigned long>(ctext[6]) << 8) | ctext[7];
for (i = _rounds - 1; i > 0; i -= 2)
{
l ^= IceF(r, &_keysched[i]);
r ^= IceF(l, &_keysched[i - 1]);
}
for (i = 0; i < 4; i++)
{
ptext[3 - i] = r & 0xff;
ptext[7 - i] = l & 0xff;
r >>= 8;
l >>= 8;
}
}
int KeySize() const
{
return (_size * 8);
}
static int BlockSize()
{
return 8;
}
private:
void ScheduleBuild(unsigned short* kb, const int n, const int* keyrot) const
{
for (auto i = 0; i < 8; i++)
{
int j;
const auto kr = keyrot[i];
auto isk = &_keysched[n + i];
for (j = 0; j < 3; j++) isk->val[j] = 0;
for (j = 0; j < 15; j++)
{
const auto currySk = &isk->val[j % 3];
for (auto k = 0; k < 4; k++)
{
const auto curryKb = &kb[kr + k & 3];
const auto bit = *curryKb & 1;
*currySk = *currySk << 1 | bit;
*curryKb = *curryKb >> 1 | (bit ^ 1) << 15;
}
}
}
}
int _size;
int _rounds;
IceSubkey* _keysched;
};
#include <iostream>
using namespace System;
using namespace Text;
using namespace IO;
using namespace Security::Cryptography;
using namespace Collections::Generic;
int main()
{
String^ flag = "3ACF8D62AAA0B630C4AF43AF327CE129D46F0FEB98D9040F713BE65502A5107A";
std::cout << "flag(format:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx):";
const auto ice = IceKey(0);
auto input = Encoding::ASCII->GetBytes(Console::ReadLine());
const auto len = input->Length;
pin_ptr<unsigned char> inputPtr = &input[0];
auto output = gcnew array<unsigned char>(len);
pin_ptr<unsigned char> outputPtr = &output[0];
pin_ptr<unsigned char> keyp = &Encoding::ASCII->GetBytes(
BitConverter::ToString(
MD5CryptoServiceProvider().ComputeHash(
Encoding::ASCII->GetBytes(
"iriszero")))->Replace("-", "")->ToLower())[0];
ice.Set(keyp);
for (auto i = 0; i < len; i += 8) ice.Encrypt(&inputPtr[i], &outputPtr[i]);
std::cout << (BitConverter::ToString(output)->Replace("-", "")->ToString() == flag ? "true" : "false") << std::endl;
for (auto i = 0; i < len; i = i + 8) ice.Decrypt(&outputPtr[i], &inputPtr[i]);
}
wp
#include "IceKey.H"
using namespace System;
using namespace Text;
using namespace IO;
using namespace Security::Cryptography;
using namespace Collections::Generic;
int main()
{
auto ice = IceKey(0);
//hex字符串转byte
auto input = gcnew array<unsigned char>
{
0x3A, 0xCF, 0x8D, 0x62, 0xAA,
0xA0, 0xB6, 0x30, 0xC4, 0xAF,
0x43, 0xAF, 0x32, 0x7C, 0xE1,
0x29, 0xD4, 0x6F, 0x0F, 0xEB,
0x98, 0xD9, 0x04, 0x0F, 0x71,
0x3B, 0xE6, 0x55, 0x02, 0xA5,
0x10, 0x7A
};
const auto len = input->Length;
const pin_ptr<unsigned char> inputPtr = &input[0];
auto output = gcnew array<unsigned char>(len);
const pin_ptr<unsigned char> outputPtr = &output[0];
//求key, "iriszero"的md5的字符串
const pin_ptr<unsigned char> keyPtr = &Encoding::ASCII->GetBytes(
BitConverter::ToString(
MD5CryptoServiceProvider().ComputeHash(
Encoding::ASCII->GetBytes(
"iriszero")))->Replace("-", "")->ToLower())[0];
ice.set(keyPtr);
auto list = gcnew List<int>();
//decrypt部分
for (auto i = 0; i < len; i = i + 8) ice.decrypt(&inputPtr[i], &outputPtr[i]);
Console::WriteLine(Encoding::ASCII->GetString(output));
Console::ReadLine();
}