鱼C论坛

 找回密码
 立即注册
查看: 2779|回复: 0

[学习笔记] S22课后作业 Vigenere(维吉尼亚)加密与解密

[复制链接]
发表于 2017-11-24 19:35:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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;
}

算法思想如下:
加密解密思想.png

如有错误请大家多多指出!谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 00:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表