我正在尝试解密使用pgcrypto加密的数据。我没有使用IV,因为它只是一个测试,但我不能在C#中解密数据。
在PostGres中加密:
enc_key := '\\xAACE38F289EC3EA209B48D';
-- Time insertions
ts_start := clock_timestamp();
FOR i IN 1..num_loops LOOP
-- The text to insert and its key
plaintext := 'Number: ' || i;
plaintext_pk := gen_random_uuid();
plaintext_pk_as_text := plaintext_pk::text;
-- The ref entries
user_pk := gen_random_uuid();
user_ref_pk := encrypt(plaintext_pk_as_text::bytea, enc_key, 'aes');
-- Add the enries
INSERT INTO "Text" VALUES(plaintext_pk, plaintext);
INSERT INTO "User" VALUES(user_ref_pk, user_pk);
END LOOP;
ts_end := clock_timestamp();
elapsed_raw := cast(extract(epoch from (ts_end - ts_start)) as numeric(18,3));
在C#中解密:
// The decryption key
byte[] enc_key = new byte[] { 0xAA, 0xCE, 0x38, 0xF2, 0x89, 0xEC, 0x3E, 0xA2, 0x09, 0xB4, 0x8D,
0x00, 0x00, 0x00, 0x00, 0x00 };
public static string AESDecryptByteArray(byte [] encoded_data, byte [] key)
{
string result = "";
byte [] result_ba = new byte[64];
using (Aes myAes = Aes.Create())
{
if (myAes == null)
{
throw new Exception("Failed to create AES object.");
}
myAes.Key = key;
myAes.Mode = CipherMode.CBC;
myAes.Padding = PaddingMode.PKCS7;
MemoryStream streamMem = new MemoryStream(encoded_data);
byte[] IV = new byte[16];
// streamMem.Read(IV, 0, 16);
for (int i = 0; i < 16; ++i )
{
IV[i] = 0;
}
myAes.IV = IV;
int iNumBytes = 0;
var decryptor = myAes.CreateDecryptor();
using (CryptoStream streamCrypt = new CryptoStream(streamMem, decryptor, CryptoStreamMode.Read))
{
iNumBytes = streamCrypt.Read(result_ba, 0, 48);
}
result = System.Text.Encoding.ASCII.GetString(result_ba);
}
return result;
} // AESDecryptByteArray
我复制了其中一行的加密数据和二进制密钥,但是C#代码总是出现CryptographicException(“Padding is invalid and cannot be removed”)异常。我的理解是,pgcrypto的encrypt()默认为cbc \ pkcs。显然,我漏掉了一些东西。
任何感激的帮助。
亚当。
1条答案
按热度按时间chhqkbe11#
尝试了迈克尔的建议,当然没有得到正确的结果。发现了问题。PG的字符串到字节茶的转换不适合粗心的人。重要的线索来自
这表明PG中的二进制密钥是24字节长-而不是我预期的11字节。这是由于我对PG的字符串到字节转换的工作原理的误解。我以为“\xAACE38F289EC3EA209B48D”会转换为11字节数组(https://www.postgresql.org/docs/9.6/static/datatype-binary.html,8.4.1节),但不需要双反斜杠。所以我的字符串转换为'','x','A'...'D' -一个24字节的数组。
(Didn我将错误的GUID复制到C#代码中进行比较-真实的的GUID是“d 6 edd 775 - 47 c5 -4779-a761- 7 f8297130073”。
希望有一天能帮助到别人。