qq1242009750 发表于 2017-11-24 19:35:02

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]
查看完整版本: S22课后作业 Vigenere(维吉尼亚)加密与解密