1.凱撒密碼簡介
又叫循環移位密碼.它的加密方法是将明文中的每個字母用此字元在字母表中後面第k個字母替代.它的加密過程可以表示為下面的函數:E(m)=m+k(mod n)
其中:m為明文字母在字母表中的位置數;n為字母表中的字母個數;k為密鑰;E(m)為密文字母在字母表中對應的位置數.
2.代碼
#include <stdio.h>
#include <string.h>
//加密
int encrypt(char* plaintext, char* ciphertext, int k)
{
int i, z = 0;
int l = strlen(plaintext); //擷取明文的長度
for (i = 0; i < l; i++)
{
//判斷大小寫
if (plaintext[i] >= 'A' && plaintext[i] <= 'Z') {
ciphertext[z] = ( (plaintext[i] - 'A') + k) % 26 + 'A';
}
else if (plaintext[i] >= 'a' && plaintext[i] <= 'z') {
ciphertext[z] = ((plaintext[i] - 'a') + k) % 26 + 'a';
}
else { //判斷是否是空格
ciphertext[z] = plaintext[i];
}
z++;
}
return 0;
}
//解密
int decrypt(char* plaintext, char* ciphertext, int k)
{
int i, z = 0;
int l = strlen(plaintext); //擷取明文的長度
for (i = 0; i < l; i++)
{
//判斷大小寫
if (plaintext[i] >= 'A' && plaintext[i] <= 'Z') {
ciphertext[z] = (((plaintext[i] - 'A') - k)) % 26 + 'A';
if (((plaintext[i] - 'A') - k) < 0) {
ciphertext[z] = ciphertext[z] + 26;
}
}
else if (plaintext[i] >= 'a' && plaintext[i] <= 'z') {
ciphertext[z] = ( ((plaintext[i] - 'a') - k)) % 26 + 'a';
if (((plaintext[i] - 'a') - k) < 0) { //處理負數
ciphertext[z] = ciphertext[z] + 26;
}
}
else { //判斷是否是空格
ciphertext[z] = plaintext[i];
}
z++;
}
return 0;
}
int main()
{
char plaintext[50] = "";
char ciphertext[50] = "";
int k;
int type;
printf("請填寫明文或者密文:\n");
scanf("%s", plaintext);
printf("請選擇加密方式,輸入1加密,輸入2解密\n");
scanf("%d", &type);
if (type == 1) {
//加密
printf("請輸入密鑰k:\n");
scanf("%d", &k);
encrypt(plaintext, ciphertext, k);
printf("明文%s的密文為:%s\n", plaintext, ciphertext);
}
else if (type == 2) {
//解密
printf("請輸入密鑰k:\n");
scanf("%d", &k);
decrypt(plaintext, ciphertext, k);
printf("密文%s的明文為:%s\n", plaintext, ciphertext);
}
return 0;
}
運作結果: