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 | #include <cassert> #include <string> #include <iostream> void set_low_nibble(char& c, unsigned char nibble) { // assumes nibble has no bits set in the four higher bits) unsigned char& b = reinterpret_cast<unsigned char&>(c); b = (b & 0xF0) | nibble; } void set_high_nibble(char& c, unsigned char nibble) { unsigned char& b = reinterpret_cast<unsigned char&>(c); b = (b & 0x0F) | (nibble << 4); } unsigned char get_low_nibble(unsigned char c) { return c & 0x0F; } unsigned char get_high_nibble(unsigned char c) { return (c & 0xF0) >> 4; } static void crypt_enc(char *data, int size) { char last; // Pass 2 for (int i = 0; i < size; i++) { unsigned char old_low = get_low_nibble(data[i]); set_low_nibble(data[i], last); last = get_high_nibble(data[i]); set_high_nibble(data[i], old_low); } set_low_nibble(data[0], last); } static void crypt_dec(char *data, int size) { char last; // Pass 2 for (int i = size-1; i >= 0; i--) { unsigned char old_high = get_high_nibble(data[i]); set_high_nibble(data[i], last); last = get_low_nibble(data[i]); set_low_nibble(data[i], old_high); } set_high_nibble(data[size-1], last); } int main() { char in[] = { 0x21, 0x43, 0x65, char(0x87), 0 }; // note: with nibbles ordered low to high this is 12345678 std::string s(in); crypt_enc(&s[0], s.size()); char enc[] = { 0x18, 0x32, 0x54, 0x76, 0 }; // note: with nibbles ordered low to high this is 81234567 assert(s == enc); crypt_dec(&s[0], s.size()); assert(s == in); } |
I2luY2x1ZGUgPGNhc3NlcnQ+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnZvaWQgc2V0X2xvd19uaWJibGUoY2hhciYgYywgdW5zaWduZWQgY2hhciBuaWJibGUpIHsKICAgIC8vIGFzc3VtZXMgbmliYmxlIGhhcyBubyBiaXRzIHNldCBpbiB0aGUgZm91ciBoaWdoZXIgYml0cykKICAgIHVuc2lnbmVkIGNoYXImIGIgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGNoYXImPihjKTsKICAgIGIgPSAoYiAmIDB4RjApIHwgbmliYmxlOwp9Cgp2b2lkIHNldF9oaWdoX25pYmJsZShjaGFyJiBjLCB1bnNpZ25lZCBjaGFyIG5pYmJsZSkgewogICAgdW5zaWduZWQgY2hhciYgYiA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgY2hhciY+KGMpOwogICAgYiA9IChiICYgMHgwRikgfCAobmliYmxlIDw8IDQpOwp9Cgp1bnNpZ25lZCBjaGFyIGdldF9sb3dfbmliYmxlKHVuc2lnbmVkIGNoYXIgYykgewogICAgcmV0dXJuIGMgJiAweDBGOwp9Cgp1bnNpZ25lZCBjaGFyIGdldF9oaWdoX25pYmJsZSh1bnNpZ25lZCBjaGFyIGMpIHsKICAgIHJldHVybiAoYyAmIDB4RjApID4+IDQ7Cn0KCnN0YXRpYyB2b2lkIGNyeXB0X2VuYyhjaGFyICpkYXRhLCBpbnQgc2l6ZSkKewogICAgY2hhciBsYXN0OwogICAgLy8gUGFzcyAyCiAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKICAgIHsKICAgICAgICB1bnNpZ25lZCBjaGFyIG9sZF9sb3cgPSBnZXRfbG93X25pYmJsZShkYXRhW2ldKTsKICAgICAgICBzZXRfbG93X25pYmJsZShkYXRhW2ldLCBsYXN0KTsKICAgICAgICBsYXN0ID0gZ2V0X2hpZ2hfbmliYmxlKGRhdGFbaV0pOwogICAgICAgIHNldF9oaWdoX25pYmJsZShkYXRhW2ldLCBvbGRfbG93KTsKICAgIH0KICAgIHNldF9sb3dfbmliYmxlKGRhdGFbMF0sIGxhc3QpOwp9CgpzdGF0aWMgdm9pZCBjcnlwdF9kZWMoY2hhciAqZGF0YSwgaW50IHNpemUpCnsKICAgIGNoYXIgbGFzdDsKICAgIC8vIFBhc3MgMgogICAgZm9yIChpbnQgaSA9IHNpemUtMTsgaSA+PSAwOyBpLS0pCiAgICB7CiAgICAgICAgdW5zaWduZWQgY2hhciBvbGRfaGlnaCA9IGdldF9oaWdoX25pYmJsZShkYXRhW2ldKTsKICAgICAgICBzZXRfaGlnaF9uaWJibGUoZGF0YVtpXSwgbGFzdCk7CiAgICAgICAgbGFzdCA9IGdldF9sb3dfbmliYmxlKGRhdGFbaV0pOwogICAgICAgIHNldF9sb3dfbmliYmxlKGRhdGFbaV0sIG9sZF9oaWdoKTsKICAgIH0KICAgIHNldF9oaWdoX25pYmJsZShkYXRhW3NpemUtMV0sIGxhc3QpOwp9CgppbnQgbWFpbigpIHsKCWNoYXIgaW5bXSA9IHsgMHgyMSwgMHg0MywgMHg2NSwgY2hhcigweDg3KSwgMCB9OyAvLyBub3RlOiB3aXRoIG5pYmJsZXMgb3JkZXJlZCBsb3cgdG8gaGlnaCB0aGlzIGlzIDEyMzQ1Njc4CglzdGQ6OnN0cmluZyBzKGluKTsKCWNyeXB0X2VuYygmc1swXSwgcy5zaXplKCkpOwoJY2hhciBlbmNbXSA9IHsgMHgxOCwgMHgzMiwgMHg1NCwgMHg3NiwgMCB9OyAvLyBub3RlOiB3aXRoIG5pYmJsZXMgb3JkZXJlZCBsb3cgdG8gaGlnaCB0aGlzIGlzIDgxMjM0NTY3Cglhc3NlcnQocyA9PSBlbmMpOwoJY3J5cHRfZGVjKCZzWzBdLCBzLnNpemUoKSk7Cglhc3NlcnQocyA9PSBpbik7Cn0K
-
upload with new input
-
result: Success time: 0s memory: 2956 kB returned value: 0


