C++实现单置换密码

单表置换密码的C++代码实现,供大家参考,具体内容如下

本程序使用方法:需要在本程序所在的文件夹创建一个"密码学.txt"文档。

该程序所需要的数据全部由该文档提供,然后运行即可得到结果,如需要修改数据,必须从文档中人工修改
文档格式的要求:文档总共包含两行。第一行由一个1或2的数字和一个字符串组成,数字1代表加密,2代表解密,字符串表示密钥
第二行仅包含一个字符串,这个字符串是需要加密或解密的内容。
该程序运行结果直接由控制台输出

运行结果:

代码:

#include<iostream>
#include<string>
#include<fstream>
using namespace std;

ifstream in("密码学.txt");

void JiaMi(char ZhiHuan[]);   //加密函数
void JieMi(char ZhiHuan[]);   //解密函数
void setZhiHuan(char ZhiHuan[],char fanZhiHuanBiao[]);  //设置置换表函数
int main()
{
 int m;    //确定是加密或解密?加密为1,解密为2
 char ZhiHuanBiao['z'+1];   //正向置换表,加密时用
 char fanZhiHuanBiao['Z'+1];  //反向置换表,解密时用
 cout<<"加密按输入1,解密输入2"<<endl;
 in>>m;    //读入m
 setZhiHuan(ZhiHuanBiao, fanZhiHuanBiao); //设置置换表
 switch(m) //判断m值,执行相应的功能
 {
 case 1: JiaMi(ZhiHuanBiao);break;
 case 2: JieMi(fanZhiHuanBiao);break;
 default:break;
 }
 return 0;
}

void JiaMi(char ZhiHuan[]) //加密
{
 string MingWen;  //保存明文
 cout<<endl<<"请输入明文:";
 getline(in,MingWen); //读入明文
 cout<<MingWen<<endl;
 cout<<"加密后的密文为:"<<endl;
 for(int i=0; i<MingWen.length(); i++) //直接利用置换表输出密文
 {
 if(MingWen[i]>='a' && MingWen[i]<='z')
 cout<<ZhiHuan[ MingWen[i] ];
 else cout<<MingWen[i];
 }
 cout<<endl;
}

void JieMi(char fanZhiHuan[])
{
 string MiWen;  //保存密文
 cout<<endl<<"请输入密文:";
 getline(in,MiWen); //读入密文
 cout<<MiWen<<endl;
 cout<<"解密后的明文为:"<<endl;
 for(int i=0; i<MiWen.length(); i++) //直接利用反置换表输出明文
 {
 if(MiWen[i]>='A' && MiWen[i]<='Z')
 cout<<fanZhiHuan[ MiWen[i] ];
 else cout<<MiWen[i];
 }
 cout<<endl;
}

void setZhiHuan(char ZhiHuanBiao[],char fanZhiHuanBiao[])
{
 int i;  //i和j是循环变量,除此之外没有任何意义
 char j;
 string s;  //密钥
 cout<<"请输入密钥(大写):";
 getline(in,s); //读入密钥
 cout<<s<<endl; //输出密钥
 cout<<"置换表为:"<<endl;
 string s1;
 for(i = 0 ; i < s.length();i++) //对密钥进行处理(去掉空格和重复的字符)
 {
 bool sign =0;  //标志变量
 if(s[i] >= 'A' && s[i] <='Z')
 {
 for(int j = 0; j < s1.length();j++)
 {
 if(s[i] == s1[j])
 {
  sign = 1;
  break;
 }
 }
 if(sign == 0) s1 = s1 + s[i];
 else sign = 0;
 }
 }
 for( j ='a';j<='z';j++)cout<<j<<" ";cout<<endl; //输出小写字母 从a到z
 char ch='A';
 for( i = 'a' ;i <= 'z'; i++) //该循环利用密钥得到置换表
 {
 if(i < 'a' + s1.length()) //前面直接用s1代替
 {
 ZhiHuanBiao[i] = s1[i-'a'];
 }
 else //后面将剩下的"贴"上去
 {

 for(int j = 'a'; j < 'a' + s1.length(); j++)
 {
 if(ch == ZhiHuanBiao[j])
 {
  ch++;
  j= 'a'; //每次都从头开始搜索
  continue;
 }
 }
 ZhiHuanBiao[i] = ch;
  ch++;
 }
 cout<<ZhiHuanBiao[i]<<" "; //同时输出置换表
 }
 cout<<endl;
 for( i='a'; i<= 'z'; i++) //该循环利用置换表得到反置换表
 {
 fanZhiHuanBiao[ ZhiHuanBiao[i] ] = i;
 }
 for( i='A'; i<= 'Z'; i++) //输出反置换表
 {
 cout<< fanZhiHuanBiao[i] <<" ";
 }
 cout<<endl;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C++获取特定进程CPU使用率的实现代码

    近来发现笔记本在关闭屏幕后风扇转得特别快,打开屏幕后看任务管理器,风扇马上减速,也没有发现大量占用CPU的进程.于是想写一个小程序在后台记录每个进程的CPU使用情况,揪出锁屏后占用CPU的进程.于是自己写了一个C++类CPUusage,方便地监视不同进程的CPU占用情况.本人编程还只是个新手,如有问题请多多指教( •̀ ω •́ )! 计算原理为调用GetProcessTimes(),与上次调用得到的结果相减得到CPU占用时间,再除以两次调用的时间差,从而得到占用百分比.其中OpenProces

  • C++获取MD5算法实现代码

    这个是网上扒下来的 作者已经无法知道是谁了 MD5.h #ifndef MD5_H #define MD5_H #include <string> #include <fstream> /* Type define */ typedef unsigned char byte; typedef unsigned int uint32; typedef unsigned int uint4; using std::string; using std::ifstream; /* MD5

  • C++中map和vector作形参时如何给定默认参数?

    map和vector都可以用operator[]进行访问,map是用[]中的数据作为key进行查询,而vector是用[]中的数作为下标进行访问. 如果在用operator[]进行访问的时候出现了越界情况,即map没有这个键值对,或vector的大小小于下标数值,会发生什么情况? struct node{int a{5};}; int main() { map<string,node> m1; cout<<m1["s"].a<<endl; map&l

  • 用C/C++代码检测ip能否ping通(配合awk和system可以做到批量检测)

    遇到一个小需求, 快速搞定. 来看看用C/C++代码检测ip能否ping通: #include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> using namespace std; string getCmdResult(const string &strCmd) // 这个是获取命令执行的结果, 类似于

  • C/C++格式化日志库实现代码

    头文件如下: /*****************************************************/ /* 跨平台日志函数,Linux下与windows下亲测有效 */ /*****************************************************/ #ifndef _LOG_FORMAT_H_ #define _LOG_FORMAT_H_ // 日志等级 enum LogLevel { _LOG_TRACE, _LOG_INFO, _LOG

  • c++文件监控之FileSystemWatcher

    具体代码如下: #using <System.dll> #include <iostream> using namespace std; using namespace System; using namespace System::IO; using namespace System::Security::Permissions; public ref class Watcher { private: // Define the event handlers. static vo

  • C++单例类模板详解

    单例类 描述 指在整个系统生命期中,一个类最多只能有一个实例(instance)存在,使得该实例的唯一性(实例是指一个对象指针)  , 比如:统计在线人数 在单例类里,又分为了懒汉式和饿汉式,它们的区别在于创建实例的时间不同: 懒汉式 : 指代码运行后,实例并不存在,只有当需要时,才去创建实例(适用于单线程) 饿汉式 : 指代码一运行,实例已经存在,当时需要时,直接去调用即可(适用于多线程) 用法 将构造函数的访问属性设置为private, 提供一个GetInstance()静态成员函数,只能供

  • 基于C++11的threadpool线程池(简洁且可以带任意多的参数)

    C++11 加入了线程库,从此告别了标准库不支持并发的历史.然而 c++ 对于多线程的支持还是比较低级,稍微高级一点的用法都需要自己去实现,譬如线程池.信号量等.线程池(thread pool)这个东西,在面试上多次被问到,一般的回答都是:"管理一个任务队列,一个线程队列,然后每次取一个任务分配给一个线程去做,循环往复." 貌似没有问题吧.但是写起程序来的时候就出问题了. 废话不多说,先上实现,然后再啰嗦.(dont talk, show me ur code !) 代码实现 #pra

  • C++11获取线程返回值的实现代码

    C++11 std::future and std::promise 在许多时候,我们会有这样的需求--即我们想要得到线程返回的值. 但是在C++11 多线程中我们注意到,std::thread对象会忽略顶层函数的返回值. 那问题来了,我们要怎么获得线程的返回值呢? 我们通过一个例子来说明如何实现这个需求. 假设我们的app会创建一个线程来压缩一个文件夹,该线程在压缩完文件夹后会返回压缩文件 *.zip 和这个zip文件的大小,我们现在就想获得这个线程的返回值. 有两种方法可以实现这个需求: 1

  • C++中rapidjson组装map和数组array的代码示例

    rapidjson组装map和数组array的代码示例 直接上码: #include <iostream> #include <map> // 请自己下载开源的rapidjson #include "rapidjson/prettywriter.h" #include "rapidjson/rapidjson.h" #include "rapidjson/document.h" #include "rapidjs

随机推荐