队列应用之密钥存储:
(1)密钥的基础知识:
凯撒加密法是一种简单的消息编码方式,它是按照字母表将消息中的每个字母移动常量的k位,但这种方式极易破解,因为字母的移动只有26种可能。
解决:利用一个密钥值列表,将各个字母移动不同的位数。如果消息比密钥值长,可以从头再使用这个密钥值列表;
(2)举例:密钥列表为:key[]={2,-3,4};消息为message="loveyou";
则加密为:l,o,v分别右移2,-3,4位。然后e,y,o继续右移2,-3,4位。
(3)代码实现:
#include <iostream>
using namespace std;
/*
队列应用之加密,解密;
用两个队列;一个队列作为存储加密的密钥;
另一个队列存储解密的密钥。
*/
#define DEBUG
typedef int ElemType;
class SeQueueType{
public:
int maxSize;
int front;
int rear;
ElemType * array;
public:
SeQueueType(int size){
maxSize=size;
array=new ElemType[maxSize];
front=0;
rear=0;
}
~SeQueueType(){
delete [] array;
}
bool isEmpty(){
if(front==rear)
return true;
return false;
}
bool isFull(){
if((rear+1)%maxSize==front)
return true;
return false;
}
bool push(ElemType elem){
if(isFull()) return false;
array[rear]=elem;
rear=(rear+1)%maxSize;
return true;
}
bool pop(ElemType & elem){
if(isEmpty()) return false;
elem=array[front];
front=(front+1)%maxSize;
return true;
}
bool getFront(ElemType & elem){
if(isEmpty()) return false;
elem=array[front];
return true;
}
int length(){
return (rear-front+maxSize)%maxSize;
}
};
/*获取加密后 的消息*/
void encode(SeQueueType* queue,char* message,int length,char * mess_encode){
ElemType elem;
int i;
for( i=0;i<length&&message[i]!='\0';i++){
queue->pop(elem);
mess_encode[i]=message[i]+elem;
queue->push(elem);
}
mess_encode[i]='\0';
}
/*获取解密后的消息*/
void decode(SeQueueType* queue,char* mess_encode,int length,char * mess_decode){
ElemType elem;
int i;
for( i=0;i<length&&mess_encode[i]!='\0';i++){
queue->pop(elem);
mess_decode[i]=mess_encode[i]-elem;
queue->push(elem);
}
mess_decode[i]='\0';
}
int main()
{
int key[]={1,3,-2,4,5,-6};/*密钥列表*/
int length_key=sizeof(key)/sizeof(key[0]);
char message[]="i love you,china!";/*明文,需要加密的明文*/
cout<<"明文为 : "<<message<<endl;
int length_mess=sizeof(message)/sizeof(message[0]);/*消息长度*/
#ifdef DEBUG
cout<<length_key<<" "<<length_mess<<endl;
#endif
char * mess_encode=new char[length_mess];/*加密后的密文*/
char * mess_decode=new char[length_mess];/*解密后的明文*/
SeQueueType * queue_encode=new SeQueueType(length_key);/*存放加密密钥的队列*/
SeQueueType * queue_decode=new SeQueueType(length_key);/*存放解密密钥的队列*/
for(int i=0;i<length_key;i++)
{/*密钥列表进队列*/
queue_decode->push(key[i]);
queue_encode->push(key[i]);
}
encode(queue_encode,message,length_mess,mess_encode);
cout<<"加密后密文为 : "<<mess_encode<<endl;
decode(queue_decode,mess_encode,length_mess,mess_decode);
cout<<"解密后消息为 : "<<mess_decode<<endl;
cout << "Hello world!" << endl;
return 0;
}