虽然说开通博客已经很久了,也写了一些文章,但是在自己看来没有什么干货都是些水文,内容比较散,有一种打游击的感觉。不过如果说作为一种总结,习惯,笔记,那也达到了目的。前面一段时间花在网络编程,后面的书看着看着有点难以看下去的感觉了。突然在笨牛书店看到《现代密码学教程》,挺感兴趣的,这几天网络编程的学习也就搁下了,打算先把这本看完再接着看下去吧。
置换密码又称换位密码,是根据一定的规则重新排列明文,以便打破明文的结构特性。置换密码的特点是保持明文的 所有字符不变,只是利用置换打乱了明文字符的位置和次序。也就是说,改变了明文的结构,不改变明文的内容。
一、列置换密码(明文遵照密钥的规程按列换位并且按列读出序列得到密文 )
实例:
已知信息:明文p=【Beijing 2008 Olympic Games】,密钥k=(143)(56)。
求解:加密过程:首先将明文p写成【Beijing2008OlympicGames】得到23个字符,写成一个4*6的矩阵。也要将密钥k写成矩阵形式出来,方便理解,以后熟悉了,其实可以省去这个步骤的。
k=
1 2 3 4 5 6
4 2 1 3 6 5
P=
B e i J i n
g 2 0 0 8 O
l y m p i c
G a m e s
M=
i e j B n i
0 2 0 g O 8
m y p l c i
m a e G s
代码:
/***********************************************************/
// 程序目的:列置换密码
// 日期: 2014-12-19
// 作者: spencer_chong
// 邮箱: zhuangxb91@qq.com
/***********************************************************/
#include <stdio.h>
#define col 6
int row;
int* key;
//明文
char plaintext[100]={32};
char *ptemp=plaintext;
//密文
char cipher[100][col]={32};
char c[100]={32};
//操作函数
int* getkey(char*k);
void encrypt(char*p,int* k);
char* printCipher(char cipher[100][col]);
int main ()
{
//加密
char* plain;
char k[100];
char p[100]={32};
char* ciphertext;
int i,j;
//输入密钥k
gets(k);
//输入明文p
gets(p);
key=getkey(k);
encrypt(p,key);
ciphertext=printCipher(cipher);
}
int* getkey(char* pointerK){
int temp[100];
int* ktemp=temp;
int i;
int t=0;
for(i=0;i<100;i++)
temp[i]=i;
//分析密钥,得到矩阵ktemp
do{
if(*pointerK=='(')
continue;
else{
t=*pointerK-'0';
while(*(pointerK+1)!=')'){
ktemp[*pointerK-'0']=*(pointerK+1)-'0';
pointerK++;
}
ktemp[*pointerK-'0']=t;
pointerK++;
}
} while(*(++pointerK)!='\0');
return ktemp;
}
void encrypt(char * p,int* k){
int totalLength=0;
int i,j;
while(*p!='\0'){
if(*p!=32){
*(ptemp+totalLength)=*p;
totalLength++;
}
p++;
}
row=totalLength/col+1;
for(i=0;i<row;i++){
for(j=0;j<col;j++){
cipher[i][*(k+j+1)-1]=*(ptemp+i*col+j);
}
}
}
char* printCipher(char cipher[][col]){
int i,j;
for(i=0;i<col;i++){
for(j=0;j<row;j++){
printf("%c",cipher[j][i]);
c[i*row+j]=cipher[j][i];
}
}
return c;
}
二、周期置换密码(将明文P按固定长度m分组,然后对每组 按 的某个置换重排位置从而得到密文C) ;