- 論壇徽章:
- 0
|
本帖最后由 snowboy9859 于 2011-09-09 19:03 編輯
以下程序是一個(gè)信息編碼的程序,閱讀其encode部分,并補(bǔ)全其decode部分
最后運(yùn)行程序,會(huì)打印出的一句話。這句話就是我們要求的答案。 (本段代碼遵循c99標(biāo)準(zhǔn),gcc編譯請(qǐng)加-std=c99)
注意!這句話是用GBK編碼的!
- #include <stdio.h>
- #include <stdlib.h>
- #include <stdint.h>
- #include <assert.h>
- #include <string.h>
- int encode(const void* raw_in, void* raw_out, uint32_t password, size_t len)
- {
- const uint8_t* in=(const uint8_t*)raw_in;
- uint8_t* out=(uint8_t*)raw_out;
-
- uint32_t seed = password ^ 0x164ba504u;
- for (size_t i = 0; i < len; ++i)
- {
- uint8_t a = (in[i] ^ seed) >> 4; //將in[i]的高四位異或后的結(jié)果存放在a的低四位中
- uint8_t b = ((((uint32_t)in[i]) << 12)^seed)>>(12-4); //將in[i]的低四位異或后放在b的高四位中
- a &= 15; //將未存儲(chǔ)有效數(shù)據(jù)位清零
- b &= 240; //將未存儲(chǔ)有效數(shù)據(jù)位清零
- a = 15 & (a ^(b <<3)); //這句約等于沒(méi)有,不起任何作用起誤導(dǎo)作用
- out[i] = a | b; //把經(jīng)過(guò)轉(zhuǎn)換的數(shù)據(jù)相或組成新的數(shù)據(jù)
- seed = ((seed ^ out[i]) * 48475829 + out[i]); //通過(guò)通式更新seed
- }
- }
- int decode(const void* raw_in, void* raw_out, uint32_t password, size_t len)
- {
- const uint8_t* in = (const uint8_t*)raw_in;
- uint8_t* out = (uint8_t*)raw_out;
-
- uint32_t seed = password ^ 0x164ba504u;
- for(size_t i = 0 ; i < len; ++i)
- {
- // 請(qǐng)?jiān)诖颂幯a(bǔ)全代碼 (本人不才,下面代碼為自己給出尚且通過(guò)調(diào)試未得到預(yù)期的答案,請(qǐng)高手指教)
- uint8_t a = in[i] & 15;//取出in[i]的低四位放入a中
- uint8_t b = in[i] & 240;//取出in[i]的高四位放入b中
- uint8_t c = ((a<<4)^seed)&240;//運(yùn)用c=a^b;a=c^b;的原理,將原來(lái)的數(shù)據(jù)還原,并清空無(wú)效的數(shù)據(jù)位
- unit8_t d = (((((uint32_t)b)<<8)^seed)>>12)&15;//運(yùn)用c=a^b;a=c^b;的原理,將原來(lái)的數(shù)據(jù)還原,并清空無(wú)效的數(shù)據(jù)位
- out[i] = c | d;//將還原后的高四位和低四位相或
- seed = ((seed ^ in[i]) * 48475829 + in[i]);//保證編碼和解碼用的一個(gè)密碼;(編碼中的out[i]就是解碼中的in[i])
- }
- }
- int main()
- {
- const uint8_t buf1[] = {0xf2, 0x60, 0xab, 0xa6, 0xa5, 0xbe, 0xc9, 0x39, 0x15, 0xdf, 0xe6, 0x06, 0x47, 0x02, 0xa6, 0xfb, 0xcb, 0x60, 0x76, 0xf0, 0x08, 0xfb, 0x92, 0xe4, 0xaf, 0x4d, 0x22, 0x7a, 0x6a, 0xfe, 0xcf, 0x85, 0x25, 0x25, 0xfc, 0x31, 0xe4, 0xa2, 0x10, 0x2b, 0xd8, 0x50, 0x8f, 0x7f, 0x3f, 0xf0, 0xde, 0xee, 0x30, 0x96, 0x24, 0x7f, 0x9f, 0x56, 0x06, 0x21, 0xd3, };
- uint8_t buf2[100] = {};
- const uint32_t password = 0xee90efe9u;
- const size_t len = sizeof(buf1);
- decode(buf1, buf2, password, len);
- printf("%s\n", buf2);
- }
復(fù)制代碼 要補(bǔ)全之后求答案
在此將測(cè)試程序貼出:(此程序可以在vc下直接編譯運(yùn)行)- #include <stdio.h>
- #include <stdlib.h>
- //#include <stdint.h>
- #include <assert.h>
- #include <string.h>
- typedef unsigned int uint32_t;
- typedef unsigned char uint8_t;
- int encode(const void* raw_in, void* raw_out, uint32_t password, size_t len)
- {
- const uint8_t* in = (const uint8_t*)raw_in;
- uint8_t* out = (uint8_t*)raw_out;
-
- uint32_t seed = password ^ 0x164ba504u;
- for (size_t i = 0 ; i < len; ++i) {
- uint8_t a = ( in[i] ^ seed ) >> 4;
- uint8_t b = ( ( ((uint32_t)in[i]) << 12 ) ^ seed ) >> (12-4);
- a &= 15;
- b &= 240;
- a = 15 & ( a ^ (b << 3));
- out[i] = a | b;
- seed = ((seed ^ out[i]) * 48475829 + out[i]);
- }
- return 0;
- }
- int decode(const void* raw_in, void* raw_out, uint32_t password, size_t len)
- {
- const uint8_t* in = (const uint8_t*)raw_in;
- uint8_t* out = (uint8_t*)raw_out;
-
- uint32_t seed = password ^ 0x164ba504u;
- for (size_t i = 0 ; i < len; ++i) {
- out[i] = (((in[i]<<4)^seed)&0xF0) | (((in[i]>>4)^(seed>>12))&0x0F);
- seed = ((seed ^ in[i]) * 48475829 + in[i]);
-
- // 請(qǐng)?jiān)诖颂幯a(bǔ)全代碼
- }
- return 0;
- }
- int main(void)
- {
- const uint8_t buf1[] = {0xf2, 0x60, 0xab, 0xa6, 0xa5, 0xbe, 0xc9, 0x39, 0x15, 0xdf, 0xe6, 0x06, 0x47, 0x02, 0xa6, 0xfb, 0xcb, 0x60, 0x76, 0xf0, 0x08, 0xfb, 0x92, 0xe4, 0xaf, 0x4d, 0x22, 0x7a, 0x6a, 0xfe, 0xcf, 0x85, 0x25, 0x25, 0xfc, 0x31, 0xe4, 0xa2, 0x10, 0x2b, 0xd8, 0x50, 0x8f, 0x7f, 0x3f, 0xf0, 0xde, 0xee, 0x30, 0x96, 0x24, 0x7f, 0x9f, 0x56, 0x06, 0x21, 0xd3, };
- uint8_t buf2[100] = {0};
- const uint32_t password = 0xee90efe9u;
- const size_t len = sizeof(buf1);
- decode(buf1, buf2, password, len);
- printf("%s\n", buf2);
- return 0;
- }
復(fù)制代碼 運(yùn)行結(jié)果
1.jpg (27.03 KB, 下載次數(shù): 63)
下載附件
2011-09-09 17:52 上傳
|
|