解密数据开头的随机字符
Random characters at beginning of decrypted data
我在 Delphi 中使用 TADOQuery 组件来读取数据库中列的内容,这些内容已由第 3 方 .net 应用程序使用 RijndaelManaged 算法加密。我已经 "sucessfully" 将数据解密回其原始 XML 格式,但解密数据的开头有随机字符。
?_????g???M.0"?>
<template xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" id="846aaa43-dc42-4bc7-98bd-bf643fd324cb" xmlns="http://web.net/schema">
etc, etc, etc...
我感觉这是 BOM,但无法想出在读取/解密数据期间忽略它的方法。
我是这样读数据的:
tmpMemoryStream : TMemoryStream;
Result : TByteArray; (array of byte)
tmpMemoryStream := TMemoryStream.Create;
tmpMemoryStream.LoadFromStream( ADOQuery1.CreateBlobStream(ADOQuery1.FieldByName('Design'), bmRead) );
setLength(Result, tmpMemoryStream.Size);
tmpMemoryStream.Read(Result, 0, tmpMemoryStream.size);
然后将生成的 byte array
传递给解密数据的函数。
提前致谢。
编辑 1
每个加密文件都有相同的 header,看起来像这样:
A9 CD AA F5 AE 36 04 2F 04 2A A5 2F CE EF B0 83 C4 97 F7 CA 26 F7 28 ED F8 C3 26 F4 57 D5 CB EA 36 10 F9 9B A6 CE F2 67 6B 47 B9 16 6E A7 41 14 A2 CD 99 88 51 17 67 03 C0 C4 66 18 D6 2A 1F D2 DD 5F 24 83 14 87 96 35 90 B6 70 F1 E6 51 BD 7A AB 41 86 E8 4D F4 E0 B7 D4 0A 22 DA 26 BD 54 D4 DE D1 23 36 BE D8 C8 D9 EC D8 5B 0E 0B 1D BE D8 A3 BD B7 E4 37 40 EB 86 76 85 E5 F7 15 87 EB 47
解密数据的乱码第一部分随每个文件而变化,但作为示例,如下所示:
3F 3F 3F 3F 3F 36 04 2F 04 2A 3F 2F 3F 3F 3F 3F 3F 3F 3F 3F 26 3F 28 3F 3F 3F 26 3F 57 3F 3F 3F 36 10 3F 3F 3F 3F 3F 67 6B 47 3F 16 6E 3F 41 14 3F 3F 3F 3F 51 17 67 03 3F 3F 66 18 3F 2A 1F 3F 3F 5F 24 3F 14 3F 3F 35 3F 3F 70 3F 3F 51 3F 7A 3F 41 3F 3F 4D 3F 3F 3F 3F 0A 22 3F 26 3F 54 3F 3F 3F 23 36 3F 3F 3F 3F 3F 3F 5B 0E 0B 1D 3F 3F 3F 3F 3F 3F 37 40 3F 3F 76 3F 3F 3F 15 3F 3F 47
编辑 2
IV
有问题...我使用了以下代码:
with myRijndaelManaged do
begin
BlockSize := 128;
KeySize := 256;
Key := myKey;
IV := IV; <-- Should have been "myIV"
Padding := PaddingMode.PKCS7;
Mode := CipherMode.CBC;
end;
因为它在 with
块中,即使未设置 IV
变量,它也没有被标记为错误,因为它是 属性 myRijndaelManaged
object。我将 IV
更改为 myIV
,其中包含正确的字节数组数据。
感谢指点@bartonjs
这看起来很像你在解密过程中没有设置 IV 值,导致前 16 个字节出现明文恢复问题。
要完全恢复,您需要密文、密钥和原始 IV(对于 ECB 以外的模式)。
我在 Delphi 中使用 TADOQuery 组件来读取数据库中列的内容,这些内容已由第 3 方 .net 应用程序使用 RijndaelManaged 算法加密。我已经 "sucessfully" 将数据解密回其原始 XML 格式,但解密数据的开头有随机字符。
?_????g???M.0"?>
<template xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" id="846aaa43-dc42-4bc7-98bd-bf643fd324cb" xmlns="http://web.net/schema">
etc, etc, etc...
我感觉这是 BOM,但无法想出在读取/解密数据期间忽略它的方法。
我是这样读数据的:
tmpMemoryStream : TMemoryStream;
Result : TByteArray; (array of byte)
tmpMemoryStream := TMemoryStream.Create;
tmpMemoryStream.LoadFromStream( ADOQuery1.CreateBlobStream(ADOQuery1.FieldByName('Design'), bmRead) );
setLength(Result, tmpMemoryStream.Size);
tmpMemoryStream.Read(Result, 0, tmpMemoryStream.size);
然后将生成的 byte array
传递给解密数据的函数。
提前致谢。
编辑 1
每个加密文件都有相同的 header,看起来像这样:
A9 CD AA F5 AE 36 04 2F 04 2A A5 2F CE EF B0 83 C4 97 F7 CA 26 F7 28 ED F8 C3 26 F4 57 D5 CB EA 36 10 F9 9B A6 CE F2 67 6B 47 B9 16 6E A7 41 14 A2 CD 99 88 51 17 67 03 C0 C4 66 18 D6 2A 1F D2 DD 5F 24 83 14 87 96 35 90 B6 70 F1 E6 51 BD 7A AB 41 86 E8 4D F4 E0 B7 D4 0A 22 DA 26 BD 54 D4 DE D1 23 36 BE D8 C8 D9 EC D8 5B 0E 0B 1D BE D8 A3 BD B7 E4 37 40 EB 86 76 85 E5 F7 15 87 EB 47
解密数据的乱码第一部分随每个文件而变化,但作为示例,如下所示:
3F 3F 3F 3F 3F 36 04 2F 04 2A 3F 2F 3F 3F 3F 3F 3F 3F 3F 3F 26 3F 28 3F 3F 3F 26 3F 57 3F 3F 3F 36 10 3F 3F 3F 3F 3F 67 6B 47 3F 16 6E 3F 41 14 3F 3F 3F 3F 51 17 67 03 3F 3F 66 18 3F 2A 1F 3F 3F 5F 24 3F 14 3F 3F 35 3F 3F 70 3F 3F 51 3F 7A 3F 41 3F 3F 4D 3F 3F 3F 3F 0A 22 3F 26 3F 54 3F 3F 3F 23 36 3F 3F 3F 3F 3F 3F 5B 0E 0B 1D 3F 3F 3F 3F 3F 3F 37 40 3F 3F 76 3F 3F 3F 15 3F 3F 47
编辑 2
IV
有问题...我使用了以下代码:
with myRijndaelManaged do
begin
BlockSize := 128;
KeySize := 256;
Key := myKey;
IV := IV; <-- Should have been "myIV"
Padding := PaddingMode.PKCS7;
Mode := CipherMode.CBC;
end;
因为它在 with
块中,即使未设置 IV
变量,它也没有被标记为错误,因为它是 属性 myRijndaelManaged
object。我将 IV
更改为 myIV
,其中包含正确的字节数组数据。
感谢指点@bartonjs
这看起来很像你在解密过程中没有设置 IV 值,导致前 16 个字节出现明文恢复问题。
要完全恢复,您需要密文、密钥和原始 IV(对于 ECB 以外的模式)。