我想编写一个简单的自动化测试来确定.ts视频文件是否已使用AES 128加密进行加密。我将可以访问加密和未加密的文件。我也可以访问密钥。我几乎可以访问所有内容,因为我正在与开发人员一起进行加密:)
我更倾向于进行更高级的测试,而不仅仅是检查文件大小是否不同。
我可以写一些关于一些简单测试代码的想法吗?我将用c#或powershell编写代码。
我对这些东西绝对没有经验,所以请像对待孩子一样对待我。
由于
答案 0 :(得分:1)
这背后的真正原因是什么?所以你不加密文件两次,或解密两次?如果我们知道要求,也许有更好的解决方案。
然而,根据我目前所看到的情况,您似乎必须尝试解密该文件,如果失败,则假设它未加密......但这可能非常耗时。我不确定是否还有其他方法,除了打开文件进行阅读,读取一行并查看是否有任何明文,假设您知道要比较它的明文。
如果您正在尝试测试加密/解密是否正常工作,那么您可以获取具有已知明文的输入文件,使用正确的密钥对其进行加密,然后使用正确的密钥对其进行两次解密,第二次使用正确的密钥进行解密无效的密钥。比较结果3种方式。
答案 1 :(得分:1)
如果TS容器是完全加密的,那么查看该文件是否是有效的MPEG-TS文件而不是试图弄清楚它是否已加密可能更有效。如果它无效,则假设它已加密。您可以读取文件的前几个字节以验证格式。格式(或“幻数”)记录在这里:
http://en.wikipedia.org/wiki/MPEG_transport_stream#Packet
希望这有帮助。
答案 2 :(得分:1)
我最终制作了一个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();
}
}
}