【问题标题】:Random characters at beginning of decrypted data解密数据开头的随机字符
【发布时间】:2017-05-06 06:15:57
【问题描述】:

我在 Delphi 中使用 TADOQuery 组件来读取数据库中列的内容,这些内容已由第三方 .net 应用程序使用 RijndaelManaged 算法加密。我已“成功”将数据解密回其原始 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 的指点

【问题讨论】:

  • 前几个字节总是一样的?也许加密内容在那之后开始。
  • 该数据的十六进制值是多少?
  • 文档没有提到它,但您传递给“读取”的第二个参数称为“偏移量”。我认为它用于确定阅读的起始位置。如果没有,请使用“位置”或“搜索”前进。
  • @KenWhite 在解密之前还是之后?
  • 解密后 - 无论您得到什么,在解密后 都是出乎意料的,这将使我们能够查看它是 BOM 还是某种已知签名。这 ?_???您发布的内容没有提供任何有用的信息。

标签: .net delphi encryption byte-order-mark rijndaelmanaged


【解决方案1】:

这看起来很像您在解密期间没有设置 IV 值,导致前 16 个字节出现明文恢复问题。

要完全恢复,您需要密文、密钥和原始 IV(对于 ECB 以外的模式)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    相关资源
    最近更新 更多