1.维吉尼亚密码简介
人们在凯撒密码的基础上扩展出多表密码,称为维吉尼亚密码。
加密方法:根据密钥来决定用哪一行的密表来进行替换。
例如:明文是D ;密钥是C ;那么就在C对应的密表中找D对应的密文F
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
A -A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
B -B C D E F G H I J K L M N O P Q R S T U V W X Y Z A
C -C D E F G H I J K L M N O P Q R S T U V W X Y Z A B
D -D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
E -E F G H I J K L M N O P Q R S T U V W X Y Z A B C D
F -F G H I J K L M N O P Q R S T U V W X Y Z A B C D E
G -G H I J K L M N O P Q R S T U V W X Y Z A B C D E F
H -H I J K L M N O P Q R S T U V W X Y Z A B C D E F G
I -I J K L M N O P Q R S T U V W X Y Z A B C D E F G H
J -J K L M N O P Q R S T U V W X Y Z A B C D E F G H I
K -K L M N O P Q R S T U V W X Y Z A B C D E F G H I J
L -L M N O P Q R S T U V W X Y Z A B C D E F G H I J K
M -M N O P Q R S T U V W X Y Z A B C D E F G H I J K L
N -N O P Q R S T U V W X Y Z A B C D E F G H I J K L M
O -O P Q R S T U V W X Y Z A B C D E F G H I J K L M N
P -P Q R S T U V W X Y Z A B C D E F G H I J K L M N O
Q -Q R S T U V W X Y Z A B C D E F G H I J K L M N O P
R -R S T U V W X Y Z A B C D E F G H I J K L M N O P Q
S -S T U V W X Y Z A B C D E F G H I J K L M N O P Q R
T -T U V W X Y Z A B C D E F G H I J K L M N O P Q R S
U -U V W X Y Z A B C D E F G H I J K L M N O P Q R S T
V -V W X Y Z A B C D E F G H I J K L M N O P Q R S T U
W -W X Y Z A B C D E F G H I J K L M N O P Q R S T U V
X -X Y Z A B C D E F G H I J K L M N O P Q R S T U V W
Y -Y Z A B C D E F G H I J K L M N O P Q R S T U V W X
Z -Z A B C D E F G H I J K L M N O P Q R S T U V W X Y
2.代码
#include<stdio.h>
//加密
int encrypt(char* plaintext, char* ciphertext, char* k)
{
int l, i, j = 0, z = 0;
for (l = 0; plaintext[l] != '\0'; l++);
for (i = 0; i < l; i++)
{
ciphertext[z] = (plaintext[i] - 'a' + k[j] - 'a') % 26 + 'a';
j++;
z++;
}
return 0;
}
//解密
int decrypt(char* plaintext, char* ciphertext, char* k)
{
int l, i, j = 0, z = 0;
for (l = 0; plaintext[l] != '\0'; l++);
for (i = 0; i < l; i++)
{
ciphertext[z] = (plaintext[i] - k[j] + 26) % 26 + 'a';
j++;
z++;
}
return 0;
}
int main()
{
char plaintext[50] = "";
char ciphertext[50] = "";
char k[50] = "";
int type;
printf("请填写明文或者密文:\n");
scanf("%[^\n]", plaintext);
printf("请选择加密方式,输入1加密,输入2解密\n");
scanf("%d", &type);
printf("请输入密钥k\n");
scanf("%s", k);
if (type == 1) {
//加密
encrypt(plaintext, ciphertext, k);
printf("明文%s的密文为:%s\n", plaintext,ciphertext);
}
else if (type == 2) {
//解密
decrypt(plaintext, ciphertext, k);
printf("密文%s的明文为:%s\n", plaintext, ciphertext);
}
return 0;
}
运行结果: