c - 解密一个 4 位数字

标签 c encryption cryptography

我刚刚用 C 语言编写了一个简单的程序,它采用 4 位代码并使用这个简单的算法加密每个数字(之前已分解,从 0 到 9):

new_num1 = (old_num1 + 7) % 10;
new_num2 = (old_num2 + 7) % 10;
new_num3 = (old_num3 + 7) % 10;
new_num4 = (old_num4 + 7) % 10;

现在我想做一个解密.c 程序来解密先前加密的 4 码数字。

我可以通过哪种方式恢复号码?

这是我的 的代码crypter.c (在这个例子中,我还用第三个和第二个用第四个恢复第一个数字)
#include <stdio.h>

int main()
{
    int codice;
    int num1, num2, num3, num4, temp1, temp2, new_num1_temp, new_num2_temp;

    printf("\n(LOLCrytter v0.1)\n\nInsert 4-digit code to crypt: -1 to exit ");
    scanf("%d", &codice);    

    if(codice == -1)
        return 0;

    while(codice < 1000 || codice > 9999) {
        printf("\nInsert NUMERIC (!) 4-digit code bru..: ");
        scanf("%d", &codice); 
    }

    // Get every digit by logic math and not by strings functions      
    temp1 = codice;
    num1 = temp1 / 1000;
    temp2 = temp1 % 1000;
    num2 = temp2 / 100;
    temp1 = temp2 % 100;
    num3 = temp1 / 10;
    num4 = temp1 % 10;

    // Crypting...    
    num1 = (num1 + 7) % 10;
    num2 = (num2 + 7) % 10;
    num3 = (num3 + 7) % 10;
    num4 = (num4 + 7) % 10;

    // Crypting...    
    new_num1_temp = num3;
    num3 = num1;
    num1 = new_num1_temp;   
    new_num2_temp = num4;
    num4 = num2;
    num2 = new_num2_temp;

    printf("\nNew code: %d%d%d%d\n\n", num1, num2, num3, num4);

    return 0;
}

最佳答案

如果输入限制为 [0..9](如答案时的代码所示),那么它将起作用:8 的加密是 (8 + 7) % 10 = 5。解密是 10 + 5 - 7 = 8。
您的自定义算法一般: x 的加密是 (x + 7) % m == r;解密为:m + r - 7 == x

但是有问题的作者想要“解密一个 4 位数字”,以防万一我需要注意如果作者考虑更改代码:Mod operation is not bijection - it is not reversible: (0 + 7) % 10 = 7; (10 + 7) % 10 = 7。

如果算法的输入仅来自 0..9 范围,则例如:10 % 7 = 3; 7*1 + 3 = 10。即 7 * (10/7) + 3 = 10。每个数字 一个 可以表示为 a = m * (a/m) + r ;在哪里 是模数, r - 余数。 "/"整数除法。

表格功能 (k + n) 模 m 适用于散列函数,用于随机数生成。如果您想使用简单的加密进行学习,您可以用最少的努力获得更好的结果 - 使用 XOR。生成 key 并与纯文本异或。用相同的 key 解密 XOR 加密文本。阅读一次性垫One-time pad - 实现加密技术非常简单,但无法破解。

更新 :作为密码学家,我建议您(如果您对学习密码学基础知识感兴趣)开始学习和实现经典的简单密码算法,例如:凯撒密码、简单替换、维格纳密码系统(它们可在维基百科中找到)。

您的加密函数 (t + 7) % 10 与 Caeser 教育密码非常相似,但有一些变化:
加密可以使用模算术表示,首先将字母转换为数字,根据方案 A → 0, B → 1, ..., Z → 25。通过移位 n 对字母 x 的加密可以用数学方式描述作为,

encryptio

类似地执行解密,

decryptio

祝你好运!

关于c - 解密一个 4 位数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60696215/

相关文章:

c++ - 是否有一个简单的 C 或 C++ 函数来计算字符串的 sha1 哈希?

java - 如何在 Java 中提取 X509 证书字段

java - 为什么这个js代码的RSA加密结果和java的RSA标准代码不一样?

c - epoll 最多可以处理多少套接字?

c - char 的静态数组未填充

c - 关于将 C 结构体指针传递给函数的问题?

java - 安装了 JCE Unlimited Strength,但不支持 AES 256

iOS AES256解密

security - 如何创建防盗且无法被用户/客户端篡改的 cookie?

无法在 gcc 中使用全局变量