zoukankan      html  css  js  c++  java
  • 古典密码-凯撒密码原理以及代码

    古典密码--->凯撒密码

    一丶凯撒密码

    1.1 什么是凯撒密码

    凯撒密码,想必很多人听说过.没听说过的简单说一下.

    相传在很久很久以前,有一位皇帝,叫做 尤利乌斯 · 凯撒 为了缩短名字,我们称为凯撒大帝.是在公元前100年左右单身与古罗马,是一名著名的军事统帅.由它发明的密码.叫做凯撒密码

    1.2 凯撒密码的加密原理

    凯撒密码其实很简单. 需要我们理解 平移概念 ,就是将 一段数据 平移多少位, 最后解密的时候进行反平移即可得出.

    以字母 a-z来说 我们将a 进行平移3位得出密文

    如下图:

    a 平移三位,得出 D b则是E 以此类推. 如果到达末尾,则从头开始. 例如Z 是字母的末尾.平移三位则是 C

    那么由此得出公式

    密文 = 函数(明文 + 平移位数(key) Mod 26;

    明文 = 函数(密文 - 平移位数(key) mod 26;

    其中 密文 明文 函数 平移位数 等都是有英文含义的.

    所以我们很多时候都能看到如下写法

    c = E(p + k) mod 26
    
    p = D(c - k) mod 26
    
    C  = Ciphertext    英文意思 是密码密文的意思
    p =  plainttext    英文意思 是明文的意思,也就是未加密之前的数据
    E =  encrypt       英文的意思是加密的意思. 放在我们编程中则可以理解为是一个方法.专门用于加密的方法
    D =  Decrypt       英文意思是 解密的意思  同加密一样
    k  = key           英文意思是钥匙的意思. 也就是解密的钥匙或者加密的钥匙
    mod  数学上  取余数的意思  10 % 2 == 0 取得余数为0
    

    综上所述,大概是了解以下基本的术语

    密文 = 加密函数(明文 + key) % 26

    明文 = 解密函数(密文 - key) % 26

    1.3 凯撒密码的破解

    其实凯撒密码是非常好破解的. 假设你不知道明文.只知道密文.那么总是可以尝试出来的. 总共是26次.依次破解. 我们常听的暴力破解就是这个意思. 也称为穷举

    那怎么知道凯撒密码破解出来是否正确. 是这样的. 明文一般都是有意义的.当你用密文破解的时候会出现很多无意义的数据.而有些数据是很有意义的.所以我可推断以下.假设不是.那么总过26组破解密码.一个一个尝试也能知道的.

    二丶凯撒密码代码编写

    2.1 C/C++代码,编写加解密函数

    既然我们知道了公式

    c = e(p + k) % 26

    那么我们根据公式来即可

    代码

    void Entrypt(IN char* PlaintText, IN int PlaintTextSize, OUT char* CipText)
    {
    	//加密PlaintText
    
    	for (auto i = 0; i < PlaintTextSize; i++)
    	{
    		/*
    		1.首先字符 - 字符'a'得出下标.
    		2.下标 + 则是代表假面
    		3.如果是加密,怎么下标不能超过26. 所以 % 26
    		4.计算完的结果 加上'a' 就等于实际加密的密文了
    		*/
    		char ch = (PlaintText[i] - 'a' + 3);  //得出下标
    		char ch1 = ch  % 26 + 'a';          //得出实际密文
    
    		//接受的密文数组
    		CipText[i] = ch1;
    
    	}
    	return;
    }
    
    //解密数据,与加密相反
    void Detrypt(IN char* CipText, IN int CipTextSize, OUT char* PlaintText)
    {
    	//加密PlaintText
    
    	for (auto i = 0; i < CipTextSize; i++)
    	{
    		/*
    		1.首先字符 - 字符'a'得出下标.
    		2.下标 - 则是代表解密
    		3.如果是- 则会出现复数情况, 如 a的下标为0  a - 3  = 负数. 那么需要加26进行调整. 调整之后是绝对不会超过26的
    		4.虽然不会超过.但是也要 % 26.因为如果是正数的情况,如果你加26那么还是会超过26
    		*/
    		char ch = (CipText[i] - 'a' - 3);  //得出下标
    		char ch1 = (ch + 26);         //负数调整,
    		char ch3 = ch1 % 26 + 'a';   //正数 % 26得出下标,下标 + 'a'
    		//接受的密文数组
    		PlaintText[i] = ch3;
    
    	}
    	return;
    }
    int main()
    {
    	//c = entrypt(p + k) % 26
    	//char szBuffer[] = "ibinary";
    	char PlaintText[] = "ibinary";
    	char CipText[8] = { 0 };
    	char PlanitText1[8] = { 0 };
    
    	Entrypt(PlaintText, strlen(PlaintText), CipText);
    	printf("加密明文后的密文 = %s 
    ", CipText);
    
    
    	Detrypt(CipText, strlen(CipText), PlanitText1);
    	printf("解密密文后的明文 = %s 
    ", PlanitText1);
    
    	system("pause");
    	return 0;
    }
    
  • 相关阅读:
    python3.6.4源码安装
    centos 6 中恢复删除的文件
    mysql5.6.8源码安装
    zookeeper集群搭建
    vmware 12中安装苹果系统
    docker被入侵后.............
    关于docker
    关于redis
    人生的价值 幸福感
    c# 泛型
  • 原文地址:https://www.cnblogs.com/iBinary/p/12773888.html
Copyright © 2011-2022 走看看