两个月前准备计网考试,复习到码分复用这部分内容的时候,就感觉这个算法炒鸡有趣,正向和逆向的逻辑很难独立相互推导出来(如果没有提前学习这个算法的话)。

当时就在群里立下了flag,要在暑假用这个知识点出个逆向题。结果假期一直忙于游乐,直到返校前的最后一天才把这个程序写完。

自己立下的flag,含着泪也要写完。

不过这只是核心算法的demo,要想当成逆向题,还需要删改几行代码,不过不用担心,剩下的都是很简单的工作。如果以后打算用这道题,当场现改也完全来得及。

大家都是上过计网课的,应该都懂原理,所以题解我就不写啦~

环境是dev c++ 5.0。

/**************************************************************************
 * Title:    A small demo of Code Division Multiplexing
 * Author:     iyzyi
 * WebSite: http://iyzyi.com 
 * Date:       3 Sep 2020
 **************************************************************************/

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdint.h>

int seq1[] = {-1, -1, -1, +1, +1, -1, +1, +1};
int seq2[] = {-1, -1, +1, -1, +1, +1, +1, -1};
int seq3[] = {-1, +1, -1, +1, +1, +1, -1, -1};
int seq4[] = {-1, +1, -1, -1, -1, -1, +1, -1};

char plain1[] = "flag{D0_Yov_kN0w";
char plain2[] = "_460UT_C0de-DivI";
char plain3[] = "Si0N-MulTip1Exin";
char plain4[] = "9_hhh(_.._)hhh~}";

char encoded[16][8][8];
uint8_t decoded[64];

unsigned int getBit(const unsigned int n, int i){
    unsigned int t =  pow(2, i);
    return ((t & n) >> i) ? 1 : -1;
}

int encode(){
    int i, j, k;
    for (i = 0; i < 16; i++){
        for (j = 0; j < 8; j++){
            for (k = 0; k < 8; k++){
                encoded[i][j][k] = 
                    getBit(plain1[i], 7-j) * seq1[k] + 
                    getBit(plain2[i], 7-j) * seq2[k] + 
                    getBit(plain3[i], 7-j) * seq3[k] + 
                    getBit(plain4[i], 7-j) * seq4[k];
                printf("%d ", encoded[i][j][k]);
            }
            printf("\n");
        }
        printf("\n\n");
    }
}

int decode(){
    int i, j, k;
    for (i = 0; i < 16; i++){
        for (j = 0; j < 8; j++){
            int t1 = 0, t2 = 0, t3 = 0, t4 = 0;
            for (k = 0; k < 8; k++){
                t1 += seq1[k] * encoded[i][j][k];
                t2 += seq2[k] * encoded[i][j][k];
                t3 += seq3[k] * encoded[i][j][k];
                t4 += seq4[k] * encoded[i][j][k];
            }
            t1 /= 8; t2 /= 8; t3 /= 8; t4 /= 8; 
            int bit, power = pow(2, 7-j);
            bit = (t1 == -1) ? 0 : 1;
            decoded[0+i] |= bit * power;
            bit = (t2 == -1) ? 0 : 1;
            decoded[16+i] |= bit * power;
            bit = (t3 == -1) ? 0 : 1;
            decoded[32+i] |= bit * power;
            bit = (t4 == -1) ? 0 : 1;
            decoded[48+i] |= bit * power;
        }
    }
    for (i = 0; i < 64; i++){
        printf("%c", decoded[i]);
    }
}

int main(){    
    encode();
    decode();
} 
Last modification:December 7th, 2020 at 01:42 pm