//仿射密码加密算法
#include <stdio.h>
#include <string.h>
int k1, k2;
char T[50];
//加密函数
void encrypt() {
int i, z = 0;
int l = strlen(T);
for (i = 0; i < l; i++) {
//判断大小写
if (T[i] >= 'A' && T[i] <= 'Z') {
T[z] = (k1 * (T[i] - 'A') + k2) % 26 + 'A';
}
else if (T[i] >= 'a' && T[i] <= 'z') {
T[z] = (k1 * (T[i] - 'a') + k2) % 26 + 'a';
}
else { //判断是否是空格
T[z] = T[i];
}
z++;
}
printf("密文为:%s\n", T);
}
int main(void) {
printf("请输入需要加密的明文\n");
scanf_s("%[^\n]%*c", T);
printf("请输入密钥k1\n");
scanf_s("%d", &k1);
printf("请输入密钥k2\n");
scanf_s("%d", &k2);
encrypt();
return 0;
}
解密
import java.util.Scanner;
public class Fs {
int x, y, q;
int extend_Eulid(int a, int b) {
if (b == 0) {
x = 1;
y = 0;
q = a;
} else {
extend_Eulid(b, a % b);
int temp = x;
x = y;
y = temp - a / b * y;
}
return x;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入需要解密的字符:");
String s = scanner.nextLine();
char str[] = s.toCharArray();
int count = 1;
int i, n, b, x, m;
char y;
Fangshe t = new Fangshe();
int a[] = { 1, 3, 5, 7, 9, 11, 15, 17, 19, 21, 23, 25 };
for (b = 0; b < 26; b++) {
}
for (b = 0; b < 12; b++) {
int ni = t.extend_Eulid(7, 26);
}
for (i = 0; i < s.length(); i++) {
n = str[i] - 97;
int ni = -11;
x = ni * (n - 21);
if (x >= 26 || x < 0) {
while (x < 0) {
x = x + 26;
}
while (x >= 26) {
x = x - 26;
}
}
y = (char) (x + 97);
System.out.print(y);
}
}
}
原理:
仿射密码:设两个整数α和β,及gcd(α,26)=1,
加密过程:x → αx+β (mod 26)
解密过程:x → α*(x-β) (mod 26) 其中α•α*= 1(mod 26)
这种加密方法的密钥就是一对(α,β),对gcd(α,26)=1中的α有12种可能的选择,对β有26种选择(因为用mod 26来计算,所以仅需要考虑介于0~25之间的α和β,因此密钥值一共有12•26=312种选择。**