【发布时间】:2016-04-22 09:57:23
【问题描述】:
我编写了一个使用 AES 算法加密和解密示例文本的代码。当我单击第一个按钮时,我想加密将显示在 textbox1 上的字符串,对于第二个按钮单击,解密后的值应显示在 textbox2 上。
代码如下:
public partial class _Default : Page
{
public byte[] key = null; public byte[] iv = null; public byte[] bytesToEncrypt = null; public static byte[] encryptedBytes = null; public byte[] decryptedBytes = null;
protected void Page_Load(object sender, EventArgs e)
{
RijndaelManaged aesAlg = new RijndaelManaged();
aesAlg.GenerateKey();
aesAlg.GenerateIV();
key = aesAlg.Key;
iv = aesAlg.IV;
}
protected void Button1_Click(object sender, EventArgs e)
{
// original bytes
bytesToEncrypt = new byte[TextBox2.Text.ToString().Length * sizeof(char)];
encryptedBytes = CryptoAes.Encrypt(bytesToEncrypt, key, iv);
TextBox1.Text = Convert.ToBase64String(encryptedBytes);
byte[] bytesToEncrypt1 = new byte[TextBox2.Text.Length];
decryptedBytes = CryptoAes.Decrypt(encryptedBytes, key, iv);//working here.
}
protected void Button2_Click(object sender, EventArgs e)
{
var s = Convert.FromBase64String(TextBox1.Text);
decryptedBytes = CryptoAes.Decrypt(encryptedBytes, key, iv);
TextBox2.Text = System.Text.Encoding.Unicode.GetString(decryptedBytes);//not working
}
}
internal sealed class CryptoAes
{
public static byte[] Encrypt(byte[] data, byte[] key, byte[] iv)
{
byte[] encryptedData = null;
if (data == null)
throw new ArgumentNullException("data");
if (data == key)
throw new ArgumentNullException("key");
if (data == iv)
throw new ArgumentNullException("iv");
using (RijndaelManaged aesAlg = new RijndaelManaged())
{
aesAlg.Key = key;
aesAlg.IV = iv;
aesAlg.Padding = PaddingMode.Zeros;
ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
encryptedData = encryptor.TransformFinalBlock(data, 0, data.Length);
}
return encryptedData;
}
public static byte[] Decrypt(byte[] data, byte[] key, byte[] iv)
{
byte[] decryptedData = null;
if (data == null)
throw new ArgumentNullException("data");
if (data == key)
throw new ArgumentNullException("key");
if (data == iv)
throw new ArgumentNullException("iv");
using (RijndaelManaged aesAlg = new RijndaelManaged())
{
aesAlg.Key = key;
aesAlg.IV = iv;
aesAlg.Padding = PaddingMode.Zeros;
ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
decryptedData = decryptor.TransformFinalBlock(data, 0, data.Length);
}
return decryptedData;
}
}
对于第一个按钮,单击解密工作正常。但是当我单击第二个按钮时,解密的文本会显示一些垃圾字符。
为了弄清楚这一点,我将 encryptedBytes 设为静态并在单击第二个按钮时重用它,但仍然是带有垃圾值的相同输出。我想知道当我单击第一个按钮时,相同的输入如何给出正确的输出。
谁能帮我解决这个问题?
【问题讨论】:
-
所以,您有输入,有预期的输出,您也有代码。那么您期望我们提供什么帮助?有什么错误吗?
-
两个按钮都是用来解密的? *“按钮点击解密工作正常”*
-
第一个按钮点击,解密工作正常。问题在于第二个按钮单击。第一个按钮用于加密,第二个按钮用于解密。如果我也在第一个按钮中编写解密代码的逻辑,它工作正常。
-
不会
bytesToEncrypt只是一个空数组?你想加密什么,TextBox2.Text中的数据? -
它不是空数组。它有价值观。我检查了一切。但查不出有什么区别。请运行代码,您可以复制问题。
标签: c# encryption cryptography aes rijndael