鱼C论坛

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

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

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

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

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

x
本帖最后由 qq1242009750 于 2017-11-25 10:00 编辑

                                                                               文章尾部有解释
                                                                             新手上路请多多指教
                                                                    如对步数有疑问请转至步数说明:  传送门                                                                                                                                                                帖子的尾部

加密:

  1. void <typename T1>Encipher(T1 * &head)
  2. {
  3.         char ch = head->Plaintext;
  4.         int key = head->key % 26;        //消除绕环数,找出需要移动次数
  5.         int tmp;

  6.         if (key == 0)
  7.         {
  8.                 return;
  9.         }

  10.         //正数加密
  11.         if (key > 0)
  12.         {
  13.                 //判断是否要回到字母表的前面
  14.                 if (ch + key > 'Z')
  15.                 {
  16.                         //回到字母表前面的算法
  17.                         tmp = 'Z' - ch;                //计算走到 Z 需要多少步数
  18.                         tmp = key - tmp;        //算出还剩下多少步数
  19.                         --tmp;                                //减去 Z 到 A 已走的一步

  20.                         head->Ciphertext = 'A' + tmp;
  21.                 }
  22.                 else
  23.                 {
  24.                         //不需要走到字母表头的算法
  25.                         head->Ciphertext = ch + key;
  26.                 }
  27.         }
  28.         else        //负数加密
  29.         {       
  30.                 //回到字母表的后面
  31.                 if (ch + key < 'A')
  32.                 {
  33.                         tmp = ch - 'A';                //计算走到 'A' 要多少步
  34.                         tmp = key + tmp;        //算出还剩下多少步
  35.                         ++tmp;                                //减去 A 到 Z 已走的一步
  36.                        
  37.                         head->Ciphertext = 'Z' + tmp;
  38.                 }
  39.                 else
  40.                 {
  41.                         //不需要走到字母表头的算法
  42.                         head->Ciphertext = ch + head->key;
  43.                 }
  44.         }

  45.         cout << head->Plaintext << " " << head->key << " " << head->Ciphertext << endl;                //输出加密后的信息
  46. }
复制代码


解密:

  1. void <typename T1>Decription(T1* &head)
  2. {
  3.         T1 *tmp = head;
  4.         int key = tmp->key % 26;        //消除绕环数,找出需要移动次数
  5.         char ch = tmp->Ciphertext;

  6.         if (key == 0)
  7.         {
  8.                 return;
  9.         }

  10.         //密码为正数
  11.         if (key > 0)
  12.         {
  13.                 //判断是否要回到字母表的后面
  14.                 if (ch - key < 'A')
  15.                 {
  16.                         //回到字母表后面的算法
  17.                         key -= ch - 'A';
  18.                         key--;                        //减少 'A' 到 'Z'已走的一步
  19.                         ch = 'Z' - key;
  20.                 }
  21.                 else
  22.                 {
  23.                         //如果不用回到,就直接相减
  24.                         ch = head->Ciphertext - key;
  25.                 }
  26.         }
  27.         else       //密码为负数
  28.         {
  29.                 key = (-key);                        //把密码副本变为正数
  30.                 //判断是否回到字母表的前面
  31.                 if (ch + key > 'Z')       
  32.                 {
  33.                         key = key - 'Z' - ch;        //计算出走到 'Z' 的步数
  34.                         --key;                                        //减去 'A' 到 'Z' 的步数
  35.                         ch = 'A' + key;                        //用'A'加上未走的次数 == Plaintext
  36.                 }
  37.                 else
  38.                 {
  39.                         //如果不用回到,就直接相减
  40.                         ch = head->Ciphertext + key;
  41.                 }
  42.         }

  43.         cout << "解密:" << ch;
  44. }
复制代码


生成随机密码:
  1. int <T1>CreateKey()
  2. {
  3.         int key;
  4.         if (rand() % 2)  //随机产生 -999 到 999密码
  5.         {
  6.                 key = rand() % 999;
  7.         }
  8.         else
  9.         {
  10.                 key = (-rand() % 999);
  11.         }

  12.         return key;
  13. }
复制代码


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

如有错误请大家多多指出!谢谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-18 02:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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