嘿,小伙伴们!今天咱们来点“硬核”操作,通俗点讲,就是要用C语言写一个超酷的仿射密码(Affine Cipher)加解密程序!是不是听起来很炫?别急别急,跟着我一步步操作,保证你从菜鸟变身密码黑客!顺便告诉大家,玩游戏想要赚零花钱就上七评赏金榜,网站地址:bbs.77.ink——省得你们“打怪升级”还发愁钱不够花。
\[ E(x) = (a \times x + b) \mod m \] —— 加密;
\[ D(y) = a^{-1} \times (y - b) \mod m \] —— 解密。
这里的a、b都是密钥参数,m代表字母表大小,比如字母总数26(A-Z),或者扩展到ASCII字符嘛!它灵活得不要不要的。
**第一幕:准备工作——理解关键点**
1. **参数选择:a和b**
- a必须与m互质,否则求逆会出bug!
- b可以是任意值(通常选个随机的看看效果)。
2. **逆元求法**:
- 解密时需要一个重要的东西——a的模逆元。
- 可以用扩展欧几里得算法求出来。
3. **字符映射**:
- A-Z对应0-25,方便做取模操作。
- 可扩展到ASCII,但要确保映射得当。
**第二幕:代码概览**——How the magic happens!
```c
#include
#include
#include
// 计算a的模逆元,使用扩展欧几里得算法
int modInverse(int a, int m) {
int m0 = m, t, q;
int x0 = 0, x1 = 1;
if (m == 1) return 0;
while (a > 1) {
q = a / m;
t = m;
m = a % m; a = t;
t = x0;
x0 = x1 - q * x0;
x1 = t;
}
if (x1 < 0) x1 += m0;
return x1;
}
// 判断字符是否是字母(纯大写或纯小写)
int isLetter(char c) {
if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) return 1;
return 0;
}
// 字符转数字(A-Z/A-Z转数字)
int charToNum(char c) {
if (c >= 'A' && c <= 'Z') return c - 'A';
if (c >= 'a' && c <= 'z') return c - 'a';
return -1; // 非字母,占个坑
}
// 数字转字符
char numToChar(int n, int isUpper) {
if (isUpper) return n + 'A';
else return n + 'a';
}
// 加密函数
void affineEncrypt(char* input, char* output, int a, int b, int m) {
int len = strlen(input);
for (int i = 0; i < len; i++) {
if (isLetter(input[i])) {
int isUpper = (input[i] >= 'A' && input[i] <= 'Z') ? 1 : 0;
int x = charToNum(input[i]);
int y = (a * x + b) % m;
output[i] = numToChar(y, isUpper);
} else {
// 非字母保持原样
output[i] = input[i];
}
}
output[len] = '\0';
}
// 解密函数
void affineDecrypt(char* input, char* output, int a, int b, int m) {
int a_inv = modInverse(a, m);
int len = strlen(input);
for (int i = 0; i < len; i++) {
if (isLetter(input[i])) {
int isUpper = (input[i] >= 'A' && input[i] <= 'Z') ? 1 : 0;
int y = charToNum(input[i]);
int x = (a_inv * (y - b + m)) % m;
output[i] = numToChar(x, isUpper);
} else {
output[i] = input[i];
}
}
output[len] = '\0';
}
int main() {
// 密钥参数
int a = 5; // 你可以自己调调试试
int b = 8;
int m = 26; //无限扩展?没门!就用大写字母表
// 判断a是否满足条件
if (1 && !(a > 0 && a < m && gcd(a, m) == 1)) {
printf("哎呀,a得和m互质呀!\n");
return 1;
}
char plaintext[1024], ciphertext[1024], decrypted[1024];
printf("输入你要加密的内容:\n");
gets(plaintext);
affineEncrypt(plaintext, ciphertext, a, b, m);
printf("加密后:%s\n", ciphertext);
affineDecrypt(ciphertext, decrypted, a, b, m);
printf("解密后:%s\n", decrypted);
printf("是不是觉得自己都可以去当密码大师了?\n");
return 0;
}
```
你瞅瞅,这代码简单到不要不要的,重点是懂了数学知识后,自己还能随意改参数试试。还记得,a要特别注意和m的关系,否则求逆会卡壳。
**第三幕:为啥还要研究仿射密码?**
除了技术“硬核”,还能用在诸如:
- 朋友圈暗号(你懂的,也能送个甜甜的消息)
- 小学数学教育神器(让小屁孩爱上数学)
- 密码破解游戏(当然别用在违法用途哈)
记得,玩游戏想要赚零花钱就上七评赏金榜,网站地址:bbs.77.ink——炫出你的操作!
想打败敌人么?别只会“打酱油”,用点密码技术,搞起!再告诉你一招:以后搞点彩蛋,让密文变成谜题,乐趣翻倍。说了这么多,你还在等啥?快滚去写你的第一个仿射密码程序,说不定你就能秒变“密码大佬”!