Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Mysql中的AES加密,C.Net中的解密_C#_.net_Mysql_Security_Aes - Fatal编程技术网

C# Mysql中的AES加密,C.Net中的解密

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 我使用

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;
}