using System.Text;

namespace Cipher.Algorithm
{
static class Caesar
{
static public string Encrypt(string input, int key)
{
StringBuilder sb = new StringBuilder();
for(int i = ; i < input.Length; ++i)
{
if ('a' <= input[i] && input[i] <= 'z')
{
sb.Append((char)((input[i] - 'a' + key + ) % + 'a'));
}
else if ('A' <= input[i] && input[i] <= 'Z')
{
sb.Append((char)((input[i] - 'A' + key + ) % + 'A'));
}
else
{
sb.Append(input[i]);
}
}
return sb.ToString();
} static public string Decrypt(string input, int key)
{
StringBuilder sb = new StringBuilder();
for (int i = ; i < input.Length; ++i)
{
if ('a' <= input[i] && input[i] <= 'z')
{
sb.Append((char)((input[i] - 'a' - key + ) % + 'a'));
}
else if ('A' <= input[i] && input[i] <= 'Z')
{
sb.Append((char)((input[i] - 'A' - key + ) % + 'A'));
}
else
{
sb.Append(input[i]);
}
}
return sb.ToString();
}
}
}
using System;
using System.Text; namespace Cipher.Algorithm
{
public class Hill
{
// 矩阵阶数
private int _level;
// 加密矩阵
private long[][] _matrix;
// 解密矩阵
private long[][] _inverseMatrix = null; private int _times = ; // 用于填充的无效字符
const char INVALID_CHAR = 'A'; /// <summary>
/// 带阶数的构造函数
/// </summary>
/// <param name="level">矩阵阶数</param>
public Hill(int level)
{
_level = level;
while(_inverseMatrix == null)
{
_matrix = getRandomMatrix();
_inverseMatrix = getInverseMatrix(_matrix);
++_times;
}
;
} public Hill(int level, long[][] matrix)
{
_level = level;
_matrix = matrix;
_inverseMatrix = getInverseMatrix(_matrix);
if (null == _inverseMatrix) _inverseMatrix = getNewMatrix();
} #region Properties public int Level
{
get
{
return _level;
}
} /// <summary>当前矩阵
/// </summary>
public long[][] Matrix
{
get
{
return _matrix;
}
} public long[][] InverseMatrix
{
get
{
return _inverseMatrix;
}
} public int Times
{
get
{
return _times;
}
}
#endregion /// <summary>
/// 得到一个新的整数矩阵
/// </summary>
/// <returns>矩阵</returns>
public long[][] getNewMatrix()
{
long[][] res = new long[_level][];
for (int i = ; i < _level; ++i) res[i] = new long[_level];
for (int i = ; i < _level; ++i)
for (int j = ; j < _level; ++j) res[i][j] = ;
return res;
} /// <summary>
/// 得到一个n阶整数矩阵
/// </summary>
/// <param name="level">阶数</param>
/// <returns>矩阵</returns>
public static long[][] getNewMatrix(int level)
{
long[][] res = new long[level][];
for (int i = ; i < level; ++i) res[i] = new long[level];
for (int i = ; i < level; ++i)
for (int j = ; j < level; ++j) res[i][j] = ;
return res;
} /// <summary>
/// 求关于MOD26的逆矩阵
/// </summary>
/// <param name="o">原矩阵</param>
/// <returns>逆矩阵</returns>
private long[][] getInverseMatrix(long[][] o)
{
long[][] res = getNewMatrix();
long[][] original = getNewMatrix(); for (int i = ; i < _level; ++i)
{
for (int j = ; j < _level; ++j)
{
if (i == j) res[i][j] = ;
else res[i][j] = ;
original[i][j] = o[i][j];
}
}
for (int k = ; k <_level; ++k)
{
bool isGCD = false;
for (int i = k; i < _level; ++i)
{
if (GCD(original[i][k], ) == )
{
isGCD = true;
if (i != k)
{
long[] temp1 = original[i], temp2 = res[i];
original[i] = original[k]; res[i] = res[k];
original[k] = temp1; res[k] = temp2;
}
break;
}
}
// 若矩阵一列中没有与26互素的元素,则认为该矩阵不可逆
if (!isGCD) return null;
long ie = getInverseElement(original[k][k], );
Console.WriteLine(original[k][k] + "的逆元是:" + ie);
if (- == ie) return null;
for (int j = ; j < _level; ++j)
{
original[k][j] = (original[k][j] * ie) % ;
res[k][j] = (res[k][j] * ie) % ;
}
for (int i = k + ; i < _level; ++i)
{
long l = original[i][k] / original[k][k];
for (int j = ; j < _level; ++j)
{
// 对增广矩阵的运算
res[i][j] = getMOD((res[i][j] - l * res[k][j]), );
// 对原矩阵的运算
original[i][j] = getMOD((original[i][j] - l * original[k][j]), );
}
}
}
for (int k = _level - ; k > ; --k)
{
if (original[k][k] == ) return null;
for (int i = k - ; i >= ; --i)
{
long l = original[i][k] / original[k][k]; // 对增广矩阵的运算
for (int j = ; j < _level; ++j)
{
if (res[k][j] == ) continue;
res[i][j] = getMOD((res[i][j] - l * res[k][j]), );
}
// 对原矩阵的运算
original[i][k] = getMOD((original[i][k] - l * original[k][k]), );
}
}
return res;
} private long getMOD(long x, long m)
{
while (x < m)
{
x += m;
}
return x % m;
} /// <summary>
/// 求a关于m的乘法逆元
/// </summary>
/// <param name="a"></param>
/// <param name="m"></param>
/// <returns>逆元</returns>
public static long getInverseElement(long a, long m)
{
long x = , y = ;
long gcd = E_GCD(a, m, ref x, ref y);
if ( % gcd != ) return -;
x *= / gcd;
m = Math.Abs(m);
long res = x % m;
if (res <= ) res += m;
return res;
} /// <summary>
/// 拓展欧几里德算法
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns>GCD(a, b)</returns>
public static long E_GCD(long a, long b, ref long x, ref long y)
{
if ( == b)
{
x = ;
y = ;
return a;
}
long res = E_GCD(b, a % b, ref x, ref y);
long temp = x;
x = y;
y = temp - a / b * y;
return res;
} /// <summary>
/// 求最大公约数
/// </summary>
/// <param name="x">第一个参数</param>
/// <param name="y">第二个参数</param>
/// <returns>最大公约数</returns>
static public long GCD(long x, long y)
{
if (y == ) return x;
return GCD(y, x % y);
} static int GetRandomSeed()
{
byte[] bytes = new byte[];
System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider();
rng.GetBytes(bytes);
return BitConverter.ToInt32(bytes, );
} private long[][] getRandomMatrix()
{
long[][] res = getNewMatrix(); for (int i = ; i < _level; ++i)
{
for (int j = ; j < _level; ++j)
{
int t;
Random rd = new Random(GetRandomSeed());
t = rd.Next(, );
res[i][j] = t;
}
}
return res;
} private string getOneGroup(string input, long[][] matrix)
{
StringBuilder sb = new StringBuilder();
int[] p = new int[_level];
for (int i = ; i < _level; ++i)
{
if (i < input.Length)
p[i] = input[i] - 'A';
else p[i] = INVALID_CHAR;
}
for (int i = ; i < _level; ++i)
{
long o = ;
for (int j = ; j < _level; ++j)
{
o += matrix[i][j] * p[j] ;
}
Console.Write(o.ToString() + " ");
sb.Append((char)(o % + 'A'));
}
Console.WriteLine();
return sb.ToString();
} /// <summary>
/// 加密
/// </summary>
/// <param name="input">请确保输入的字符串只有字母</param>
/// <returns></returns>
public string Encrypt(string input)
{
StringBuilder sb = new StringBuilder();
input = input.ToUpper();
for (int i = ; i < input.Length; i += _level)
{
int end = _level < (input.Length - i) ? _level : (input.Length - i);
sb.Append(getOneGroup(input.Substring(i, end), _matrix));
}
return sb.ToString();
} public string Decrypt(string input)
{
StringBuilder sb = new StringBuilder();
input = input.ToUpper();
for (int i = ; i < input.Length; i += _level)
{
int end = _level < (input.Length - i) ? _level : (input.Length - i);
sb.Append(getOneGroup(input.Substring(i, end), _inverseMatrix));
}
return sb.ToString();
}
}
}
using System.Text;
using System.Windows; namespace Cipher.Algorithm
{
public static class Playfair
{
private static char[,] _key = new char[, ]; // 经过处理的5×5矩阵
private static Point[] _location = new Point[]; // 26个字母在key中的位置
private static string _group; // 分组后的字符串
private static char _ch = 'Q'; // 无效字母,如Q, K, X public static string Encrypt(string input)
{
StringBuilder sb = new StringBuilder();
string str = group(input);
for(int i = ; i < str.Length; i += )
{
int r1 = (int)(_location[str[i] - 'A'].X);
int r2 = (int)(_location[str[i + ] - 'A'].X);
int c1 = (int)(_location[str[i] - 'A'].Y);
int c2 = (int)(_location[str[i + ] - 'A'].Y);
// 字母同行
if (r1 == r2)
{
sb.Append(_key[r1, (c1 + ) % ]).Append(_key[r1, (c2 + ) % ]);
}
// 字母同列
else if (c1 == c2)
{
sb.Append(_key[(r1 + ) % , c1]).Append(_key[(r2 + ) % , c1]);
}
else
{
if (r1 > r2 && c1 > c2)
{
sb.Append(_key[r1, c2]).Append(_key[r2, c1]);
}
else if (r1 < r2 && c1 > c2)
{
sb.Append(_key[r2, c1]).Append(_key[r1, c2]);
}
else if (r1 > r2 && c1 < c2)
{
sb.Append(_key[r1, c2]).Append(_key[r2, c1]);
}
else
{
sb.Append(_key[r2, c1]).Append(_key[r1, c2]);
}
}
}
return sb.ToString();
} public static string Decrypt(string input)
{
StringBuilder sb = new StringBuilder();
string str = (string)input.ToUpper();
if (str.Length % == || str.Length == || str.IndexOf(' ') != -) return "";
for (int i = ; i < str.Length; i += )
{
int r1 = (int)(_location[str[i] - 'A'].X);
int r2 = (int)(_location[str[i + ] - 'A'].X);
int c1 = (int)(_location[str[i] - 'A'].Y);
int c2 = (int)(_location[str[i + ] - 'A'].Y);
// 字母同行
if (r1 == r2)
{
sb.Append(_key[r1, (c1 - + ) % ]).Append(_key[r1, (c2 - + ) % ]);
}
// 字母同列
else if (c1 == c2)
{
sb.Append(_key[(r1 - + ) % , c1]).Append(_key[(r2 - + ) % , c1]);
}
else
{
if (r1 > r2 && c1 > c2)
{
sb.Append(_key[r1, c2]).Append(_key[r2, c1]);
}
else if (r1 < r2 && c1 > c2)
{
sb.Append(_key[r2, c1]).Append(_key[r1, c2]);
}
else if (r1 > r2 && c1 < c2)
{
sb.Append(_key[r1, c2]).Append(_key[r2, c1]);
}
else
{
sb.Append(_key[r2, c1]).Append(_key[r1, c2]);
}
}
}
for(int i = ; i < sb.Length; ++i)
{
if(sb[i].Equals(sb[i - ]) && sb[i - ].Equals(_ch))
{
sb.Remove(i - , );
}
}
if (sb[sb.Length - ].Equals(_ch)) sb.Remove(sb.Length - , );
return sb.ToString();
} public static char[, ] Key(string word)
{
string temp = word.ToUpper();
StringBuilder sb = new StringBuilder();
bool[] flag = new bool[];
for(int i = ; i < temp.Length; ++i)
{
// 该字母未出现过
if (flag[temp[i] - 'A'] == false)
{
sb.Append(temp[i]);
}
flag[temp[i] - 'A'] = true;
}
for(int i = ; i < ; ++i)
{
if (i == 'J' - 'A')
{
continue;
}
if (flag[i] == false)
{
sb.Append((char)(i + 'A'));
}
}
for (int i = ; i < ; ++i)
{
for(int j = ; j < ; ++j)
{
_key[i, j] = sb[i * + j];
Point insert = new Point(i, j);
_location[_key[i, j] - 'A'] = insert;
}
}
return _key;
} private static string group(string input)
{
StringBuilder sb = new StringBuilder();
string temp = input.ToUpper();
for(int i = ; i < temp.Length; )
{
if ( != i && sb.Length > && temp[i] == sb[sb.Length - ])
{
sb.Append(_ch);
}
else if ('A' <= temp[i] && temp[i] <= 'Z')
{
sb.Append(temp[i]);
++i;
}
else
{
++i;
}
}
if (sb.Length % == )
{
sb.Append(_ch);
}
_group = sb.ToString();
return sb.ToString();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace Cipher.Algorithm
{
class Rd
{
public static int GetRandomSeed()
{
byte[] bytes = new byte[];
System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider();
rng.GetBytes(bytes);
return BitConverter.ToInt32(bytes, );
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using System.Text; namespace Cipher.Algorithm
{
class RSA
{
// 已保存的素数集
protected int[] primes = { , , , , , , , , , , , , , , }; protected BigInteger rsa_e;
protected BigInteger rsa_d;
protected BigInteger rsa_n; protected BigInteger rsa_p;
protected BigInteger rsa_q; #region Properties
public string P
{
get
{
return rsa_p.ToString();
}
}
public string Q
{
get
{
return rsa_q.ToString();
}
} public string E
{
get
{
return rsa_e.ToString();
}
} public string D
{
get
{
return rsa_d.ToString();
}
} public string N
{
get
{
return rsa_n.ToString();
}
}
#endregion public RSA()
{
BigInteger p, q;
p = getRandomPrime();
q = getRandomPrime();
while (p == q)
{
// 确保p与q不相等
q = getRandomPrime();
}
BigInteger n = p * q;
BigInteger fi_n = (p - ) * (q - );
BigInteger e = getRandomPrime();
while (GCD(fi_n, e) != )
{
e = getRandomPrime();
}
BigInteger d = getInverseElement(e, fi_n); rsa_e = e;
rsa_d = d;
rsa_n = n;
rsa_p = p;
rsa_q = q;
} public RSA(BigInteger p, BigInteger q, BigInteger e)
{
rsa_p = p;
rsa_q = q;
rsa_e = e;
BigInteger n = p * q;
BigInteger fi_n = (p - ) * (q - );
if (GCD(fi_n, e) != ) return;
BigInteger d = getInverseElement(e, fi_n); rsa_d = d;
rsa_n = n;
} public BigInteger[] Encrypt(string input)
{
List<BigInteger> res = new List<BigInteger>();
char[] c = input.ToArray();
for (int i = ; i < c.Length; ++i)
{
res.Add(EncryptSingle(c[i], rsa_e));
}
return res.ToArray();
} public char[] Decrypt(BigInteger[] input)
{
List<char> res = new List<char>();
for (int i = ; i < input.Length; ++i)
{
int ch = Int32.Parse(EncryptSingle(input[i], rsa_d).ToString());
res.Add((char)ch);
}
return res.ToArray();
} /// <summary>
/// 对单个字符进行幂运算加密
/// </summary>
/// <param name="input"></param>
/// <param name="m"></param>
/// <returns></returns>
protected BigInteger EncryptSingle(BigInteger input, BigInteger m)
{
BigInteger res = ;
for (int i = ; i < m; ++i)
{
res = (res * input) % rsa_n;
}
return res;
} protected BigInteger getRandomPrime()
{
Random rd = new Random(Rd.GetRandomSeed());
BigInteger res = new BigInteger(primes[rd.Next(, primes.Length)]);
return res;
} protected BigInteger GCD(BigInteger a, BigInteger b)
{
if (b == BigInteger.Zero) return a;
return GCD(b, a % b);
} /// <summary>
/// 求a关于m的乘法逆元
/// </summary>
/// <param name="a">原数</param>
/// <param name="m">被MOD的数</param>
/// <returns>逆元</returns>
protected BigInteger getInverseElement(BigInteger a, BigInteger m)
{
BigInteger x = , y = ;
BigInteger gcd = E_GCD(a, m, ref x, ref y);
if ( % gcd != ) return -;
x *= / gcd;
m = BigInteger.Abs(m);
BigInteger res = x % m;
if (res <= ) res += m;
return res;
} /// <summary>
/// 拓展欧几里德算法
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns>GCD(a, b)</returns>
protected BigInteger E_GCD(BigInteger a, BigInteger b, ref BigInteger x, ref BigInteger y)
{
if ( == b)
{
x = ;
y = ;
return a;
}
BigInteger res = E_GCD(b, a % b, ref x, ref y);
BigInteger temp = x;
x = y;
y = temp - a / b * y;
return res;
}
}
}

基于.net 4.0框架的Cipher演示程序的更多相关文章

  1. 一个基于Net Core3.0的WPF框架Hello World实例

    目录 一个基于Net Core3.0的WPF框架Hello World实例 1.创建WPF解决方案 1.1 创建Net Core版本的WPF工程 1.2 指定项目名称,路径,解决方案名称 2. 依赖库 ...

  2. CefSharp基于.Net Framework 4.0 框架编译

    CefSharp基于.Net Framework 4.0 框架编译 本次源码使用的是Github上CefSharp官方的79版本源码 准备 IDE Visual Studio 2017 Enterpr ...

  3. 基于NetMQ的TLS框架NetMQ.Security的实现分析

    基于NetMQ的TLS框架NetMQ.Security的实现分析 前言 介绍 交互过程 支持的协议 TLS协议 支持的算法 实现 握手 第一次握手 Client Hello 第二次握手 Server ...

  4. springmvc工作原理以及源码分析(基于spring3.1.0)

    springmvc是一个基于spring的web框架.本篇文章对它的工作原理以及源码进行深入分析. 一.springmvc请求处理流程 二.springmvc的工作机制 三.springmvc核心源码 ...

  5. 一个功能完备的.NET开源OpenID Connect/OAuth 2.0框架——IdentityServer3

    今天推荐的是我一直以来都在关注的一个开源的OpenID Connect/OAuth 2.0服务框架--IdentityServer3.其支持完整的OpenID Connect/OAuth 2.0标准, ...

  6. 基于MyEclipse+9.0+++Tomcat+7.0的SSH+平台搭建

    基于MyEclipse+9.0+++Tomcat+7.0的SSH+平台搭建 http://wenku.baidu.com/view/96fbfe0f581b6bd97f19ea1d.html 用MyE ...

  7. 基于Hadoop2.2.0版本号分布式云盘的设计与实现

    基于Hadoop2.2.0版本号分布式云盘的设计与实现 一.前言 在学习了hadoop2.2一个月以来,我重点是在学习hadoop2.2的HDFS.即是hadoop的分布式系统,看了非常久的源代码看的 ...

  8. 基于MEF的插件框架之总体设计

    基于MEF的插件框架之总体设计 1.MEF框架简介 MEF的全称是Managed Extensibility Framework(MEF),其是.net4.0的组成部分,在3.5上也可以使用.熟悉ja ...

  9. robotlegs2.0框架实例源码带注释

    robotlegs2.0框架实例源码带注释 Robotlegs2的Starling扩展 有个老外写了robotleges2的starling扩展,地址是 https://github.com/brea ...

随机推荐

  1. java线程基础巩固---通过实验分析This锁和Class锁的存在

    This锁: 关于什么是This锁下面用实现来说明一下它: 那下面用两个线程分别调用这两个方法,如下: 看结果: 可见两个方法是同时输出的,因为m2()方法并未上锁,所以就不存在争锁的问题,那这时给m ...

  2. Git使用教程学习

    Git使用教程学习 在第十二周的个人作业上,王文娟老师希望我们去自己课后了解一下git的使用方式以及一些基础知识,在本学期其他的课程上,我们已经稍微了解过一些git的基础知识,因此在本次作业里,我补充 ...

  3. UVa101 The Blocks Problem(不定长数组vector)

    The Blocks Problem 书上的一道例题,代码思路比较清晰,可以看懂. 相关知识: 若a是一个vector,则: a.size():读取它的大小 a.resize():改变大小 a.pus ...

  4. MySQL数据优化总结-查询备忘录

    一.优化分类 二.测试数据样例 参考mysql官方的sakina数据库. 三.使用mysql慢查询日志对有效率问题的sql进行监控 第一个,开启慢查询日志.第二个,慢查询日志存储位置.第三个,没有使用 ...

  5. BZOJ 1818: [Cqoi2010]内部白点 (BIT + 扫描线)

    就是求多条线段的交点数,直接BIT+扫描线就行了. 注意不要算重最初存在的点. CODE #include<bits/stdc++.h> using namespace std; char ...

  6. Python入门-2编程基本概念:03引用的本质-栈内存和堆内存-内存示意图

    引用 在Python中,变量也称为:对象的引用.因为,变量存储的就是对象的地址. 变量通过地址引用了“对象”. 变量位于:栈内存(压栈出栈等细节,后续再介绍). 对象位于:堆内存. Python是动态 ...

  7. haproxy和keepalived的理解(转载)

    关于此两者,随便google一下都会有大量的文章,因此这里也不用介绍如何来进行安装和配置了.主要从一个整体方案的角度来描述什么要这样做,以及这样做所解决的问题. 所有的系统,都是先经历一个单台机器搞所 ...

  8. HDU - 6183 暴力,线段树动态开点,cdq分治

    B - Color itHDU - 6183 题目大意:有三种操作,0是清空所有点,1是给点(x,y)涂上颜色c,2是查询满足1<=a<=x,y1<=b<=y2的(a,b)点一 ...

  9. python IO密集型为什么使用多线程

    IO密集型为什么使用多线程 python多线程,可以粗浅理解只用了cpu的一个核心. 为什么IO密集型用多线程?假设我们有多个线程都在发网络请求(request, 等response),一个请求的从发 ...

  10. 2019牛客暑期多校训练营(第二场)D bitset

    题意 给一个n个结点的带点权的图,找到第k小的团的权值 分析 用bitset表示团的状态,一个结点必须和团里的每个结点都连边才能加进去,所以可以直接用\(\&\)运算来判断一个结点是否能加进去 ...