【问题标题】:Encrypt and Decrypt Elgamal加密和解密 Elgamal
【发布时间】: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#


猜你喜欢
  • 1970-01-01
  • 2012-07-17
  • 2013-11-27
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多