在单表置换密码中,密钥是由字母与空格组成的 如shana
在没有密钥作用前,置换表如下
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 | 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 | 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 |
S | H | A | N | B | C | D | E | F | G | I | J | K | L | M | O | P | Q | R | T | U | V | W | X | Y | Z |
首先将SHAN填入表中,因为A已经在前面出现,所以忽略,接着将除去S H A N四个字符的字母表按顺序填充
具体C语言代码实现如下,这个代码个人感觉写的不够简洁,以后有机会再修改
思路就是读取密钥后填充进空的置换表,然后 再把原字符表填充到置换表中构成密码表
#include <stdio.h>
#include <stdlib.h>
int main()
{
//置换表
char List[27] = { 0 };
//字母表
char Alpha[26] = { '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' };
//密钥
char Key[101] = { 0 };
//明文
char Message[101] = { 0 };
//密文
char CipherText[101] = { 0 };
int Num = 0;
//获取密钥
printf("请输入密钥(100字符以内): ");
gets(Key);
//构造置换表
for (int i = 0; Key[i]; ++i)
{
if (Key[i] == ' ')
continue;
for (int j = 0; j < 26; ++j)
{
if (Alpha[j] == Key[i])
{
Alpha[j] = 0;
List[Num++] = Key[i];
}
}
}
for (int i = 0; i < 26; ++i)
{
if (!Alpha[i])
continue;
List[Num++] = Alpha[i];
}
//获取明文
printf("请输入明文(100字符以内): ");
gets(Message);
//加密
for (int i = 0; Message[i]; ++i)
{
if (Message[i] == ' ')
CipherText[i] = ' ';
else
CipherText[i] = List[Message[i] - 'a'];
}
//打印密文
printf("加密后密文: %s\n", CipherText);
system("PAUSE");
return 0;
}