Hill2 加解密
学C#之路太坎坷了吧
页面布局:
很轻松搞定的加密:
private void hill_Click(object sender, EventArgs e)
{
string plainHill = hill_input.Text;
string newPlainHill = string.Empty;
string origin = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int a11 = Convert.ToInt32(t11.Text);
int a12 = Convert.ToInt32(t12.Text);
int a21 = Convert.ToInt32(t21.Text);
int a22 = Convert.ToInt32(t22.Text);
// 大小写转换+去空格
foreach (char c in plainHill)
{
if (c >= 'a' && c <= 'z')
{
char newc = (char)(c - 32);
newPlainHill += newc;
}
else if (c >= 'A' && c <= 'Z')
newPlainHill += c;
else if (c == ' ') continue;
}
if (newPlainHill.Length % 2 != 0) newPlainHill += 'X'; // 补充哑字母
groupText.Text = newPlainHill;
// 分组矩阵
int b11, b21;
int c11, c21;
string cipherHill = string.Empty;
hillResult.Text = ""; // 清空
for(int i=0; i<newPlainHill.Length; )
{
b11 = Convert.ToInt32(newPlainHill[i])-65;
b21 = Convert.ToInt32(newPlainHill[i + 1])-65;
c11 = (a11 * b11 + a12 * b21) % 26;
c21 = (a21 * b11 + a22 * b21) % 26;
hillResult.Text += origin[c11];
hillResult.Text += origin[c21];
i += 2;
}
}
搞了很久然后利用小聪明解决的解密:
private void hillDecry_Click(object sender, EventArgs e)
{
string cipherHill = hill_input.Text;
string newCipherHill = string.Empty;
string origin = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int a11 = Convert.ToInt32(t11.Text);
int a12 = Convert.ToInt32(t12.Text);
int a21 = Convert.ToInt32(t21.Text);
int a22 = Convert.ToInt32(t22.Text);
// 大小写转换+去空格
foreach (char c in cipherHill)
{
if (c >= 'a' && c <= 'z')
{
char newc = (char)(c - 32);
newCipherHill += newc;
}
else if (c >= 'A' && c <= 'Z')
newCipherHill += c;
else if (c == ' ') continue;
}
if (newCipherHill.Length % 2 != 0) newCipherHill += 'X'; // 补充哑字母
groupText.Text = newCipherHill;
// 先算矩阵值
int value, inv=0;
value = a11 * a22 - a12 * a21;
// 求乘法逆元
switch (value)
{
case 1: inv = 1;break;
case 3: inv = 9; break;
case 5: inv = 21; break;
case 7: inv = 15; break;
case 9: inv = 3; break;
case 11: inv = 19; break;
case 15: inv = 7; break;
case 17: inv = 23; break;
case 19: inv = 11; break;
case 21: inv = 5; break;
case 23: inv = 17; break;
case 25: inv = 25; break;
}
// 变成逆矩阵
int i11 = a22;
int i12 = -a12;
int i21 = -a21;
int i22 = a11;
// 乘一下 mod26
int x11 = (i11 * inv + 26) % 26;
int x12 = (i12 * inv + 26) % 26;
int x21 = (i21 * inv + 26) % 26;
int x22 = (i22 * inv + 26) % 26;
// 分组矩阵
int b11, b21;
int c11, c21;
string plainHill = string.Empty;
for (int i = 0; i < newCipherHill.Length;)
{
b11 = Convert.ToInt32(newCipherHill[i]) - 65;
b21 = Convert.ToInt32(newCipherHill[i + 1]) - 65;
c11 = (x11 * b11 + x12 * b21) % 26;
c21 = (x21 * b11 + x22 * b21) % 26;
hillResult.Text += origin[c11];
hillResult.Text += origin[c21];
i += 2;
}
}```
解密真的真的好多好多缺点,很多地方为了思想简单,写得好数学,没有用数组和循环,太累赘啦,有时间再改吧!
掌握了求乘法逆元方法滴uu们,千万不要用我的switch,乖乖敲欧几里得算法去吧…
试验一下:
加密
解密:
看着switch太累赘了,
立志我要搞懂欧几里得算法!!!