2

我有一个 MySQL 数据库,它被配置为接收带有波兰语字符的数据(例如 ą、ę、ó、ł、ń 等)。

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

F. 例如:

我发送AES_ENCRYPT('ąąą', '123')到分贝。我得到了AES_DECRYPT('sql command','123'),我得到byte[]了它有 3 个元素,每个人都有 '97' 值,代表'aaa'- NOT 'ąąą'。如何以AES_DECRYPT/ENCRYPT允许我向我的数据库发送/获取波兰字符的方式使用?!或者如何从 aes_decrypt() 而不是 byte[] 获取字符串输出?

4

3 回答 3

2

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

select convert(aes_decrypt(aes_encrypt('ąąą', 'abcdefg'), 'abcdefg') using UTF8);
于 2013-01-19T13:39:58.090 回答
1

您的 MySQL 数据以字符为单位,而加密则以字节为单位。您需要在加密之前将字符转换为字节,并将解密的字节转换回字符。这意味着您需要明确指定要在两端使用的字符编码,以便它们匹配。当前标准是 UTF-8,因此您应该在每一端指定它。如果 UTF-8 不起作用,那么在两端尝试一些 Microsoft 特定的字符编码。

于 2013-01-19T14:18:48.807 回答
1

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

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
于 2013-01-19T13:34:12.750 回答