千家信息网

krypton系列4-7

发表于:2025-01-22 作者:千家信息网编辑
千家信息网最后更新 2025年01月22日,level 4:Vigenere Cipher加密,可以对抗词频统计,需要知道密码,此题知道密钥长度6。http://www.simonsingh.net/The_Black_Chamber/crac
千家信息网最后更新 2025年01月22日krypton系列4-7

level 4:Vigenere Cipher加密,可以对抗词频统计,需要知道密码,此题知道密钥长度6。

http://www.simonsingh.net/The_Black_Chamber/crackingprinciple.html

这个网站解释了如何破解Vigenere Cipher加密。

http://smurfoncrack.com/pygenere/pygenere.php

直接把密文拷贝到上面那个网页,可以猜知密码"FREKEY"。

用此密码揭秘密文。



level 5:加密同level 4,但不知道密钥长度。

利用level 4的解密网站,可以手工指定密钥长度进行测试。也可以使用下面的Vigenere Cipher解密工具网页,自动进行猜解:

http://www.simonsingh.net/The_Black_Chamber/vigenere_square_tool.html

密钥是:KEYLEN

用密钥解密密文。



level 6:LFSR加密

逆向加密算法:

magic值的计算函数:flsr cs:reg_2543 初始值为 1。

 public lfsr lfsr proc near var_2= word ptr -2 push rbp mov rbp, rsp mov [rbp+var_2], 0 movzx eax, cs:reg_2543 mov edx, eax and edx, 1 movzx eax, cs:reg_2543 movzx eax, ax and eax, 2 sar eax, 1 xor eax, edx mov [rbp+var_2], ax movzx eax, cs:reg_2543 shr ax, 1 mov edx, eax movzx eax, [rbp+var_2] shl eax, 3 or eax, edx mov cs:reg_2543, ax movzx eax, cs:reg_2543 movzx eax, ax pop rbp retn lfsr end

ELF x86_64的程序,加密算法是:c --> 大写 --> -0x41 --> +key[i](0-9循环) --> +magic --> -0x41 --> -0x1a 直到值<=0x19 --> +0x41

明文测试:

AAAAAAAAAABBBBBBBBBB BBBBBBBBBBAAAAAAAAAA ABABABABABABABABABAB

EICTDGYIYZLUIOTJSGYZ FJDUEHZJZAKTHNSIRFXY EJCUDHYJYAKUHOSJRGXZ

可以发现同样的字符在不同的位置,密文不同,但是同样的字符在同样的位置密文相同。实际上就是[字母*位置]的一个二维密码表。

解密可以用明文***,生成一个26*20的密码表,然后查表解密。

也可以使用已知的算法,直接用程序解密:

#include short reg = 1;char* a_en = "EICTDGYIYZLUIOTJSGYZ";char* a_pl = "AAAAAAAAAABBBBBBBBBB";char* b_en = "FJDUEHZJZAKTHNSIRFXY";char* krypton7 = "PNUKLYLWRQKGKBE";main(){        short a = 0;        int b, c;        int i, j;        char *key[10];        short magic[20];        for(i=0, j=0; i<20; i++, j++)        {                //LFSR函数的算法模拟                b = reg;                b &= 1;                c = reg;                c &= 2;                c = c >> 1;                a = b ^ c;                b = reg;                b = b >> 1;                c = a;                c = c << 3;                a = b | c;//             printf("magic: %hx\n", a);                reg = a;                magic[i] = a;                //计算key并进行验证                if(j >= 10)                        j = 0;                key[j] = a_en[i] - a;                while(key[j] < 0x41)                        key[j] += 0x1A;                key[j] -= a_pl[i];                printf("magic: %hx\tkey[%d]: %hhx\n", a, j, key[j]);        }        //解密测试        for(i=0, j=0; i<20; i++, j++)        {                if(j >= 10)                        j = 0;                b = b_en[i] - magic[i];                while(b < 0x41)                        b += 0x1A;                b -= (int) key[j];                while(b < 0x41)                        b += 0x1A;                printf("%c", b);        }        printf("\n");        //解密krypton7        for(i=0, j=0; i= 10)                        j = 0;                b = krypton7[i] - magic[i];                while(b < 0x41)                        b += 0x1A;                b -= (int) key[j];                while(b < 0x41)                        b += 0x1A;                printf("%c", b);jia        }        printf("\n");}




0