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. 接口数据转json格式

    接口数据转json格式 function tojson($result, $callback = null){ header('Content-Type:text/html; charset=utf- ...

  2. Mybatis mapper.xml 配置

    <!-- xml的标准格式 --><?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE ...

  3. Hadoop-No.10之列簇

    HBase中包含列簇(column family)的概念.列簇本质上是列的存储容器.一张表可以有一个或多个列簇.每个列簇都有自己的HFile结婚,而且在执行合并操作时,同一个表的其他列簇不受影响 在很 ...

  4. Oracle 查询对应表所有字段名称,可排除不想要的字段

    由于Oracle varchar类型长度限制为4000 ,以下方法仅支持查询字段拼接后长度小于等于4000 第一种方法 select wm_concat(column_name) from user_ ...

  5. Acwing-252-树(点分治)

    链接: https://www.acwing.com/problem/content/254/ 题意: 给定一个有N个点(编号0,1,-,N-1)的树,每条边都有一个权值(不超过1000). 树上两个 ...

  6. 使用CSS3 will-change提高页面滚动、动画等渲染性能----------------------------引用

    Chris Ruppel当其使用background-attachment: fixed实现背景图片不随滚动条滚动而滚动效果的时候, 大家肯定会好奇,这到底施了什么魔法,可以让渲染提升如此之显著.3个 ...

  7. Blade 模板

    在Laravel 5.3中,@foreach指令提供了更加强大的功能,在每一个@foreach循环体中都可以调用一个新的$loop变量.该变量是一个stdClass实例,包含了当前循环的元数据信息,让 ...

  8. Flutter 父子组件传值

    Flutter 父子组件传值 一父传子: 父中: void onButtonChange(val1,val2,val3){ print('============================子向父 ...

  9. 解决xshell无法连接virtualbox中的虚拟机(Ubuntu18.04)的问题

    遇到这个问题第一反应是是否安装相应的组件: sudo apt-get install openssh-server 开启防火墙端口 firewall-cmd --zone=/tcp --permane ...

  10. 简单消息监听容器--SimpleMessageListenerContainer

    这个类非常强大,我们可以对他做很多设置,对于消费者的配置项,这个类都可以满足监听队列(多个队列).自动启动.自动声明功能可以设置事务特性.事务管理器.事务属性.事务容量(并发).是否开启事务.回滚消息 ...