我刚刚用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;
}
发布于 2020-03-15 17:40:45
如果输入仅限于0.9,那么它将起作用:加密8是(8 + 7) % 10 = 5。解密是10 +5-7=8。您的自定义算法一般是:x的加密是(x + 7) %m == r;解密是:m+r-7 == x。
但是有问题的作者想要“解密一个4位数的数字”,如果作者考虑更改代码,我会发出警告: Mod操作不是双射,它是不可逆的:(0 + 7) % 10 = 7;(10 + 7) % 10 = 7。
如果算法的输入范围仅为0.9,则例如: 10 %7= 3;7*1 +3= 10。即7* (10 / 7) +3= 10。每一个数字a可表示为a =m* (a/m) + r;其中m为模,r -余数。"/“整体判断。
形式(k + n) mod m的函数适用于杂凑函数,用于随机数的生成。如果你想用简单的加密来学习,你可以用最少的努力获得更好的结果--使用XOR。生成键并使用纯文本进行异或。使用相同密钥解密XOR加密文本。阅读一次pad 一次性垫 -非常简单的实现加密技术,但这是无法破解的。
更新的:作为密码专家,我建议您(如果您对密码学的基础知识感兴趣)开始学习和实现经典的简单密码算法,如:凯撒密码、简单替换、Vigener密码系统(它们可以在维基百科上找到)。
您的密码函数(t + 7) % 10与凯撒教育密码非常相似,但有一些变化:加密可以使用模块化算法表示,首先将字母转换为数字,根据该方案,A→0,B→1,…,Z→25。用移位n对字母x进行加密,可以用数学方法描述为,
解密也是类似的,
祝你好运!
https://stackoverflow.com/questions/60696215
复制