MySQL中的AES_DECRYPT()和AES_ENCRYPT(),使用波兰语字符

本文关键字:AES 波兰语 字符 ENCRYPT DECRYPT 中的 MySQL | 更新日期: 2023-09-27 17:54:21

我有一个MySQL数据库,配置为接收波兰字符的数据(f. ex - z, z, ó, z, z等)。

现在我想使用AES_ENCRYPT()将这些波兰字符的数据发送到数据库,然后使用AES_DECRYPT()从那里获得它们。我的问题是,我在c#中收到一个byte[]数组,其中有X个元素,其中X是我收到的文本长度。每个数组元素都有它所代表的字符的ASCII码。我可以使用Encoding Class很容易地将其转换为文本,但我不会在输出文本中得到波兰语字符。

F。例:

我发送AES_ENCRYPT('ąąą', '123')到db。我得到AES_DECRYPT('sql command','123')byte[],它们有3个元素,每个元素都有'97'值,代表'aaa' -而不是'ąąą'。如何使用AES_DECRYPT/ENCRYPT的方式,让我发送/获得波兰字符到我的DB?!或者如何从aes_decrypt()而不是byte[]获得字符串输出?

MySQL中的AES_DECRYPT()和AES_ENCRYPT(),使用波兰语字符

使用编码转换可能会对您有所帮助。

select convert(aes_decrypt(aes_encrypt('ąąą', 'abcdefg'), 'abcdefg') using UTF8);

为什么不直接在代码中实现加密/解密而不是在查询中呢?

private static Byte[] Encrypt(String toEncrypt, Byte[] Key, Byte[] IV)
{
    CryptoStream streamCrypto = null;
    MemoryStream streamMemory = null;
    RijndaelManaged aes = null;
    StreamWriter streamWriter = null;
    try
    {
        aes = new RijndaelManaged();
        aes.Key = Key;
        aes.IV = IV;
        ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);
        streamMemory = new MemoryStream();
        streamCrypto = new CryptoStream(streamMemory, encryptor, CryptoStreamMode.Write);
        streamWriter = new StreamWriter(streamCrypto);
        streamWriter.Write(toEncrypt);
    }
    finally
    {
        if (streamWriter != null)
            streamWriter.Close();
        if (streamCrypto != null)
            streamCrypto.Close();
        if (streamMemory != null)
            streamMemory.Close();
        if (aes != null)
            aes.Clear();
    }
    return streamMemory.ToArray();
}
public static String Decrypt(Byte[] toDecrypt, Byte[] Key, Byte[] IV)
{
    CryptoStream streamCrypto = null;
    MemoryStream streamMemory = null;
    RijndaelManaged aes = null;
    StreamReader streamReader = null;
    String output = null;
    try
    {
        aes = new RijndaelManaged();
        aes.Key = Key;
        aes.IV = IV;
        ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
        streamMemory = new MemoryStream(toDecrypt);
        streamCrypto = new CryptoStream(streamMemory, decryptor, CryptoStreamMode.Read);
        streamReader = new StreamReader(streamCrypto);
        output = streamReader.ReadToEnd();
    }
    finally
    {
        if (streamReader != null)
            streamReader.Close();
        if (streamCrypto != null)
            streamCrypto.Close();
        if (streamMemory != null)
            streamMemory.Close();
        if (aes != null)
            aes.Clear();
    }
    return output;
}

在你的代码中,你加密你的字符串,然后你发送加密的数据到数据库:

Byte[] encrypted = Encrypt(yourString, Key, IV);  

当您从数据库中取出数据时,您只需使用:

返回您的字符串
String decrypted = Decrypt(dbData, Key, IV);

如果你不喜欢这种方式,只需使用这样的查询:

INSERT INTO mysecrets (mysecret1, mysecret2) VALUES (AES_ENCRYPT(secret1, YOUR_ENCRYPTION_KEY), AES_ENCRYPT(secret2, YOUR_ENCRYPTION_KEY))
SELECT AES_DECRYPT(mysecret1, YOUR_ENCRYPTION_KEY) AS secret1, AES_DECRYPT(mysecret1, YOUR_ENCRYPTION_KEY) AS secret2 FROM mysecrets

你的MySQL数据是字符,而加密工作在字节。您需要在对字符进行加密之前将其转换为字节,并将解密后的字节转换回字符。这意味着您需要显式地指定在两端使用的字符编码,以便它们匹配。当前的标准是UTF-8,因此您应该在每一端指定它。如果UTF-8不能工作,那么在两端尝试一些Microsoft特定的字符编码。