/*
***********************
置换加密
*/
#include <iostream>
#include <string>
using namespace std;
//获取置换序列
void GetSequence(string key,int len,int *a)
{
// int *a = new int[len]; //数组a存放置换序列
for (int i=0; i<len; ++i)
{
a[i] = i+1;
}
//选择排序获取密钥的置换序列
int k = 0;
string akey = key; //拷贝一份密钥,进行操作,不改变原密钥
for (int i=0; i<len; ++i)
{
k = i;
for (int j=i+1; j<len; ++j)
{
if (akey[k] > akey[j])
{
k = j;
}
}
if (k != i)
{
char ch;
ch = akey[k];
akey[k] = akey[i];
akey[i] = ch;
int temp = 0;
temp = a[k];
a[k] = a[i];
a[i] = temp;
}
}
}
string cipher(string context,string key,int *a)
{
string ciphertext = context;
int len = key.length();
int row = context.length()/key.length();
// cout<<row<<endl;
for (int i=0; i<row; ++i)
{
for (int j=0; j<len; ++j)
{
ciphertext[j+i*len] = context[(a[j]-1)+i*len];
}
}
cout<<ciphertext<<endl;
return ciphertext;
}
string decipher(string ciphertext,string key,int *a)
{
string context = ciphertext;
int len = key.length();
int row = ciphertext.length()/key.length();
// cout<<row<<endl;
for (int i=0; i<row; ++i)
{
for (int j=0; j<len; ++j)
{
context[(a[j]-1)+i*len] = ciphertext[j+i*len];
}
}
cout<<context<<endl;
return context;
}
void main()
{
string key; //密钥
string context; //明文
string ciphertext; //密文
// string app; //需要增补的空格
int len = 0; //密钥的长度
int num = 0; //需要增补的空格的个数
cout<<"请输入密钥"<<endl;
getline(cin,key);
// cout<<key<<endl;
len = key.length();
cout<<"请输入明文"<<endl;
getline(cin,context);
// cout<<context<<endl;
ciphertext = context;
num = context.length()%len;
if (num != 0)
{
num = len - num;
string app(num,'*');
cout<<app<<endl;
context += app;
ciphertext = context;
}
int *a = new int[len]; //存放密钥的序列
GetSequence(key,len,a);
ciphertext = cipher(context,key,a); //加密处理
context = decipher(ciphertext,key,a); //解密;
}
信息安全的古典加密之替代加密算法和置换加密算法C/C++实现
4星 · 超过85%的资源 需积分: 18 194 浏览量
2012-04-30
12:10:18
上传
评论 9
收藏 1KB RAR 举报
xqcjames
- 粉丝: 3
- 资源: 25
- 1
- 2
前往页