S22课后作业 Vigenere(维吉尼亚)加密与解密
本帖最后由 qq1242009750 于 2017-11-25 10:00 编辑文章尾部有解释
新手上路请多多指教
如对步数有疑问请转至步数说明:传送门 帖子的尾部
加密:
void <typename T1>Encipher(T1 * &head)
{
char ch = head->Plaintext;
int key = head->key % 26; //消除绕环数,找出需要移动次数
int tmp;
if (key == 0)
{
return;
}
//正数加密
if (key > 0)
{
//判断是否要回到字母表的前面
if (ch + key > 'Z')
{
//回到字母表前面的算法
tmp = 'Z' - ch; //计算走到 Z 需要多少步数
tmp = key - tmp; //算出还剩下多少步数
--tmp; //减去 Z 到 A 已走的一步
head->Ciphertext = 'A' + tmp;
}
else
{
//不需要走到字母表头的算法
head->Ciphertext = ch + key;
}
}
else //负数加密
{
//回到字母表的后面
if (ch + key < 'A')
{
tmp = ch - 'A'; //计算走到 'A' 要多少步
tmp = key + tmp; //算出还剩下多少步
++tmp; //减去 A 到 Z 已走的一步
head->Ciphertext = 'Z' + tmp;
}
else
{
//不需要走到字母表头的算法
head->Ciphertext = ch + head->key;
}
}
cout << head->Plaintext << " " << head->key << " " << head->Ciphertext << endl; //输出加密后的信息
}
解密:
void <typename T1>Decription(T1* &head)
{
T1 *tmp = head;
int key = tmp->key % 26; //消除绕环数,找出需要移动次数
char ch = tmp->Ciphertext;
if (key == 0)
{
return;
}
//密码为正数
if (key > 0)
{
//判断是否要回到字母表的后面
if (ch - key < 'A')
{
//回到字母表后面的算法
key -= ch - 'A';
key--; //减少 'A' 到 'Z'已走的一步
ch = 'Z' - key;
}
else
{
//如果不用回到,就直接相减
ch = head->Ciphertext - key;
}
}
else //密码为负数
{
key = (-key); //把密码副本变为正数
//判断是否回到字母表的前面
if (ch + key > 'Z')
{
key = key - 'Z' - ch; //计算出走到 'Z' 的步数
--key; //减去 'A' 到 'Z' 的步数
ch = 'A' + key; //用'A'加上未走的次数 == Plaintext
}
else
{
//如果不用回到,就直接相减
ch = head->Ciphertext + key;
}
}
cout << "解密:" << ch;
}
生成随机密码:
int <T1>CreateKey()
{
int key;
if (rand() % 2)//随机产生 -999 到 999密码
{
key = rand() % 999;
}
else
{
key = (-rand() % 999);
}
return key;
}
算法思想如下:
如有错误请大家多多指出!谢谢!
页:
[1]