我有一個加密的 (128-AES-CTR-NoPadding) 視頻駐留在服務(wù)器上,我需要在下載時對其進(jìn)行解密,以便用戶可以流式傳輸它(在普通播放器/網(wǎng)絡(luò)中)。我了解此解決方案的組成部分以及應(yīng)如何將它們組合在一起以使其發(fā)揮作用。它部分有效,但對于其余部分,我無法正確實現(xiàn)流式傳輸。在過去的一周里,我一直在閱讀和學(xué)習(xí)示例(其中大部分是在磁盤上播放文件,這里不是這種情況),并得出結(jié)論這超出了我的范圍,我需要一些幫助。細(xì)節(jié)我使用輕量級網(wǎng)絡(luò)服務(wù)器 ( nanoHttpd ) 作為代理從遠(yuǎn)程服務(wù)器下載加密數(shù)據(jù)并提供解密數(shù)據(jù)。下面是我的 NanoHTTPD.serve 方法中的主要代碼。//create urlConnection to encrypted video file with proper headers (ie range headers) as request received by the proxy serverInputStream inputStream = new CipherInputStream(cipher, urlConnection.getInputStream());return newChunkedResponse(status, contentType,inputStream);所以現(xiàn)在如果我轉(zhuǎn)到我的 NanoHttpd 網(wǎng)絡(luò)服務(wù)器 ( http://localhost:9000 ),文件將開始下載,下載完成后,文件將按預(yù)期完全解密和播放。因此,這確保了從服務(wù)器獲取加密數(shù)據(jù)和提供解密數(shù)據(jù)的工作正常。但是當(dāng)要求任何視頻播放器(html5、vlc)從該 url 流式傳輸視頻時,它根本不起作用。如果將 NanoHTTPD.serve 中的上述代碼更改為//create urlConnection to cleardata video file with proper headers (ie range headers) as request received by the proxy server InputStream inputStream = urlConnection.getInputStream(); return newChunkedResponse(status, contentType,inputStream);然后嘗試從上述播放器流式傳輸,它會工作得很好。因此,這可確保 Web 代理正確檢索和提供數(shù)據(jù)。潛在問題 為了支持來自視頻播放器的范圍請求,我們需要正確地跳到塊邊界,該塊邊界是密碼塊大小的倍數(shù)。因此,當(dāng)視頻播放器請求帶有標(biāo)頭(范圍:字節(jié) 34-44)的數(shù)據(jù)時,CipherInputStream 可能無法解密數(shù)據(jù),因為輸入流具有來自 34-44 的數(shù)據(jù)。但是我不知道如何使用 urlConnection.getInputStream() 和 CipherInputStream 來做到這一點(diǎn)。但即使沒有這個,它至少應(yīng)該開始播放前幾秒,因為視頻播放器發(fā)送的第一個請求是(范圍:0-),這意味著 inputStream 從索引 0 開始,因此 CipherInputStream 應(yīng)該能夠解密并提供這些初始字節(jié)和視頻應(yīng)繼續(xù)播放。我完全不知所措,因為我不知道如何調(diào)試它。歡迎任何想法,示例代碼,我會嘗試并在此處發(fā)布結(jié)果。
1 回答

小怪獸愛吃肉
TA貢獻(xiàn)1852條經(jīng)驗 獲得超1個贊
我已經(jīng)弄清楚了。我會在這里為其他人發(fā)布解決方案。
這里的問題是遠(yuǎn)程請求。如果代理沒有對這些范圍請求發(fā)送正確的響應(yīng),播放將失敗。由于多種原因,這可能會失敗。
您對遠(yuǎn)程服務(wù)器的請求缺少正確的范圍標(biāo)頭。
您對遠(yuǎn)程服務(wù)器的請求返回了正確的范圍數(shù)據(jù),但您沒有正確解密它。這是我的情況。當(dāng)然,這個解密過程會因密碼而異。對我來說,我使用了 (AES/CRT/NOPADDING),我為偏移量提供了正確的 iv。此處描述了如何計算偏移量 iv 。
就代碼示例而言,我之前只需要添加一行
InputStream inputStream = new CipherInputStream(cipher, urlConnection.getInputStream()); return newChunkedResponse(status, contentType,inputStream);
這是
jumpToOffset(cipher,....);
此后一切正常,包括尋找視頻。
添加回答
舉報
0/150
提交
取消