队列应用之密钥存储




队列应用之密钥存储:
(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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值