C++实现转轮密码机

说起来有点伤心,一个月前写的轮转密码机源码忘记保存被我删了,心痛的不行。因为第一次写密码机写了一早上,调试了一下午才搞好。虽然不难,但是那时候我刚接触链表结构,还不是很熟悉,各种野指针,内存错误。
索性就重写了一份,有了写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”

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值