密码学中,凯撒密码(Caesar Cipher)是一种最简单的加密技术 其核心思想是替换加密。即将输入的字母根据字母表上的顺序 向前或向后偏移固定的数目,形成密文。如:向后偏移2位 则 A 变成 C(相当于 'A'+2)。进一步扩展,可以将字母表中的 A-Z a-z 0-9 扩展为大循环 形成 A B ~ Z a b ~ z 0 1 ~ 9 A B ~ Z为基础的链,用以进行映射。
修改为支持整串文字加密的“凯撒加密”
1)定义字符数组 char input[N] 保存输入的文字
2)定义字符数组 char output[N] 保存转换后的文字
3)使用scanf或getchar循环获取输入的整串文字,并保存在 input 数组
4)执行凯撒加密
5)输出字符保存在 output 数组
6)整行打印转意后的字符
例如:
input pos num(-5<pos<5): 3
input string: Hello the world!
output string:Khoor wkh zruog!
#include<stdio.h>
#include<string.h>
// 字符串缓冲区大小
#define N 1024
// 声明凯撒加密函数
void caesar_cipher(char input[N], int offset, char output[N]);
int main()
{
// 1)定义字符数组 char input[N] 保存输入的文字
int offset;
char input[N] = { 0 };
// 2)定义字符数组 char output[N] 保存转换后的文字
char output[N] = { 0 };
// 3)使用gets获取输入的整串文字,并保存在 input 数组
printf("input pos num(-5<pos<5): ");
scanf("%d", &offset);
printf("input string: ");
gets(input); // 跳过回车
gets(input);
// 4)执行凯撒加密 并且 5)将输出字符保存在output数组
caesar_cipher(input, offset, output);
// 6)整行打印转意后的字符
printf("output string:%s ", output);
}
void caesar_cipher(char input[N], int offset, char output[N])
{
const char* table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
while (*input)
{
int cnt = 0;
const char* tmp = table;
while (*tmp && *tmp != *input)
{
++cnt;
++tmp;
}
char ch = *tmp != *input ? *input : table[(cnt + offset + (int)strlen(table)) % (int)strlen(table)];
*output = ch;
++input;
++output;
}
*output = 0;
}
可以参考一下
/*
思路:
1、while无线循环,声明两个字符数组:保存明文和密文
2、首次用户输入字符串,进行明文加密成密文操作
3、之后用户输入命令字符实现判断:输入:“1”加密新的明文,输入:“2”对刚加密的密文进行解密,输入:“3”退出
*/
#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
int count = 0;
int result = 1;
int i;
char Text[128] = {'\0'}; // 定义一个明文字符数组
char crytograph[128] = {'\0'}; // 定义一个密文字符数组
while (1)
{
/* code */
if (result == 1)
{
/* code */
printf("请输入要加密的明文:");
scanf("%s", &Text);
count = strlen(Text);
for (i = 0; i < count; i++) // 遍历明文
{
/* code */
crytograph[i] = Text[i] + i + 5; //设置加密字符
}
crytograph[i] = '\0'; // 设置字符串结束标记
/*输出密文信息*/
printf("加密后的密文是:%s\n", crytograph);
}
else if (result == 2) // 如果是解密字符串
{
count = strlen(Text);
for (i = 0; i < count; i++) // 遍历密文字符串
{
/* code */
Text[i] = crytograph[i] - i - 5; // 设置解密字符
}
Text[i] = '\0';
/*输出明文信息*/
printf("解密后的明文是:%s\n", Text);
}
else if (result == 3)
{
break; // 跳出循环
}
else
{
printf("请输入命令符:"); // 输出字符串
}
/*输出字符串*/
printf("输入1加密新的明文,输入2对刚加密的密文进行解密,输入3退出系统:\n");
printf("请输入命令符:\n");
scanf("%d", &result);
}
return 0;
}
代码如下:
#include<stdio.h>
#include<string.h>
int main()
{
char s[100];
int n;//移动步长
scanf_s("%d", &n);
getchar();
gets(s);
int len = strlen(s);
for (int i = 0; i < len; i++)
{
if (s[i] >= 'A' && s[i] <= 'Z')
{
if (s[i] + n <= 'Z')
s[i] += n;
else
s[i] += (n + 6); //从大写接到小写
}
else if (s[i] >= 'a' && s[i] <= 'z')
{
if (s[i] + n <= 'z')
s[i] += n;
else
s[i] += (n -75); //从小写接到数字
}
else if (s[i] >= '0' && s[i] <= '9')
{
if (s[i] + n <= '9')
s[i] += n;
else
s[i] += (n +7); //从数字接到大写
}
}
puts(s);
return 0;
}
结果:
思路如下
char input[N]
char output[N]
for(int i=0;i<input.length;i++){
output[i]=input[i]+2;
print(out【i】) 不换行打印
}