C#凯撒密码的原理与实现
密码的原理与实现
一、 基础知识介绍
凯撒密码的历史
凯撒密码(caeser)是罗马扩张时期朱利斯•凯撒(Julius Caesar)创造的,用于加密通过信使传递的作战命令。它将字母表中的字母移动一定位置而实现加密。
古罗马随笔作家修托尼厄斯在他的作品中披露,凯撒常用一种“密表”给他的朋友写信。这里所说的密表,在密码学上称为“凯撒密表”。用现代的眼光看,凯撒密表是一种相当简单的加密变换,就是把明文中的每一个字母用它在字母表上位置后面的第三个字母代替。古罗马文字就是现在所称的拉丁文,其字母就是我们从英语中熟知的那26个拉丁字母。因此,凯撒密表就是用d代a,用e代b,……,用z代w。这些代替规则也可用一张表格来表示,所以叫“密表”。
当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。
基本原理
在密码学中存在着各种各样的置换方式,但所有不同的置换方式都包含2个相同的元素。密钥和协议(算法)。凯撒密码的密钥是3,算法是将普通字母表中的字母用密钥对应的字母替换。置换加密的优点就在于它易于实施却难于破解. 发送方和接收方很容易事先商量好一个密钥,然后通过密钥从明文中生成密文,即是敌人若获取密文,通过密文直接猜测其代表的意义,在实践中是不可能的。
凯撒密码的加密算法极其简单。其加密过程如下:
在这里,我们做此约定:明文记为m,密文记为c,加密变换记为E(k1,m)(其中k1为密钥),解密变换记为D(k2,m)(k2为解密密钥)(在这里不妨假设k1=k2,记为k)。凯撒密码的加密过程可记为如下一个变换:
c≡m+k mod n (其中n为基本字符个数)
同样,解密过程可表示为:
m≡c+k mod n (其中n为基本字符个数)
对于计算机而言,n可取256或128,m、k、c均为一个8bit的二进制数。显然,这种加密算法极不安全,即使采用穷举法,最多也只要255次即可破译。当然,究其本身而言,仍然是一个单表置换,因此,频率分析法对其仍是有效的。
加密解密算法
凯撒密码的替换方法是通过排列明文和密文字母表,密文字母表示通过将明文字母表向左或向右移动一个固定数目的位置。例如,当偏移量是左移3的时候(解密时的密钥就是3):
明文字母表:ABCDEFGHIJKLMNOPQRSTUVWXYZ
密文字母表:DEFGHIJKLMNOPQRSTUVWXYZABC
使用时,加密者查找明文字母表中需要加密的消息中的每一个字母所在位置,并且写下密文字母表中对应的字母。需要解密的人则根据事先已知的密钥反过来操作,得到原来的明文。例如:
明文:THE QUICK BROWN FOX JUMPSOVER THE LAZY DOG
密文:WKH TXLFN EURZQ IRA MXPSVRYHU WKH ODCB GRJ
恺撒密码的加密、解密方法还能够通过同余数的数学方法进行计算。首先将字母用数字代替,A=0,B=1,...,Z=25。此时偏移量为n的加密方法即为:
E (x)= (x+n) mod 2
解密就是:
D (x)=(x-n) mod 2
二、 环境介绍
编程语言
C#语言
编译环境
Visual Studio 2010
.NET 4.0
操作系统
Windows 7
三、 思路以及算法分析
定义两个字符数组char ch[]和byte array[]用以存放源文和字符移位处理。
定义一个key,表示移位的个数。这是加密解密的关键。
综合考虑到在密表尾部的字母加密或解密的时候会循环移动到密表头部,所以加密、解密语句分别为:
向后移动key:
view plainprint?
int offset = (AscII(sou) + key - AscII("a")) % (AscII("z") - AscII("a") + 1);
tar = Convert.ToChar(offset + AscII("a")).ToString();
向前移动key:
view plainprint?
int offset =(AscII("z") + key - AscII(sou)) % (AscII("z") - AscII("a") + 1);
tar = Convert.ToChar(AscII("z") - offset).ToString();
其中AscII为字符转换方法。
四、 程序功能介绍及结果分析
1.程序功能介绍
a.实现对指定文本文件或字符串中大小写字母进行加密或解密;
b.执行结果显示在目标文件内容区域,并实现对其中内容的保存,
c.可指定的密钥参数
2.程序初始界面
3.程序执行中的界面
4.结果分析
试对明文security进行加密,再将其解密,密钥参数为5:
执行后,输出加密后的密文:xjhzwnyd
输入security的密文xjhzwnyd得到明文security
五、 主要代码
view plainprint?
private int key = 0;
private string str = "";
//加密算法
for (int i = 0; i < str.Length; i++)
{
string sou = ch[i].ToString();
string tar = "";
bool isChar = "abcdefghijklmnopqrstuvwxyz".Contains(sou.ToLower());
boolisToUpperChar = isChar && (sou.ToUpper() == sou);
sou = sou.ToLower();
if (isChar)
{
int offset = (AscII(sou) + key - AscII("a")) % (AscII("z") - AscII("a") + 1);
tar =Convert.ToChar(offset + AscII("a")).ToString();
if(isToUpperChar)
{
tar = tar.ToUpper();
}
}
else
{
tar = sou;
}
strCaesar += tar;
}
//解密算法
for (int i = 0; i <str.Length; i++)
{
string sou = ch[i].ToString();
string tar = "";
bool isChar = "abcdefghijklmnopqrstuvwxyz".Contains(sou.ToLower());
boolisToUpperChar = isChar && (sou.ToUpper() == sou);
sou = sou.ToLower();
if (isChar)
{
int offset = (AscII("z") + key - AscII(sou)) % (AscII("z") - AscII("a") + 1);
tar = Convert.ToChar(AscII("z") - offset).ToString();
if(isToUpperChar)
{
tar = tar.ToUpper();
}
}
else
{
tar = sou;
}
strCaesar += tar;
}
//字符转换
&n
补充:软件开发 , C# ,