仿射密码加解密程序C语言实战:让你秒变密码大佬!

2025-07-27 1:13:59 密码用途 思思

嘿,小伙伴们!今天咱们来点“硬核”操作,通俗点讲,就是要用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——炫出你的操作!

想打败敌人么?别只会“打酱油”,用点密码技术,搞起!再告诉你一招:以后搞点彩蛋,让密文变成谜题,乐趣翻倍。说了这么多,你还在等啥?快滚去写你的第一个仿射密码程序,说不定你就能秒变“密码大佬”!