更改密码功能的加密和解密?

时间:2016-03-11 03:25:06

标签: c# mysql encryption aes

我想执行更改密码功能,下面显示了到目前为止我所做的代码和截图:

        private void Password_Change()
    {
        int rowsAffected = 0;
        string query = "UPDATE staff_user SET staff_password = @newpassword WHERE staff_password = @staff_password";
        string constr = ConfigurationManager.ConnectionStrings["dbyouthworkConnectionString"].ConnectionString;

        ConfirmPassword.Text = Encrypt(ConfirmPassword.Text.Trim());
        CurrentPassword.Text = Decrypt(CurrentPassword.Text.Trim());
        using (MySqlConnection con = new MySqlConnection(constr))
        {
            using (MySqlCommand cmd = new MySqlCommand(query))
            {
                    con.Open();


                using (MySqlDataAdapter sda = new MySqlDataAdapter())


                {
                    cmd.Parameters.AddWithValue("@staff_password",CurrentPassword.Text );
                    cmd.Parameters.AddWithValue("@newpassword", (ConfirmPassword.Text));
                    cmd.Connection = con;


                    rowsAffected = cmd.ExecuteNonQuery();

                    con.Close();

                }


                if (rowsAffected > 0)
                {
                    Label1.ForeColor = System.Drawing.Color.Green;
                    Label1.Text = "Password has been changed successfully.";
                }
                else
                {
                    Label1.ForeColor = System.Drawing.Color.Red;
                    Label1.Text = "Password does not match with our database records.";
                }
                if (CurrentPassword.Text == New_Password.Text)
                {
                    Label1.ForeColor = System.Drawing.Color.Red;
                    Label1.Text = "Old Password and New Password cannot be the same !";
                }

                if (CurrentPassword.Text == ConfirmPassword.Text)
                {
                    Label1.ForeColor = System.Drawing.Color.Red;
                    Label1.Text = "Old Password and New Password cannot be the same !";
                }

            }
        }
    }
    private string Encrypt(string clearText)
    {
        string EncryptionKey = "MAKV2SPBNI99212";
        byte[] clearBytes = Encoding.Unicode.GetBytes(clearText);
        using (Aes encryptor = Aes.Create())
        {
            Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
            encryptor.Key = pdb.GetBytes(32);
            encryptor.IV = pdb.GetBytes(16);
            using (MemoryStream ms = new MemoryStream())
            {
                using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(clearBytes, 0, clearBytes.Length);
                    cs.Close();
                }
                clearText = Convert.ToBase64String(ms.ToArray());
            }
        }
        return clearText;
    }
    private string Decrypt(string cipherText)
    {
        string EncryptionKey = "MAKV2SPBNI99212";
        byte[] cipherBytes = Convert.FromBase64String(cipherText);
        using (Aes encryptor = Aes.Create())
        {
            Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
            encryptor.Key = pdb.GetBytes(32);
            encryptor.IV = pdb.GetBytes(16);
            using (MemoryStream ms = new MemoryStream())
            {
                using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(cipherBytes, 0, cipherBytes.Length);
                    cs.Close();
                }
                cipherText = Encoding.Unicode.GetString(ms.ToArray());
            }
        }
        return cipherText;
    }[![enter image description here][1]][1]

然而,当我运行该项目时 这是我得到的错误: enter image description here

我似乎无法看到我离开的地方因为我在用户登录时使用了相同的解密功能,而在用户创建帐户时使用了加密功能。

1 个答案:

答案 0 :(得分:0)

错误消息全部说明:“输入数据不是完整的块。”

AES是一个块密码,它可以逐块处理数据,而且块的大小为16字节。如果数据不是块大小的倍数,则必须以某种方式填充,通常用于AES的填充是PKCS#7néePKCS#5。

将该填充选项添加到加密代码中。填充将在加密时添加,并在解密时删除。您需要确保加密输出缓冲区比输入数据长一个块(16字节)。