C# Mysql中的AES加密,C.Net中的解密
Mysql: AES_ENCRYPT()和AES_DECRYPT()可以使用官方AES(高级加密标准)算法(以前称为“Rijndael”)对数据进行加密和解密。可以使用128位密钥长度的编码,但可以通过修改源代码将其扩展到256位。我们选择128位是因为它速度快得多,而且对于大多数用途来说都足够安全 我试图在C#net中将加密字符串转换为非类型化的Strig,但没有得到预期的结果 C# 在这个方法中,我传递密文,我从Mysql和 字节[]IV的Rijndael.Create().IV 我使用了代码,但没有得到预期的结果。C# Mysql中的AES加密,C.Net中的解密,c#,.net,mysql,security,aes,C#,.net,Mysql,Security,Aes,Mysql: AES_ENCRYPT()和AES_DECRYPT()可以使用官方AES(高级加密标准)算法(以前称为“Rijndael”)对数据进行加密和解密。可以使用128位密钥长度的编码,但可以通过修改源代码将其扩展到256位。我们选择128位是因为它速度快得多,而且对于大多数用途来说都足够安全 我试图在C#net中将加密字符串转换为非类型化的Strig,但没有得到预期的结果 C# 在这个方法中,我传递密文,我从Mysql和 字节[]IV的Rijndael.Create().IV 我使用
查看代码并评论Idk在哪里出错以下是一些通过C#实现与MySQL相同加密的工作代码:
static string DecryptStringFromBytes(byte[] cipherText, byte[] Key, byte[] IV)
详情请参阅
编辑:
由于上述内容依赖于官方未记录的信息(尽管它是有效的),我建议避免使用它,并使用中描述的选项之一。以下是一些通过C实现与MySQL相同加密的有效代码:
static string DecryptStringFromBytes(byte[] cipherText, byte[] Key, byte[] IV)
详情请参阅
编辑:
由于上述信息依赖于官方未记录的信息(尽管它是有效的),我建议避免使用它,并使用中描述的选项之一。您正在做的是沿着痛苦之路走。在MySQL上解密/加密并使用到数据库的加密连接(如果需要的话),或者在.NET应用程序上加密/解密,将加密数据存储在适当的列中 混合使用AES实现很容易出错,如果您更改.NET或MySQL的版本,事情就更容易破裂 现在,要知道到底是什么错了,我们需要知道IV在MySQL和.NET之间是否兼容,或者找出MySQL的实现IV并提供它 另一个潜在的问题是如何生成字节数组(我们在您的示例中没有看到)。如果密钥是文本的,则必须在生成数组时考虑字符编码问题。
在的注释中,有关于缺少参数的信息。您所做的是沿着痛苦的道路前进。在MySQL上解密/加密并使用到数据库的加密连接(如果需要的话),或者在.NET应用程序上加密/解密,将加密数据存储在适当的列中 混合使用AES实现很容易出错,如果您更改.NET或MySQL的版本,事情就更容易破裂 现在,要知道到底是什么错了,我们需要知道IV在MySQL和.NET之间是否兼容,或者找出MySQL的实现IV并提供它 另一个潜在的问题是如何生成字节数组(我们在您的示例中没有看到)。如果密钥是文本的,则必须在生成数组时考虑字符编码问题。
在的注释中有关于缺少参数的信息。如果运行选择AES\u ENCRYPT('Test','pass')) 您正在通过网络发送未加密的通行证,以便任何人都可以对数据进行未加密 AES_ENCRYPT用于存储数据,因此,如果数据库遭到黑客攻击,您的数据是安全的,而不是传输数据
如果希望通过网络进行数据加密,请使用ssl套接字连接到mysql服务器如果运行选择AES_ENCRYPT('Test','pass')) 您正在通过网络发送未加密的通行证,以便任何人都可以对数据进行未加密 AES_ENCRYPT用于存储数据,因此,如果数据库遭到黑客攻击,您的数据是安全的,而不是传输数据
如果您希望通过网络进行数据加密,那么经过长时间的使用ssl套接字连接到mysql服务器,我找到了解决此问题的方法 以下几点供参考:
- MySQL作为AES_Encrypt的默认设置,使用128位,ECB模式,不需要IV
- 他们使用的填充模式没有指定,但他们确实说他们填充了它。对于填充,我使用PaddingMode.zero
- 在C#中,使用AesManaged,而不是RijndaelManaged,因为这不再被推荐
- 如果密钥长度超过128位(16字节),则使用下面的函数创建正确的密钥大小,因为默认的MySQL AES算法使用128位密钥
- 确保使用正确的编码,并确切地知道在将字节转换为字符时将接收回什么类型的字符编码
公共静态字符串DecrypatesStringFromBytes(字节[]encryptedText,字节[]密钥)
{
//检查参数。
如果((encryptedText==null | | encryptedText.Length在长时间之后,我找到了这个问题的解决方案
以下几点供参考:
- MySQL作为AES_Encrypt的默认设置,使用128位,ECB模式,不需要IV
- 他们使用的填充模式没有指定,但他们确实说他们填充了它。对于填充,我使用PaddingMode.zero
- 在C#中,使用AesManaged,而不是RijndaelManaged,因为这不再被推荐
- 如果密钥长度超过128位(16字节),则使用下面的函数创建正确的密钥大小,因为默认的MySQL AES算法使用128位密钥
- 确保使用正确的编码,并确切地知道在将字节转换为字符时将接收回什么类型的字符编码
欲了解更多信息,请点击此处:
代码:
公共静态字符串DecrypatesStringFromBytes(字节[]encryptedText,字节[]密钥)
{
//检查参数。
如果((encryptedText==null | | | encryptedText.Length)MySQL文档没有说明他们使用的IV的任何内容…它可能是非常基本的(比如一个充满0x00的IV)…根据MSDN文档,您在C#中使用的IV是随机的…opera模式
public byte[] AESEncrypt(byte[] plaintext, byte[] key) {
/*
* Block Length: 128bit
* Block Mode: ECB
* Data Padding: Padded by bytes which Asc() equal for number of padded bytes (done automagically)
* Key Padding: 0x00 padded to multiple of 16 bytes
* IV: None
*/
RijndaelManaged aes = new RijndaelManaged();
aes.BlockSize = 128;
aes.Mode = CipherMode.ECB;
aes.Key = key;
ICryptoTransform encryptor = aes.CreateEncryptor();
MemoryStream mem = new MemoryStream();
CryptoStream cryptStream = new CryptoStream(mem, encryptor,
CryptoStreamMode.Write);
cryptStream.Write(plaintext, 0, plaintext.Length);
cryptStream.FlushFinalBlock();
byte[] cypher = mem.ToArray();
cryptStream.Close();
cryptStream = null;
encryptor.Dispose();
aes = null;
return cypher;
}
public static string DecryptAESStringFromBytes(byte[] encryptedText, byte[] key)
{
// Check arguments.
if ((encryptedText == null || encryptedText.Length <= 0) || (key == null || key.Length <= 0))
{
throw new ArgumentNullException("Missing arguments");
}
string decryptedText = null;
// Create an AES object with the specified key and IV.
using (AesManaged aesFactory = new AesManaged())
{
aesFactory.KeySize = 128;
aesFactory.Key = AESCreateKey(key, aesFactory.KeySize / 8);
aesFactory.IV = new byte[16];
aesFactory.BlockSize = 128;
aesFactory.Mode = CipherMode.ECB;
aesFactory.Padding = PaddingMode.Zeros;
// Create a decryptor to perform the stream transform.
ICryptoTransform decryptor = aesFactory.CreateDecryptor();
// Create the streams used for decryption.
using (MemoryStream stream = new MemoryStream())
{
using (CryptoStream decryptStream = new CryptoStream(stream, decryptor, CryptoStreamMode.Write))
{
decryptStream.Write(encryptedText, 0, encryptedText.Length);
}
decryptedText = Encoding.Default.GetString(stream.ToArray());
}
}
return decryptedText.Trim();
}
public static byte[] AESCreateKey(byte[] key, int keyLength)
{
// Create the real key with the given key length.
byte[] realkey = new byte[keyLength];
// XOR each byte of the Key given with the real key until there's nothing left.
// This allows for keys longer than our Key Length and pads short keys to the required length.
for (int i = 0; i < key.Length; i++)
{
realkey[i % keyLength] ^= key[i];
}
return realkey;
}