刚刚搞完密码安全的课程结束论文,des算法搞了好久没搞成,就搞了rsa 矩阵置换 及Vernam加密,上代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Security.Cryptography;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string mingwen = "", miyao = "", miwen = "";
mingwen = TextBox_mingwen.Text;
miyao = textBox_miyao.Text;
if (mingwen.Equals(""))
{
MessageBox.Show("明文为空");
return;
}
#region 矩阵换位加密
if (radio_juzhen.Checked) //矩阵换位
{
if (miyao.Equals(""))
{
MessageBox.Show("密钥为空");
return;
}
for (int i = 0; i < miyao.Length; i++)
{
for (int j = i + 1; j < miyao.Length; j++)
{
if (miyao[i].Equals(miyao[j]))
{
MessageBox.Show("密钥中不允许有重复字母");
return;
}
}
if (!char.IsLetter(miyao[i]))
{
MessageBox.Show("密钥必须全为字母");
return;
}
}
char[] charr = new char[100];
int[] intarr = new int[100];
int[] xulieintarr=new int[100];
int zushu;
miyao = miyao.ToLower();//把所有字母转成小写
for (int i = 0; i < miyao.Length; i++)
{
charr[i] = miyao[i];
}
for (int i = 0; i < miyao.Length; i++)//密钥的字母排序
{
for (int j = i + 1; j < miyao.Length; j++)
{
if (charr[i] > charr[j])
{
char t = charr[i];
charr[i] = charr[j];
charr[j] = t;
}
}
}
for (int i = 0; i < miyao.Length; i++)//算字母序列 intarr[i] = j;表示miyao字符串的第i位 在字母表排在第j位
{
for (int j = 0; j < miyao.Length; j++)
{
if (miyao[j].Equals(charr[i]))
{
intarr[i] = j;
break;
}
}
//label9.Text += charr[i];
}
for (int i = 0; i < miyao.Length; i++)//逆序列 用于
{
for (int j = 0; j < miyao.Length; j++)
{
if (i == intarr[j])
{
xulieintarr[i] = j;
break;
}
}
}
zushu = mingwen.Length / miyao.Length;
if ((mingwen.Length) % (miyao.Length) != 0)
{
while ((mingwen.Length) % (miyao.Length) != 0)
{
mingwen += '$';
}
zushu += 1;
}
for (int i = 0; i < miyao.Length; i++)
{
for (int j = 0; j < zushu; j++)
{
//miwen += mingwen[j * miyao.Length + xulieintarr[i]];
miwen += mingwen[j * miyao.Length + intarr[i]];
//label9.Text += xulieintarr[i];
}
}
//attackbeginsatfive
TextBox_miwen.Text = miwen;
}
#endregion
#region Vernam加密
if (radio_Vernam.Checked)//Vernam加密
{
if (miyao.Equals(""))
{
MessageBox.Show("密钥为空");
//flag = false;
return;
}
if (miyao.Length != 8)
{
MessageBox.Show("密钥长度必须为8");
return;
}
for (int i = 0; i < miyao.Length; i++)
{
if (!miyao[i].Equals('1') && !miyao[i].Equals('0'))
{
MessageBox.Show("密钥必须由1和0构成");
return;
}
}
int intmiyao;
intmiyao = Convert.ToInt16(miyao, 2);
//label9.Text =Convert.ToString(intmiyao);
for (int i = 0; i < mingwen.Length; i++)
{
int intming = Convert.ToInt16(mingwen[i]);
intming ^= intmiyao;
miwen += Convert.ToChar(intming);
}
TextBox_miwen.Text = miwen;
}
#endregion
#region rsa加密
if (radio_rsa.Checked)//rsa加密 c=(m^e)%n
{
if (miyao.Equals(""))
{
MessageBox.Show("密钥为空");
return;
}
long gongyue_e = Convert.ToInt32(miyao);
long n =Convert.ToInt32( textBox_n.Text);
for (int i=0; i < mingwen.Length; i++)
{
long[] carr=new long[4];
//long c=rsaqiumo(Convert.ToInt32(mingwen[i]),gongyue_e,n);
long c = Algmod(Convert.ToInt32(mingwen[i]), gongyue_e, n);
for (int j = 0; j < 4; j++)
{
carr[j] = c & 0xff;
c >>= 8;
}
for (int j = 3; j >=0; j--)
{
if (carr[j] >> 4 == 0)
{
miwen+='0';
}
miwen += Convert.ToString(carr[j],16);
}
}
TextBox_miwen.Text = miwen;
}
}
#endregion
private void button_jiemi_Click(object sender, EventArgs e)
{
string mingwen = "", miwen = "", miyao = "";
miwen = TextBox_miwen.Text;
miyao = textBox_miyao.Text;
if (miwen.Equals(""))
{
MessageBox.Show("密文为空");
return;
}
#region rsa解密
if (radio_rsa.Checked)//rsa解密
{
if (miyao.Equals(""))
{
MessageBox.Show("密钥为空");
//flag = false;
return;
}
long n = Convert.ToInt32( textBox_n.Text);
long d = Convert.ToInt32(textBox_miyao.Text);
//if()
for (int i = 0; i < miwen.Length/8; i++)
{
string strt = "";
//for (int j = 0; j < 8; j++)
//{
// strt+=miwen[i*8 + j];
//}
strt = miwen.Substring(i * 8, 8);
long ltemp=Convert.ToInt32(strt,16);
//ltemp = rsaqiumo(ltemp, d, n);
ltemp = Algmod(ltemp,d,n);
mingwen+=(char)ltemp;
}
TextBox_mingwen.Text = mingwen;
}
#endregion
#region 矩阵换位解密
if (radio_juzhen.Checked)//矩阵换位解密
{
if (miyao.Equals(""))
{
MessageBox.Show("密钥为空");
//flag = false;
return;
}
if (!(miwen.Length % miyao.Length == 0))
{
MessageBox.Show("密文长度必须为密钥长度的整数倍");
return;
}
for (int i = 0; i < miyao.Length; i++)
{
for (int j = i + 1; j < miyao.Length; j++)
{
if (miyao[i].Equals(miyao[j]))
{
MessageBox.Show("密钥中不允许有重复字母");
return;
}
}
if (!char.IsLetter(miyao[i]))
{
MessageBox.Show("密钥必须全为字母");
return;
}
}
char[] charr = new char[100];
int[] intarr = new int[100];
int[] xulieintarr = new int[100];
int zushu,fenzuchangdu;
miyao = miyao.ToLower();//把所有字母转成小写
for (int i = 0; i < miyao.Length; i++)
{
charr[i] = miyao[i];
}
for (int i = 0; i < miyao.Length; i++)//密钥的字母排序
{
for (int j = i + 1; j < miyao.Length; j++)
{
if (charr[i] > charr[j])
{
char t = charr[i];
charr[i] = charr[j];
charr[j] = t;
}
}
}
for (int i = 0; i < miyao.Length; i++)//算字母序列 intarr[i] = j;表示miyao字符串的第i位 在字母表排在第j位
{
for (int j = 0; j < miyao.Length; j++)
{
if (miyao[j].Equals(charr[i]))
{
intarr[i] = j;
break;
}
}
//label9.Text += intarr[i];
}
//label9.Text += ' ';
for (int i = 0; i < miyao.Length; i++)//逆序列 用于解密
{
for (int j = 0; j < miyao.Length; j++)
{
if (i == intarr[j])
{
xulieintarr[i] = j;
break;
}
}
//label9.Text += xulieintarr[i];
}
zushu = miwen.Length / miyao.Length;
//fenzuchangdu=miwen.Length/zushu;
for (int j = 0; j < zushu; j++)//j循环读取分组密文长度
{
for (int i = 0; i < miyao.Length; i++)//i循环读取排序
{
if (!miwen[xulieintarr[i] * zushu + j].Equals('$'))
mingwen += miwen[xulieintarr[i] * zushu + j];
//miwen += mingwen[j * miyao.Length + intarr[i]];
//label9.Text += xulieintarr[i];
}
}
//attackbeginsatfive
TextBox_mingwen.Text = mingwen;
}
#endregion
#region Vernam解密
if (radio_Vernam.Checked)//Vernam解密
{
if (miyao.Equals(""))
{
MessageBox.Show("密钥为空");
//flag = false;
return;
}
if (miyao.Length != 8)
{
MessageBox.Show("密钥长度必须为8");
return;
}
for (int i = 0; i < miyao.Length; i++)
{
if (!miyao[i].Equals('1') && !miyao[i].Equals('0'))
{
MessageBox.Show("密钥必须由1和0构成");
return;
}
}
int intmiyao = Convert.ToInt16(miyao, 2);
for (int i = 0; i < miwen.Length; i++)
{
int intmi = miwen[i];
intmi ^= intmiyao;
mingwen += Convert.ToChar(intmi);
}
TextBox_mingwen.Text = mingwen;
}
#endregion
}
long rsaqiumo(long dishu, long zhishu, long n)//求(dishu^zhishu)%n
{
long r = 1;
zhishu += 1;
while (zhishu != 1)
{
r = r * dishu;
r = r % n;
zhishu--;
}
//printf("%d\n", r);
return r;
}
// C#改写的,在vs.net 2005下调试通过:
/// <summary>
/// 指数取模:x=(a^b)%c (a的b次方mod)
/// 条件1:在rsa中a<c,其它不用a<c
/// 条件2:ac互素
/// </summary>
/// /*
///
/// */
private static long Algmod(long a, long b, long c)
{
long[] l = new long[500];
long z = -1, y;
for (; b != 1; b >>= 1)//分解b为2进制数.记录下分解成的位数z,构造栈l
{
z++;
if (b % 2 == 0)
l[z] = 0;
else
l[z] = 1;
}
//a%=c;//如果一开始数就很大,先模一次,防止过大, 求逆
y = a * a % c;//第一次模
for (; z > 0; z--)
{
if (l[z] > 0) y = (y * a % c) * (y * a % c) % c;
else y = y * y % c;
}
if (l[0] > 0) y = (y * a % c);//最后次模
return y;
}
private void button2_Click(object sender, EventArgs e)
{
//long gongyue_e = 65537;
//long p = 9973;
//long q = 5009;
//long t = (p - 1) * (q - 1);
//long n = p * q;
//long d = 1;
//while (((gongyue_e * d) % t) != 1) d++;
//zidai_ras_gongyao.Text = Convert.ToString(gongyue_e);
//zidai_rsa_n.Text = Convert.ToString(n);
//zidai_rsa_siyao.Text = Convert.ToString(d);
zidai_ras_gongyao.Text = "65537";
zidai_rsa_n.Text = "49954757";
zidai_rsa_siyao.Text = "44705537";
}
private void radio_rsa_CheckedChanged(object sender, EventArgs e)
{
if (radio_rsa.Checked)
{
textBox_n.ReadOnly = false;
}
else
{
textBox_n.ReadOnly = true;
}
}
private void radio_juzhen_CheckedChanged(object sender, EventArgs e)
{
if (radio_rsa.Checked)
{
textBox_n.ReadOnly = false;
}
else
{
textBox_n.ReadOnly = true;
}
}
private void radio_Vernam_CheckedChanged(object sender, EventArgs e)
{
if (radio_rsa.Checked)
{
textBox_n.ReadOnly = false;
}
else
{
textBox_n.ReadOnly = true;
}
}
}
}
rsa 矩阵置换 及Vernam加密算法 C#实现
最新推荐文章于 2022-11-04 13:56:28 发布