数週間前、私が興味を持っていた暗号化の仕事への応募の一環として、いくつかのコードを受け取りました。彼らは私にコードを送ってきて、基本的に私がそれを理解し、それを改善できるかどうかを知りたがっていました。
私は最善を尽くしましたが、すべてのコードが私にとって真新しいものであり、それが何をするのか理解できませんでした. 他にやるべきことがあったので、最終的にはそれを失われた原因としてあきらめました。しかし、知識のためだけに、私はまだそれについて学ぶことに非常に興味があります. このタイプのプログラミングについて、またはこれが具体的に何をするのかを学ぶのを手伝ってくれる人はいますか?
私はそれを切り詰めて、私の印象を与えようとします。
これは、実際の暗号化を行う部分です。XOR暗号化を使用して、私が理解できることから。これは正しいです?また、input_2 と input_1 が誤って切り替えられていると思います。
typedef int int32;
typedef char int8;
void change_it(int8 *output, int8 *input_1, const int8 *input_2, int32 length)
{
int32 i = 0;
for(i=0; i<length; i++)
{
output[i] = (int8)(input_1[i] ^ input_2[i]);
}
return;
}
ここではitoa
、文字列を 10 進数または 16 進数にするために an をオーバーロードしましたが、その目的は不明です。
void itoa( int32 num, int8 *alpha, int32 radix )
{
if( radix == 10 )
{
sprintf(alpha, "%i", num);
}
else if( radix == 16 )
{
sprintf(alpha, "%X", num);
}
}
これは、main が呼び出すメインの実行中の関数です。いくつかの奇妙なビット単位の処理を行ってから、change_it を 4 回呼び出します。これは私を最も困惑させた部分でした。
int8 *modify_it(int32 modifier, const int8 *input_1, int32 length)
{
int8 leading[3];
int32 i_leading;
int8 * temp_string = NULL;
int8 * ret;
int32 i = 0;
itoa(modifier/2, leading, 10);
i_leading = atoi(leading);
temp_string = (int8 *) malloc(8);
ret = (int8 *) malloc(length);
memset(temp_string, 0, 8);
temp_string[0] = 0;
if( (modifier+1)%2 == 0 ) {
temp_string[0] = (int8)((i_leading<<4) + 8);
}
else {
temp_string[0] = (int8)(i_leading<<4);
}
for(i=0; i<(length>>3); i++)
{
change_it(ret+i*8, temp_string, input_1+i*8, 8);
}
free(temp_string);
return ret;
}
最後になりましたが、それを開始するための main 関数です。
int main(int argc, char **argv) {
int8 data[32];
memset(data, 0x0A, sizeof(data));
int8 *resp = modify_it(0xFF, data, sizeof(data));
free(resp);
system("PAUSE");
return 0;
}