首页 > 其他分享 >buuctf.crypto.摩丝

buuctf.crypto.摩丝

时间:2023-03-23 22:45:30浏览次数:43  
标签:buuctf 摩丝 struct ..--.- crypto 对照表 char 摩斯 include

一道摩斯密码
基于单表替换的
原理很简单......
但是摩斯密码在对照表上不是很完善,导致一些特殊的字符没有统一的规定
也就是说,原理一样,但是采用不同的对照表加密的结果是不一样的

另外说一下摩斯密码对照表的生成是根据字母出现的频率来决定的(chatgpt说的)
下面是我自己写的一个简单的摩斯密码加密解密,不可和网上的在线网站相提并论
因为在线网站的对照表我都不知道

#include<stdio.h> 
#include<string.h>
#include<stdlib.h>
 
struct msDit 
{
    char ascii;
    char* lpms;
};
struct my_node 
{
    struct my_node* next;
    char* data;
};
char toupper(char c)
{
    if ((c >= 'a') && (c <= 'z'))
        return c + ('A' - 'a');
    return c;
}
void table2index(struct msDit* t,int tlen, char* input, int ilen)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < ilen; i++)
    {
        for (j = 0; j < tlen; j++)
        {
            if (toupper(input[i]) == t[j].ascii)
            {
                input[i] = (char)j;
                break;
            }
        }
    }
    return;
}
char* string2index(struct msDit* t, int tlen,char* input)
{
    int i = 0,j=0;
    char* lp = malloc(0x100);
    int everyLen = 0;
    memset(lp, 0, 0x100);
    while(1)
    {

        if (*input==0)
        {
            break;
        }
        for (everyLen = 0; ; everyLen++)
        {
            if (input[everyLen] == ' ' || input[everyLen] == 0)
                break;
        }

        for (j = 0; j < tlen; j++)
        {
            if (strlen(t[j].lpms) == everyLen)//要2个人的长度都相等才能比,否则会没有意义,别人故意截断某一部分和你比较
            {
                if (!memcmp(t[j].lpms, input, everyLen))
                {
                    //说明它找打了
                    lp[i] = (char)j + 1;
                    input += everyLen;
                    if (*input == ' ')
                        input++;//指向下一个开始的位置,如果下一位不是' '而是0,我们就不用++了
                    i++;
                    break;
                }
            }
            
        }   
    }
    return lp;
}
char* fenc(struct msDit* dict,int tlen,char* input)//把输入换做索引.然后
{
    int ilen = strlen(input);
    int i = 0;
    char* lp = malloc(ilen * 16 + 1);
    memset(lp, 0, ilen * 16 + 1);
    table2index(dict,tlen, input, ilen);
    for (i = 0; i < ilen; i++)
    {
        strcat(lp, dict[input[i]].lpms);
        strcat(lp, " ");//作为分割的存在
    }
    return lp;
}
char* fdec(struct msDit* dict, int tlen,char* input)//把输入换做索引.然后
{
    int i = 0;
    char* lp;
    lp=string2index(dict, tlen,input);
    for (i = 0; lp[i] ; i++)
    {   
        lp[i] = dict[lp[i] - 1].ascii;//为了循环的退出,我们的基数是1,然后0用于退出循环
    }
    return lp;
}
int	 main()
{
    // 摩斯密码对照表
    struct msDit morseTable[] = 
    {
        {'A', ".-"},
        {'B', "-..."},
        {'C', "-.-."},
        {'D', "-.."},
        {'E', "."},
        {'F', "..-."},
        {'G', "--."},
        {'H', "...."},
        {'I', ".."},
        {'J', ".---"},
        {'K', "-.-"},
        {'L', ".-.."},
        {'M', "--"},
        {'N', "-."},
        {'O', "---"},
        {'P', ".--."},
        {'Q', "--.-"},
        {'R', ".-."},
        {'S', "..."},
        {'T', "-"},
        {'U', "..-"},
        {'V', "...-"},
        {'W', ".--"},
        {'X', "-..-"},
        {'Y', "-.--"},
        {'Z', "--.."},
        {'0', "-----"},
        {'1', ".----"},
        {'2', "..---"},
        {'3', "...--"},
        {'4', "....-"},
        {'5', "....."},
        {'6', "-...."},
        {'7', "--..."},
        {'8', "---.."},
        {'9', "----."},
        {'.', ".-.-.-"},
        {',', "--..--"},
        {'?', "..--.."},
        {'!', "-.-.--"},
        {'/', "-..-."},
        {'{', "-.--."},
        {'}', "-.--.-"},
        {'&', ".-..."},
        {':', "---..."},
        {';', "-.-.-."},
        {'=', "-...-"},
        {'+', ".-.-."},
        {'-', "-....-"},
        {'_', "..--.-"},
        {'"', ".-..-."},
        {'$', "...-..-"},
        {'@', ".--.-."},
        {' ', " "},
    };
    char flag[] = "flag{QWER5008_IS_MY_Home}";
    char enc[] = "..-. .-.. .- --. -.--. --.- .-- . .-. ..... ----- ----- ---.. ..--.- .. ... ..--.- -- -.-- ..--.- .... --- -- . -.--.-";
    char * lp1 ,*lp2;

    lp1 = fenc(morseTable, sizeof(morseTable) / sizeof(struct msDit), flag);
    printf("%s\n", lp1);

    lp2 = fdec(morseTable, sizeof(morseTable) / sizeof(struct msDit), enc);
    printf("%s\n", lp2);
	return 0;
}


..-. .-.. .- --. -.--. --.- .-- . .-. ..... ----- ----- ---.. ..--.- .. ... ..--.- -- -.-- ..--.- .... --- -- . -.--.-
FLAG{QWER5008_IS_MY_HOME}

E:\C\2022\C1\Debug\C1.exe (进程 18760)已退出,代码为 0。
按任意键关闭此窗口. . .

标签:buuctf,摩丝,struct,..--.-,crypto,对照表,char,摩斯,include
From: https://www.cnblogs.com/re4mile/p/17249800.html

相关文章

  • buuctf.crypto.看我回旋踢
    这个题目是和凯斯密码相关的,可以通过flag的一些标志来判断首先我们得到的数据是synt{5pq1004q-86n5-46q8-o720-oro5on0417r1}其中synt是flag在字母表中右移动13位的结......
  • 黄河流域安全赛crypto
    黄河流域安全赛cryptoEasyLock已知5条同余方程,可以知道cs[0]*cs[1]-cs[4]和cs[0]^2-cs[2]的公因数为n#fromsecretimportflag#fromCrypto.Util.numberimport*......
  • buuctf.pwn.ciscn_2019_n_1
    检测开启了栈不可执行的检测然后拖进IDA分析比较赤裸注意到,我们输入的是num1,但是比较的是num2所以我们需要把num1溢出到num2比较幸运的是,num1在num2的上方(空间......
  • BUUCTF-MISC-菜刀666
    下载得到一个流量包根据题目菜刀666,与菜刀有关,一般都是post连接,于是我们过滤post数据http.request.method==POST在tcp.streameq7中发现了大量数据右键追踪TCP流,看......
  • 密码学SAT入门文献0——Using Walk-SAT and Rel-SAT for cryptographic key search
     FabioMassacci.1999.UsingWalk-SATandRel-SATforcryptographickeysearch.InIJCAI,Vol.1999.290–295.  本人的组织架构:第2节介绍一些关于密码......
  • $\mathcal{Crypto}$ 共模攻击原理实现以及$\mathcal{CRT}$优化
    共模攻击概述共模攻击是一种攻击\(RSA\)加密的技术,当两个密文使用相同的\(RSA\)公共模数时,攻击者可以使用中国剩余定理\((CRT)\)和最大公因数\((GCD)\)算法,推导出明文。这......
  • BUUCTF-MISC-面具下的flag()
    准备工作下载附件得到一个一张图片丢入winhex,发现还有一个flag.vmdk文件vmdk文件其实是虚拟机使用的硬盘文件打开kalibinwalk-emianju.jpg关键步骤这里如果在......
  • BUUCTF-MISC-LSB(stegsolve的一种妙用)
    题目已知是LSB隐写丢入stegsolve,点>,可以看见Redplane0,Greenplane0,Blueplane0上边好像有东西点analyse->dataextract,让红绿蓝通道为0,可以看见是png图片点sa......
  • BUUCTF Crypto 1-20
    https://blog.csdn.net/ao52426055/article/details/1093046461、MD5MD5在线网站解密2、一眼就解密base64解码3、URL编码控制台解码decodeURI()、decodeURICompon......
  • BUUCTF MISC 41-60
    41、秘密文件题目提示的盗取了文件,于是首先过滤FTP协议,追踪一下TCP流,发现存在一个压缩包于是尝试用foremost提取,得到一个加密的压缩包没有任何提示,尝试四位数暴力破解......