【发布时间】:2022-06-17 22:57:42
【问题描述】:
我正在编写一个程序,以 c# windows 形式对 Elgamal 进行编码和解码。程序要求对所有字体格式进行编码和解码:字体样式、前景、字体系列。我使用Encoding.Unicode.GetBytes(text) 将字符串转换为字节数组,然后将字节转换为base64 格式,并应用扩展欧几里得算法求逆和平方乘法算法进行编码和解码。但我的明文只能解码默认文本,不能解码字体格式。
这是我的加密代码:
private string Encode()
{
//Tinh y1
y1 = binhphuong(alpha, k, p);
banro = txtTest.Text;
string loi = "";
string kqBanMa = "";
if (String.IsNullOrEmpty(banro))
{
loi = "\n Bạn phải nhập bản rõ";
}
if (txtA.Text == "" || txtAlpha.Text == "" || txtAlpha.Text == "" || txtBeta.Text == "" || txtP.Text == "" || txtPDoc.Text == "")
{
loi += "\n Bạn chưa tạo khóa";
}
if (loi != "")
{
MessageBox.Show("Có lỗi xảy ra : " + loi, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
if (!Regex.IsMatch(banro, @"^\d+$"))
{
// Chuyển chuỗi qua dạng mảng byte
byte[] bytes = Encoding.Unicode.GetBytes(banro);
//Chuyển từ byte sang dạng Base 64
string dang64 = Convert.ToBase64String(bytes);
//chuyển các kí tự cần mã hóa về dạng số và lưu vào 1 list
List<int> c1 = new List<int>();
for (int i = 0; i < dang64.Length; i++)
c1.Add((int)dang64[i]);
//mã hóa từng kí tự dưới dạng số
List<int> c2 = new List<int>();
for (int i = 0; i < c1.Count; i++)
{
int chuyendoi = ((c1[i] % p) * binhphuong(beta, k, p)) % p;
c2.Add(chuyendoi);
}
//chuyển các kí tự mã hóa dưới dạng số về dạng chữ trong ASCII và nối lại
string c = "";
for (int i = 0; i < c2.Count; i++)
c += (char)c2[i];
/*
Do mã hóa dựa trên bảng mã ASCII nên các kí tự bị mã hóa thành các kí tự đặc biệt khá khó chịu nên
chuyển nó qua dạng base 64 để dễ nhìn hơn.
*/
//Chuyển chuỗi sau mã hóa thành mảng byte
byte[] byt = Encoding.Unicode.GetBytes(c);
//Chuyển từ mảng byte sang dạng Base 64
kqBanMa = Convert.ToBase64String(byt);
//return kqBanMa1;
}
else
{
int dangso = int.Parse(banro.ToString());
//Tinh y2
y2 = ((dangso % p) * (binhphuong(beta, k, p))) % p;
kqBanMa = $"Bản mã C = (C1, C2) = ({y1}, {y2})";
}
}
return kqBanMa;
}
这是我的解密代码:
private string Decode()
{
int pt1 = binhphuong(y1, a, p);
int pt2 = songhichdao(pt1, p);
banma = txtReCipher.Text;
string gm = "";
try
{
if (banma.Length == 0)
{
MessageBox.Show("Có lỗi xảy ra : Chưa có bản mã để giải mã", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
if (!Regex.IsMatch(banro, @"^\d+$"))
{
//chuyển chuỗi dạng base 64 qua mảng byte
byte[] bytes = Convert.FromBase64String(banma);
//chuyển từ mảng byte về chuỗi sau khi mã hóa
string strMaHoa = Encoding.Unicode.GetString(bytes);
//chuyển các kí tự qua dạng số
List<int> temp1 = new List<int>();
foreach (int item in strMaHoa)
temp1.Add((int)item);
//giải mã từng kí tự
List<int> temp2 = new List<int>();
for (int i = 0; i < temp1.Count; i++)
{
int element = ((temp1[i] % p) * pt2) % p;
temp2.Add(element);// giải mã
}
//chuyển các đã mã hóa qua dạng chữ và nối lại thành chuỗi
string temp = "";
for (int i = 0; i < temp2.Count; i++)
temp += (char)temp2[i];
// chuyển chuỗi giải mã sang dạng bytes
byte[] bytesLast = Convert.FromBase64String(temp);
//chuyển từ mảng byte sang chuỗi đã giải mã
gm = Encoding.Unicode.GetString(bytesLast);
}
else
{
int ptso = ((y2 % p) * pt2) % p;
gm = ptso.ToString();
}
}
}
catch
{
MessageBox.Show("Có lỗi xảy ra", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
return gm;
}
希望大家能尽快帮我完成这个程序。非常感谢。
【问题讨论】:
-
为什么要将缓冲区转换为 BASE64 字符串而不是使用字节值?
标签: c#