LUO 一个兴趣使然的人与他兴趣使然的博客

变种凯撒加密 / 数字位移 --代码练习 [C]

⚠️ 本文最后更新于2023年12月02日,已经过了291天没有更新,若内容或图片失效,请留言反馈

简介

基于 C语言 编写的变种凯撒解密脚本
可以轻松的将带偏移(是这么叫吗?)的凯撒加密的抽象神秘字符串还原

详细用途

例:NTA-CTF[2023]
题名:凯撒
信息:lsip{Gpxpcbu_kg_Gyoslpj}
联系上下文可知这串神秘字符串就是凯撒加密后的flag
但是有些些微的变化
他每次的位移是不断加一的

f >> l = 6
l >> s = 7
a >> i = 8
g >> p = 9

这时候一些在线工具提供的凯撒解密就不太好用,哪怕有枚举功能也需要自己拼接
所以为了方便自己及锻炼 C语言 所以写了这个简单的脚本
可以实现带偏移的凯撒解密和数字位移的解密

源码

因为是 C语言 编写的编译一下就能用
而且也是为了省事所以直接给出源代码


# include "stdio.h"
int numbercaser (char *str);
int pluscaser (char *str);
int main (void){
    char string [100];
    int pd = -1;
    while (pd != 0) {
    printf("位移凯撒请扣\t1\n"
           "数字凯撒请扣\t2\n"
           "退出请扣\t0\n");
    scanf("%d",&pd);
    fflush(stdin);
    switch (pd) {
        case 1:
            printf("请输入需要解密的神秘抽象字符串:");
            fflush(stdin);
            fgets(string,99,stdin);
            fflush(stdin);
            pluscaser(string);
            break;
        case 2:
            printf("请输入需要解密的神秘抽象字符串:");
            fflush(stdin);
            fgets(string,99,stdin);
            fflush(stdin);
            numbercaser(string);
            break;
        case 0:
            printf("感谢使用喵!关注「洛天依」谢谢喵!");
            scanf("%d",string);
            break;
        default:
            printf("按规矩输入哦亲!\n");
            break;
    }
    }
    return 0;
}

int numbercaser (char *str) {
    int i,j,k,l,m;
    i = j = k = l = m = 0;
    int key;
    printf("请输入 key :\n");
    scanf("%d", &key);
    fflush(stdin);
    printf("明文:");
    while (str[i++]) {
        k = 0;
        if (str[j] >= '0' && str[j] <= '9') k = '1';
        l = key % 10;
        if (k != 0) str[j] -= l;
        if (k == '1' && str[j] < '0') str[j] += 10;
        printf("%c", str[j]);
        if (k != 0) m++;
        j++;
    };
    printf("\n");
}
int pluscaser (char *str) {
    int i,j,k,l,m;
    i = j = k = l = m = 0;
    int key,buchang;
    printf("请依次输入 key 和 位移:\n");
    scanf("%d",&key);
    fflush(stdin);
    scanf("%d",&buchang);
    fflush(stdin);
    printf("明文:");
    while (str[i++]) {
        k = 0;
        if (str[j] >= 'a' && str[j] <= 'z') k = 'a';
        if (str[j] >= 'A' && str[j] <= 'Z') k = 'A';
        l = (key + m * buchang) % 26;
        if (k != 0) str[j] -= l;
        switch (k) {
            case 'a':
                if (str[j] < 'a') str[j] += 26;
                break;
            case 'A':
                if (str[j] < 'A') str[j] += 26;
                break;
        };
        printf("%c",str[j]);
        if (k != 0) m++;
        j++;
    };
    printf("\n");
}

另:
关注洛天依喵!
关注洛天依谢谢喵!