我必须在 Android 设备上阅读加密视频。
我使用http://elonen.iki.fi/code/nanohttpd/创建了一个 localhost 服务器,它以一种非常简单的方式实现了这一点。
我用它来阅读未加密的视频,但我一直在阅读加密的视频。(我加密视频没有任何麻烦,只是为了阅读它)
我尝试了以下方法:
1-使用简单的“AES”加密视频,当我尝试用我的服务器读取它时,我看到流媒体开始(我看到我的服务器在不同范围内回答 3 次)。3 次后,播放器说无法阅读视频。
2-使用“AES/CTR/NoPadding”加密视频:在这种情况下,我看到我的服务器提供了第一个范围,并且一次又一次地运行,但没有视频显示。
我尝试使用 CTR16 获取 16 位块,并使用 32ko 的缓冲区读取它们。那是行不通的。
(PS:我用我的方法解密图片没问题)
这是我的 crypt 方法:
public static InputStream getUncryptInputStream(InputStream is, String pass, final long dataLen) throws Exception{
SecretKeySpec key = new SecretKeySpec(getRawKey(pass.getBytes()), "AES");
Cipher mCipher = Cipher.getInstance("AES/CTR/NoPadding");
mCipher.init(Cipher.DECRYPT_MODE, key, ivSpec);
if(dataLen==-1){
return new CipherInputStream(is, mCipher);
}else{
return new CipherInputStreamWithDataLen(is, mCipher, dataLen);
}
}
public static OutputStream getCryptOutputStream(OutputStream os, String pass) throws Exception{
SecretKeySpec key = new SecretKeySpec(getRawKey(pass.getBytes()), "AES");
Cipher mCipher = Cipher.getInstance("AES/CTR/NoPadding");
mCipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
return new CipherOutputStream(os, mCipher);
}
private static byte[] getRawKey(byte[] seed) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
sr.setSeed(seed);
kgen.init(128, sr); // 192 and 256 bits may not be available
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
return raw;
}
和CipherInputStreamWithData
我创建的,因为可用的方法总是0
以正常返回CipherInputStreamWithData
:
import java.io.IOException;
import java.io.InputStream;
import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
public class CipherInputStreamWithDataLen extends CipherInputStream{
int dataLen;
public CipherInputStreamWithDataLen(InputStream is, Cipher mCipher, long dataLen) {
super(is, mCipher);
this.dataLen = (int)dataLen;
// TODO Auto-generated constructor stub
}
public int available() throws IOException{
return dataLen;
}
}