ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

维吉尼亚密码简介和C/C++语言实现

2022-11-06 13:47:37  阅读:283  来源: 互联网

标签:java 函数 学习 系统 语言 平台 方法 安装 QML c++ 数据


特点

引进了密钥,是一种二维加密

加密流程

将A-Z的26个字母(不区分大小写)进行0~26编号,从第一位开始,每一位:密文=【密钥+明文】mod26。(密钥可循环)

解密流程

跟加密流程逆着来,每一位:明文=【密文-密钥】mod26。(最后取正)

代码

#include"iostream"
using namespace std;
#define MINCHAR 97
#define CHARSUM 26
char table[CHARSUM][CHARSUM];
bool Init();
bool Encode(char* key, char* source, char* dest);
bool Dncode(char* key, char* source, char* dest);
int main()
{
          
   
  if(!Init())
  {
          
   
      cout << "初始化错误!" << endl;
      return 1;
  }
  char key[256];
  char str1[256];
  char str2[256];
  int operation;
  while(1)
  {
          
   
      do
      {
          
   
        cout << "请选择一个操作:1. 加密;2. 解密;-1. 退出
";
        cin >> operation;
      }while(operation != -1 && operation != 1 && operation != 2);
      if(operation == -1)
        return 0;
      else if(operation == 1)//加密
      {
          
   
        cout << "请输入密钥:";
        cin >> key;
        cout << "请输入待加密字符串:";
        cin >> str1;
        Encode(key, str1, str2);
        cout << "加密后的字符串:" << str2 << endl;
      }
      else if(operation == 2)//解密
      {
          
   
        cout << "请输入密钥:";
        cin >> key;
        cout << "请输入待解密字符串:";
        cin >> str1;
        Dncode(key, str1, str2);
        cout << "解密后的字符串:" << str2 << endl;
      }
      cout << endl;
  }
  return 0;
}
// 初始化维吉尼亚方阵
bool Init()
{
          
   
  int i, j;
  for(i = 0; i < CHARSUM; i++)
  {
          
   
      for(j = 0; j < CHARSUM; j++)
      {
          
   
        table[i][j] = 65 + (i + j) % CHARSUM;
      }
  }
  return true;
}
// 加密
// key:密钥
// source:待加密的字符串
// dest:经过加密后的字符串
bool Encode(char* key, char* source, char* dest)
{
          
   
  char* tempSource = source;
  char* tempKey = key;
  char* tempDest = dest;
    do
  {
          
   
      *tempDest = table[(*tempKey) - MINCHAR][(*tempSource) - MINCHAR];
      tempDest++;
      if(!(*(++tempKey)))
        tempKey = key;
  }while(*tempSource++);
    dest[strlen(source)] = 0;
  return true;
}
// 解密
// key:密钥
// source:待解密的字符串
// dest:经过解密后的字符串
bool Dncode(char* key, char* source, char* dest)
{
          
   
  char* tempSource = source;
  char* tempKey = key;
  char* tempDest = dest;
  char offset;
    do
  {
          
   
      offset = (*tempSource) - (*tempKey);
      offset = offset >= 0 ? offset : offset + CHARSUM;
      *tempDest = MINCHAR + offset;
      tempDest++;
      if(!(*(++tempKey)))
        tempKey = key;
  }while(*++tempSource);
  dest[strlen(source)] = 0;
  return true;
}

效果如图:

确定密钥长度m

Kasiski测试法

简介:

Kasiski测试法是由Friedrich Kasiski于1863年给出了其描述,然而早在约1854年这一方法就由Charles Babbage首先发现。它主要基于这样一个事实:两个相同的明文段将加密成相同的密文段,它们的位置间距假设为δ,则δ≡0(mod m)。反过来,如果在密文中观察到两个相同的长度至少为3的密文段,那么将给破译者带来很大方便,因为它们实际上对应了相同的明文串。    使用流程:

搜索长度至少为3的相同的密文段,记下其离起始点的那个密文段的距离。假如得到如下几个距离δ₁,δ₂,…,那么,可以猜测m为这些δi的最大公因子的因子。    例如:

密钥:FORESTFORESTFORESTFORESTFOR   明文:better to do well than to say well   密文: GSKXWKYCUSOXQZKLSGYCJEQPJZC   第一个YC出现后到第二个YC的结尾一共有12个字母,那么密钥的长度应是12的约数1,2,3,4,6,12之中的一个。   当密文很长的时候,可以找出几组重复的密文段,找出它们间距的相同约数,就是密钥长度。

标签:java,函数,学习,系统,语言,平台,方法,安装,QML,c++,数据
来源:

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有