我在Delphi中使用TADOQuery组件来读取数据库中列的内容,这些列已使用RijndaelManaged算法由第三方.net应用程序加密。我已经“成功地”将数据解密回原来的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
每个加密文件都有相同的标题,如下所示:
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
对象的属性。我将IV
更改为包含正确字节数组数据的myIV
。
感谢指针@bartonjs
答案 0 :(得分:3)
这看起来很像你在解密期间没有设置IV值,导致前16个字节有明文恢复问题。
要完全恢复,您需要密文,密钥和原始IV(适用于ECB以外的模式)。