2017-12-12 11 views
0

우리는 AES-128 암호화 된 m3u8 TS 파일을 해독하려고합니다. 여기에 우리가 enc.key 파일 우리는 암호 해독이 C#을 기능을 사용하고 있지만, 우리가 소금을 찾는 방법을 모르거나하지 않습니다 DVQpuWrxZLd2nCTTxAysIg==AES-128 암호화 된 m3u8 TS 파일을 해독하는 방법

입니다 'enc.key'에 대한 서버 응답 모두가 우리의 .m3u8 파일

#EXTM3U 
#EXT-X-TARGETDURATION:12 
#EXT-X-ALLOW-CACHE:YES 
#EXT-X-PLAYLIST-TYPE:VOD 
#EXT-X-KEY:METHOD=AES-128,URI="enc.key?wmsAuthSign=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbiI6IjdjY2I5ZTAxZGI1YzVkM2IzMWUzMzc1NzQ3MjZjNjYwIiwiZXhwIjoxNTEzMTU4ODM5LCJpc3MiOiJTYWJhIElkZWEgR1NJRyJ9.vvYKPY9tyBnhGGnNtY-XLy_Hz5cyJx5Ma2APVv0g5dk" 
#EXT-X-VERSION:3 
#EXT-X-MEDIA-SEQUENCE:1 
#EXTINF:6.000, 
s-1-v1-a1.ts?wmsAuthSign=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbiI6IjdjY2I5ZTAxZGI1YzVkM2IzMWUzMzc1NzQ3MjZjNjYwIiwiZXhwIjoxNTEzMTU4ODM5LCJpc3MiOiJTYWJhIElkZWEgR1NJRyJ9.vvYKPY9tyBnhGGnNtY-XLy_Hz5cyJx5Ma2APVv0g5dk 
#EXTINF:6.000, 
s-2-v1-a1.ts?wmsAuthSign=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbiI6IjdjY2I5ZTAxZGI1YzVkM2IzMWUzMzc1NzQ3MjZjNjYwIiwiZXhwIjoxNTEzMTU4ODM5LCJpc3MiOiJTYWJhIElkZWEgR1NJRyJ9.vvYKPY9tyBnhGGnNtY-XLy_Hz5cyJx5Ma2APVv0g5dk 
#EXTINF:6.000, 
s-3-v1-a1.ts?wmsAuthSign=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbiI6IjdjY2I5ZTAxZGI1YzVkM2IzMWUzMzc1NzQ3MjZjNjYwIiwiZXhwIjoxNTEzMTU4ODM5LCJpc3MiOiJTYWJhIElkZWEgR1NJRyJ9.vvYKPY9tyBnhGGnNtY-XLy_Hz5cyJx5Ma2APVv0g5dk 
#EXTINF:12.000, 
s-4-v1-a1.ts?wmsAuthSign=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbiI6IjdjY2I5ZTAxZGI1YzVkM2IzMWUzMzc1NzQ3MjZjNjYwIiwiZXhwIjoxNTEzMTU4ODM5LCJpc3MiOiJTYWJhIElkZWEgR1NJRyJ9.vvYKPY9tyBnhGGnNtY-XLy_Hz5cyJx5Ma2APVv0g5dk 

입니다 블록 크기? 또는 기본적으로 우리는 올바른 방식으로 그것을하고 있습니까?

public static void DecryptFile(string inputFile, string output,string password) 
     { 

      byte[] bytesToBeDecrypted = File.ReadAllBytes(inputFile); 
      byte[] passwordBytes = Encoding.UTF8.GetBytes(password); 
      passwordBytes = SHA256.Create().ComputeHash(passwordBytes); 
      byte[] bytesDecrypted = AES_Decrypt(bytesToBeDecrypted, passwordBytes); 


      File.Delete(inputFile); 


      File.WriteAllBytes(output, bytesDecrypted); 
     } 


     public static byte[] AES_Decrypt(byte[] bytesToBeDecrypted, byte[] passwordBytes) 
     { 
      byte[] decryptedBytes = null; 

      // Set your salt here, change it to meet your flavor: 
      // The salt bytes must be at least 8 bytes. 
      byte[] saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 }; 

      using (MemoryStream ms = new MemoryStream()) 
      { 
       using (RijndaelManaged AES = new RijndaelManaged()) 
       { 
        AES.KeySize = 128; 
        AES.BlockSize = 128; 

        var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000); 
        AES.Key = key.GetBytes(AES.KeySize/8); 
        AES.IV = key.GetBytes(AES.BlockSize/8); 

        AES.Mode = CipherMode.CBC; 
        AES.Padding = PaddingMode.PKCS7; 
        using (var cs = new CryptoStream(ms, AES.CreateDecryptor(), CryptoStreamMode.Write)) 
        { 
         cs.Write(bytesToBeDecrypted, 0, bytesToBeDecrypted.Length); 
         cs.Close(); 
        } 
        decryptedBytes = ms.ToArray(); 
       } 
      } 

      return decryptedBytes; 
     } 
+0

'DVQpuWrxZLd2nCTTxAysIg =='는 나에게 base64로 인코딩 된 것처럼 보이므로 UTF8.GetBytes()를 사용하는 대신 디코딩해야합니다. 소금/해시 크기에 관한 한, 아마도 스펙에있는 m3u8 파일의 형식에 특정한 것입니다. –

답변

2

유사한 으론 이미 여기에 있었다 (그것을 다시 찾을 수없는) 당신의 EXT-X-KEY 헤더에 소금 또는 블록 크기

룩을 찾을 수있는 방법

. 그것은 AES-128을 나타내므로 AES-128을 사용해야합니다 (키 크기, 블록 크기는 항상 128 비트입니다).

RFC에 따르면 기본적으로 Pkcs7 패딩이있는 CBC 모드가 사용됩니다.

단면 4.3.2.4. EXT-X-KEY 상기 주 :

the Initialization Vector (IV) attribute value or the Media Sequence Number as the IV는 그래서 IV의 X-EXT-KEY 헤더에 존재해야한다. 그렇지 않다면 시퀀스 번호가 사용됩니다 (CBC는 끔찍한 생각이지만 이것이 그 방법입니다).

또는 기본적으로 우리는

은 기본적으로는 (소금 및 키 제외) 확인을 보이는 올바른 방법으로 그것을하고 있습니다. 나는 암호화 키가 무엇인지 모르겠습니다. 서버의 인코딩 된 응답은 16 비트 (128 비트)이므로 키가 될 수 있습니다 (직접 찾아야 함).

+0

시퀀스 번호를 IV로 변환하려면 어떻게해야합니까? – Oli

+0

@Oli 숫자의 단지 이진 표현입니다. 0x0000000000000001, 0x0000000000000002와 같습니다. 그러나 나는 암호화를 많이 사용하지만 미디어 파일은 아닙니다. 그래서 당신에게 도움이되기를 바랍니다. – gusto2

+0

어떻게 1 또는 2 또는 임의의 숫자를 C#의 바이너리 표현 형태로 바이트 [16]로 변환 할 수 있습니까? – Oli