gpt4 book ai didi

c# - 在用 C# 加密的 SQL Anywhere 16 中解密 AES,反之亦然

转载 作者:太空宇宙 更新时间:2023-11-03 13:25:41 26 4
gpt4 key购买 nike

我有使用 AES 加密东西的代码,更准确地说是 Rijndael 算法来模仿 ( http://dcx.sybase.com/index.html#sa160/en/dbreference/encrypt-function.html ) SQL Anywhere 16 的行为,为了简单起见, key 是假的:

var Key = Encoding.ASCII.GetBytes("1234567812345678");
var IV = Encoding.ASCII.GetBytes("1234567812345678");
var text = "stuff";
string encrypted;

var aes = new RijndaelManaged { Mode = CipherMode.CBC, Padding = PaddingMode.PKCS7, BlockSize = 128, KeySize = 128, Key = Key, IV = IV };

using (var encryptor = aes.CreateEncryptor())
{
var tmp = Encoding.ASCII.GetBytes(text);
encrypted = Convert.ToBase64String(encryptor.TransformFinalBlock(tmp, 0, tmp.Length));
}
Console.WriteLine("Encrypted text: " + encrypted);

我得到的结果是:do3BgGEeCWS5+mruUU1Czg== nXnrIX9m4zCxupbPsw3zsg==

在 SQL Anywhere 16 中解密:

select cast(decrypt(base64_decode('do3BgGEeCWS5+mruUU1Czg=='), '1234567812345678', 'AES(format=RAW;padding=PKCS5)', '1234567812345678') as varchar)

我得到这个结果:s t u f f stuff

所以它几乎有效,以十六进制比较它是 0x73007400750066006600 而不是 0x7374756666。此外,如果我在 C# 中解密相同的文本(解密源可以在下面找到),我也得到相同的空格,我做错了什么?

我还尝试了其他方法,在 SQL Anywhere 中加密:

select base64_encode(encrypt('stuff', '1234567812345678', 'AES(format=RAW;padding=PKCS5)', '1234567812345678'))

得到这一行:nXnrIX9m4zCxupbPsw3zsg==

尝试使用相同的过程在 C# 中解密:

string decrypted;

using (var decryptor = aes.CreateDecryptor())
{
var tmp = System.Convert.FromBase64String(encrypted);
decrypted = Encoding.ASCII.GetString(decryptor.TransformFinalBlock(tmp, 0, tmp.Length));
};
Console.WriteLine("Decrypted text: " + decrypted);

我得到了正确的结果:stuff,其中没有不必要的空格。

所以它有一个镜像缺点,任何想法是从哪里来的额外空间?

更新:错误在 var tmp = Encoding.Unicode.GetBytes(text);行,将 Unicode 更改为 ASCII。

最佳答案

如果您使用的是 SQL Anywhere 16.0 版或更高版本,则可以使用 decrypt function 的 'format=raw' 选项来执行此操作.如果您使用的是之前的版本,解密函数将无法解密在数据库服务器外加密的数据。

更新:既然您更新了您的问题,我也会解决这个问题。我在 SQL Anywhere 服务器中运行了解密,出来的数据中嵌入了 NULL,这意味着加密的数据已经包含了嵌入的 NULL。我不是 C# 专家,所以我不能肯定地告诉你,但我怀疑 var text = "stuff"; 以 UTF-16 格式存储数据。

全面披露:我在 SAP 从事 SQL Anywhere 工程工作。

关于c# - 在用 C# 加密的 SQL Anywhere 16 中解密 AES,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22530926/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com