说起来有点伤心,一个月前写的轮转密码机源码忘记保存被我删了,心痛的不行。因为第一次写密码机写了一早上,调试了一下午才搞好。虽然不难,但是那时候我刚接触链表结构,还不是很熟悉,各种野指针,内存错误。
索性就重写了一份,有了写DES加密算法学到的经验,写起轮转密码机2.0轻松了太多,开头写上函数原型,各种小函数先写好,再去类中修改掉上次出错的野指针问题。这次代码量比上次少了大概一半。加上调试一共花了2个半小时
最后还是遇到个很棘手的问题,算密码的时候总是出现访问权限异常的问题,慢慢调试,发现first指针在访问类中的加密函数的时候是null,以为是first权限私有的问题,改完还是有问题,慢慢调试看到构造函数走完了对象的this指针还是全是null,也就是他根本没被构造出来,很奇怪,最后发现问题出在第一次写的构造函数上,first是成员变量,结果在构造函数中我又定义了一个成员变量也叫first,导致真正的first没被初始化。这个问题搞了半天,还好搞好了。
mw.h:
#include "Node.h"
class sw:public Node
{
private:
Node *first;
public:
sw();
~sw();
void run();
int Encrypt(int index);
};
sw::sw()
{
first=new Node; //一开始写成了Node *first=new Node。当然没法正常初始化了
first->lnum=24;
first->rnum=21;
first->link=first;
Node* p=first;
p->link=new Node;
p->link->lnum=25;
p->link->rnum=3;
p=p->link;
p->link=new Node;
p->link->lnum=26;
p->link->rnum=15;
p=p->link;
p->link=new Node;
p->link->lnum=1;
p->link->rnum=1;
p=p->link;
p->link=new Node;
p->link->lnum=2;
p->link->rnum=19;
p=p->link;
p->link=new Node;
p->link->lnum=3;
p->link->rnum=10;
p=p->link;
p->link=new Node;
p->link->lnum=4;
p->link->rnum=14;
p=p->link;
p->link=new Node;
p->link->lnum=5;
p->link->rnum=26;
p=p->link;
p->link=new Node;
p->link->lnum=6;
p->link->rnum=20;
p=p->link;
p->link=new Node;
p->link->lnum=7;
p->link->rnum=8;
p=p->link;
p->link=new Node;
p->link->lnum=8;
p->link->rnum=16;
p=p->link;
p->link=new Node;
p->link->lnum=9;
p->link->rnum=7;
p=p->link;
p->link=new Node;
p->link->lnum=10;
p->link->rnum=22;
p=p->link;
p->link=new Node;
p->link->lnum=11;
p->link->rnum=4;
p=p->link;
p->link=new Node;
p->link->lnum=12;
p->link->rnum=11;
p=p->link;
p->link=new Node;
p->link->lnum=13;
p->link->rnum=5;
p=p->link;
p->link=new Node;
p->link->lnum=14;
p->link->rnum=17;
p=p->link;
p->link=new Node;
p->link->lnum=15;
p->link->rnum=9;
p=p->link;
p->link=new Node;
p->link->lnum=16;
p->link->rnum=12;
p=p->link;
p->link=new Node;
p->link->lnum=17;
p->link->rnum=23;
p=p->link;
p->link=new Node;
p->link->lnum=18;
p->link->rnum=18;
p=p->link;
p->link=new Node;
p->link->lnum=19;
p->link->rnum=2;
p=p->link;
p->link=new Node;
p->link->lnum=20;
p->link->rnum=25;
p=p->link;
p->link=new Node;
p->link->lnum=21;
p->link->rnum=6;
p=p->link;
p->link=new Node;
p->link->lnum=22;
p->link->rnum=24;
p=p->link;
p->link=new Node;
p->link->lnum=23;
p->link->rnum=13;
p->link->link=first;
}
sw::~sw()
{
Node *q=first;
for(int i=0;i<26;i++) //使得q指向最后一个
{
q=q->link;
}
q->link=NULL;
//将单项循环链表转换为非循环链表
Node *p=first;
while(first)
{
p=first->link;
delete first;
first=p;
}
}
void sw::run()
{
for(int i=0;i<25;i++)
{
first=first->link;
}
}
int sw::Encrypt(int index)
{
int rindex=0;
Node *p=first;
Node *q=first;
if(index!=0)
{
for(int i=0;i<index;i++) //p指向第index个元素
{
p=p->link;
}
}
while(q->rnum!=p->lnum)
{
q=q->link;
rindex++;
}
return rindex;
}
mw.h:
#include "Node.h"
class mw:public Node
{
private:
Node *first;
public:
mw();
~mw();
int Encrypt(int index);
void run();
};
mw::mw()
{
first=new Node;
first->lnum=26;
first->rnum=20;
first->link=first;
Node *p=first;
p->link=new Node;
p->link->lnum=1;
p->link->rnum=1;
p=p->link;
p->link=new Node;
p->link->lnum=2;
p->link->rnum=6;
p=p->link;
p->link=new Node;
p->link->lnum=3;
p->link->rnum=4;
p=p->link;
p->link=new Node;
p->link->lnum=4;
p->link->rnum=15;
p=p->link;
p->link=new Node;
p->link->lnum=5;
p->link->rnum=3;
p=p->link;
p->link=new Node;
p->link->lnum=6;
p->link->rnum=14;
p=p->link;
p->link=new Node;
p->link->lnum=7;
p->link->rnum=12;
p=p->link;
p->link=new Node;
p->link->lnum=8;
p->link->rnum=23;
p=p->link;
p->link=new Node;
p->link->lnum=9;
p->link->rnum=5;
p=p->link;
p->link=new Node;
p->link->lnum=10;
p->link->rnum=16;
p=p->link;
p->link=new Node;
p->link->lnum=11;
p->link->rnum=2;
p=p->link;
p->link=new Node;
p->link->lnum=12;
p->link->rnum=22;
p=p->link;
p->link=new Node;
p->link->lnum=13;
p->link->rnum=19;
p=p->link;
p->link=new Node;
p->link->lnum=14;
p->link->rnum=11;
p=p->link;
p->link=new Node;
p->link->lnum=15;
p->link->rnum=18;
p=p->link;
p->link=new Node;
p->link->lnum=16;
p->link->rnum=25;
p=p->link;
p->link=new Node;
p->link->lnum=17;
p->link->rnum=24;
p=p->link;
p->link=new Node;
p->link->lnum=18;
p->link->rnum=13;
p=p->link;
p->link=new Node;
p->link->lnum=19;
p->link->rnum=7;
p=p->link;
p->link=new Node;
p->link->lnum=20;
p->link->rnum=10;
p=p->link;
p->link=new Node;
p->link->lnum=21;
p->link->rnum=8;
p=p->link;
p->link=new Node;
p->link->lnum=22;
p->link->rnum=21;
p=p->link;
p->link=new Node;
p->link->lnum=23;
p->link->rnum=9;
p=p->link;
p->link=new Node;
p->link->lnum=24;
p->link->rnum=26;
p=p->link;
p->link=new Node;
p->link->lnum=25;
p->link->rnum=17;
p->link->link=first;
this->first=first;
}
mw::~mw()
{
Node *q=first;
for(int i=0;i<26;i++) //使得q指向最后一个
{
q=q->link;
}
q->link=NULL;
/*将单项循环链表转换为非循环链表*/
Node *p=first;
while(first)
{
p=first->link;
delete first;
first=p;
}
}
void mw::run()
{
for(int i=0;i<25;i++)
{
first=first->link;
}
}
int mw::Encrypt(int index)
{
int rindex=0;
Node *p=first;
Node *q=first;
if(index!=0)
{
for(int i=0;i<index;i++) //p指向第index个元素
{
p=p->link;
}
}
while(q->rnum!=p->lnum)
{
q=q->link;
rindex++;
}
return rindex;
}
qw.h
#include "Node.h"
class qw:public Node
{
private:
Node *first;
public:
qw();
~qw();
void run();
int Encrypt(int index);
};
qw::qw()
{
first=new Node;
first->lnum=1;
first->rnum=8;
first->link=first;
Node *p=first;
p->link=new Node;
p->link->lnum=2;
p->link->rnum=18;
p=p->link;
p->link=new Node;
p->link->lnum=3;
p->link->rnum=26;
p=p->link;
p->link=new Node;
p->link->lnum=4;
p->link->rnum=17;
p=p->link;
p->link=new Node;
p->link->lnum=5;
p->link->rnum=20;
p=p->link;
p->link=new Node;
p->link->lnum=6;
p->link->rnum=22;
p=p->link;
p->link=new Node;
p->link->lnum=7;
p->link->rnum=10;
p=p->link;
p->link=new Node;
p->link->lnum=8;
p->link->rnum=3;
p=p->link;
p->link=new Node;
p->link->lnum=9;
p->link->rnum=13;
p=p->link;
p->link=new Node;
p->link->lnum=10;
p->link->rnum=11;
p=p->link;
p->link=new Node;
p->link->lnum=11;
p->link->rnum=4;
p=p->link;
p->link=new Node;
p->link->lnum=12;
p->link->rnum=23;
p=p->link;
p->link=new Node;
p->link->lnum=13;
p->link->rnum=5;
p=p->link;
p->link=new Node;
p->link->lnum=14;
p->link->rnum=24;
p=p->link;
p->link=new Node;
p->link->lnum=15;
p->link->rnum=9;
p=p->link;
p->link=new Node;
p->link->lnum=16;
p->link->rnum=12;
p=p->link;
p->link=new Node;
p->link->lnum=17;
p->link->rnum=25;
p=p->link;
p->link=new Node;
p->link->lnum=18;
p->link->rnum=16;
p=p->link;
p->link=new Node;
p->link->lnum=19;
p->link->rnum=19;
p=p->link;
p->link=new Node;
p->link->lnum=20;
p->link->rnum=6;
p=p->link;
p->link=new Node;
p->link->lnum=21;
p->link->rnum=15;
p=p->link;
p->link=new Node;
p->link->lnum=22;
p->link->rnum=21;
p=p->link;
p->link=new Node;
p->link->lnum=23;
p->link->rnum=2;
p=p->link;
p->link=new Node;
p->link->lnum=24;
p->link->rnum=7;
p=p->link;
p->link=new Node;
p->link->lnum=25;
p->link->rnum=1;
p=p->link;
p->link=new Node;
p->link->lnum=26;
p->link->rnum=14;
p->link->link=first;
}
qw::~qw()
{
Node *q=first;
for(int i=0;i<26;i++) //使得q指向最后一个
{
q=q->link;
}
q->link=NULL;
/*将单项循环链表转换为非循环链表*/
Node *p=first;
while(first)
{
p=first->link;
delete first;
first=p;
}
}
void qw::run()
{
for(int i=0;i<25;i++)
{
first=first->link;
}
}
int qw::Encrypt(int index)
{
int rindex=0;
Node *p=first;
Node *q=first;
if(index!=0)
{
for(int i=0;i<index;i++) //p指向第index个元素
{
p=p->link;
}
}
while(q->rnum!=p->lnum)
{
q=q->link;
rindex++;
}
return rindex;
}
main.cpp
#include "sw.h"
#include "mw.h"
#include "qw.h"
#include <string>
void Encrypt(const char In);
void Run();
int currentIndx=0;
sw s1;
mw m1;
qw q1;
void Encrypt(const char In)
{
char x;
int slnum=In-65;
int srnum;
srnum=s1.Encrypt(slnum);
int mrnum;
mrnum=m1.Encrypt(srnum);
int qrnum;
qrnum=q1.Encrypt(mrnum);
x='A'+qrnum;
cout<<x;
Run();
}
void Run()
{
q1.run();
currentIndx++;
if(currentIndx%26==0)
{
m1.run();
if(currentIndx%676==0)
{
s1.run();
}
}
}
int main()
{
char *mingwen=new char[128];
cout<<"please input the string you want to encrypt"<<endl;
cin>>mingwen;
for(int i=0;i<strlen(mingwen);i++)
{
Encrypt(mingwen[i]);
}
cout<<endl;
return 0;
}
测试:
明文“THE STORY OF THE THREE LITTLE PIGS”
密文“JLX EBOZF IB IPV ARANK SKXMGZ QFOO”