以编程方式确定 *.ts 视频文件是否使用 AES 128 加密

本文关键字:是否 AES 加密 文件 视频 方式确 编程 ts | 更新日期: 2023-09-27 18:31:45

我想编写一个简单的自动测试来确定 .ts 视频文件是否已使用 AES 128 加密进行加密。 我将可以访问加密和未加密的文件。 我也可以访问密钥。 我几乎可以访问所有内容,因为我正在与进行加密:)的开发人员合作

我宁愿做一个更高级的测试,而不仅仅是检查文件大小是否不同。

对我可以编写的一些简单测试代码有什么想法吗? 我会用c#或powershell编写代码。

完全没有这方面的经验,所以请随意像对待孩子一样对待我。

谢谢

以编程方式确定 *.ts 视频文件是否使用 AES 128 加密

这背后的真正原因是什么? 所以你不加密文件两次,或解密两次? 如果我们知道要求,也许会有更好的解决方案。

但是,根据我目前所看到的情况,您似乎必须尝试解密文件,如果失败,请假设它未加密......但这可能非常耗时。 我不确定是否有其他方法,除了打开文件进行阅读,阅读一行并查看是否有任何明文,假设您知道要将其与什么明文进行比较。

如果您尝试测试加密/解密是否正常工作,那么您可以使用已知的明文输入文件,使用正确的密钥对其进行加密,然后解密两次 - 一次使用正确的密钥,第二次使用无效密钥。 以 3 种方式比较结果。

如果 TS 容器是完全加密的,那么查看该文件是否是有效的 MPEG-TS 文件可能会更有效,而不是试图确定它是否加密。如果它无效,则假定它已加密。您可以读取文件的前几个字节来验证格式。格式(或"幻数")记录在此处:

http://en.wikipedia.org/wiki/MPEG_transport_stream#Packet

希望这有帮助。

我最终做了一个c#命令行。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2
{
    using System.IO;
    using System.Security.Cryptography;
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                Console.WriteLine("<key> <iv> <encryptedfile> <outputdecryptedfile>");
                Environment.Exit(-1);
            }
            //Console.ReadLine();
            byte[] encryptionKey = StringToByteArray(args[0]);
            byte[] encryptionIV = StringToByteArray(args[1]);
            try
            {
                using (FileStream outputFileStream = new FileStream(args[3], FileMode.CreateNew))
                {
                    using (FileStream inputFileStream = new FileStream(args[2], FileMode.Open))
                    {
                        using (var aes = new AesManaged { Key = encryptionKey, IV = encryptionIV, Mode = CipherMode.CBC })
                        using (var encryptor = aes.CreateDecryptor())
                       using (var cryptoStream = new CryptoStream(inputFileStream, encryptor, CryptoStreamMode.Read))
                        {
                            cryptoStream.CopyTo(outputFileStream);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }            
        }
        public static byte[] StringToByteArray(string hex)
        {
            return Enumerable.Range(0, hex.Length)
                             .Where(x => x % 2 == 0)
                             .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                             .ToArray();
        }
    }
}