java 使用AES(128)加密和解密音频/视频文件
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/16119028/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Encryption and decryption of a audio/video file using AES(128)
提问by Krish
I am writing a program that sends an audio/video file to the server where the data is encrypted and sent back to the client on a socket. In the client part, the data is extracted and is decrypted and stored into an another file.The data is getting encrypted and decrypted as well,but the decrypted file is not playing properly.
我正在编写一个程序,将音频/视频文件发送到服务器,在那里数据被加密并通过套接字发送回客户端。在客户端部分,数据被提取并解密并存储到另一个文件中。数据也在被加密和解密,但解密的文件不能正常播放。
Can anyone help? My code is as follows
任何人都可以帮忙吗?我的代码如下
Server:
服务器:
public class Ser_enc
{
private static int packet_count;
private static int packet_size=1024;
public static void main(String args[]) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException
{
System.out.println("Hi iam server");
ServerSocket ss=new ServerSocket(2001);
Socket s=ss.accept();
BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream()));//sockin
OutputStream pw= s.getOutputStream();
String filename=in.readLine();
System.out.println("The file requested is " +filename);
String loc="F://files//source_files//"+filename;
File file=new File(loc);
if(file.exists())
System.out.println("File found");
File to_b_encf =new File("F:/files/source_files//encryped.mp3");
if(!to_b_encf.exists())
to_b_encf.createNewFile();
System.out.println("encrypting");
Cipher encipher = Cipher.getInstance("AES");
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecretKey skey = kgen.generateKey();//initiate key
encipher.init(Cipher.ENCRYPT_MODE, skey);
FileInputStream fsrc=new FileInputStream(loc);
FileOutputStream encfile=new FileOutputStream(to_b_encf);
CipherInputStream cis = new CipherInputStream(fsrc, encipher);
int read;
while((read=cis.read())!=-1)
{
encfile.write(read);
encfile.flush();
}
BufferedInputStream fsrcread=new BufferedInputStream(new FileInputStream(to_b_encf));
packet_count = (int) Math.ceil((to_b_encf.length()/packet_size));
System.out.println("The number of packets to send is :" +packet_count);
for(int i=0;i<=packet_count;i++)
{
byte[] packet=new byte[packet_size];
fsrcread.read(packet, 0, packet_size);
int per=(int)((i*100)/(packet_count));
System.out.println("Transfer " +per +"% done");
pw.write(packet);
pw.flush();
}
s.close();
pw.close();
cis.close();
encfile.close();
}
}
Client:
客户:
public class Cli_dec
{
private static Socket s;
private static int read;
public static void main(String args[]) throws UnknownHostException, IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException
{
s=new Socket("127.0.0.1",2001);
PrintWriter out=new PrintWriter(s.getOutputStream());
String fname=JOptionPane.showInputDialog(null);
out.write(fname+"\n");
out.flush();
int count;
byte[] buf=new byte[100000];
System.out.println("Receiving packets");
File f=new File("F:/files/source_files//decryped.mp3");
FileOutputStream to_b_decf=new FileOutputStream(f);
BufferedOutputStream bos=new BufferedOutputStream(to_b_decf);
InputStream in1=s.getInputStream();
while((count=in1.read(buf))>0)
{
bos.write(buf, 0,count);
bos.flush();
}
File destfile =new File("F:/files/source_files//original.mp3");
if(!destfile.exists())
destfile.createNewFile();
Cipher decipher = Cipher.getInstance("AES");//initiate a cipher for decryption
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecretKey skey = kgen.generateKey();//initiate key
decipher.init(Cipher.DECRYPT_MODE, skey);//decrypt the file
FileInputStream decf=new FileInputStream(f);
System.out.println("decrypting");
CipherInputStream c_decf=new CipherInputStream(decf,decipher);
FileOutputStream destf=new FileOutputStream(destfile);
CipherOutputStream cout=new CipherOutputStream(destf,decipher);
while((read=c_decf.read())!=-1)
{
cout.write(read);
cout.flush();
}
c_decf.close();
destf.close();
cout.close();
decf.close();
s.close();
}
}
采纳答案by Zim-Zam O'Pootertoot
You're using kgen.generateKey()
in the client, which generates a random key - you need to use the same key for the server and client or else you'll get gibberish.
您正在kgen.generateKey()
客户端中使用,它会生成一个随机密钥 - 您需要为服务器和客户端使用相同的密钥,否则您会得到胡言乱语。
The accepted answer to this questionhas some good encryption code that you can use - use KeySpec spec = new PBEKeySpec(password, salt, 64, 128);
to reduce the iteration count and to use 128-bit encryption instead of 256-bit encryption. This code also uses Cipher Block Chaining instead of Electronic Codebook, which is much more secure (see this Wikipedia article for an explanation of cipher modes). Both the server and client will need to use the same key generation code so that their keys match; in addition to using the same key, the encrypter and decrypter will need to use the same initialization vector (IV), but this isn't secret (can be transmitted in plaintext).
这个问题的公认答案有一些很好的加密代码,您可以使用 - 用于KeySpec spec = new PBEKeySpec(password, salt, 64, 128);
减少迭代次数并使用 128 位加密而不是 256 位加密。此代码还使用密码块链接而不是电子密码本,后者更加安全(有关密码模式的说明,请参阅此维基百科文章)。服务器和客户端都需要使用相同的密钥生成代码,以便它们的密钥匹配;除了使用相同的密钥之外,加密器和解密器还需要使用相同的初始化向量 (IV),但这不是秘密(可以以明文形式传输)。
回答by Axay Patel
i am in middle of developing application that do like you asked, your code helped me well.
我正在按照您的要求开发应用程序,您的代码对我帮助很大。
in client module you did double decryption... my code looks like this
在客户端模块中,您进行了双重解密...我的代码如下所示
CipherInputStream c_decf = new CipherInputStream(decf, decipher);
FileOutputStream destf = new FileOutputStream(destfile);
//CipherOutputStream cout = new CipherOutputStream(destf, decipher);
while ((read = c_decf.read()) != -1) {
destf.write(read);
destf.flush();
}
c_decf.close();
destf.close();
// cout.close();
decf.close();
just remove it and did a key generation as How do i decrypt a file in Android with AES?. code works.
只需删除它并生成密钥作为如何使用 AES 在 Android 中解密文件?. 代码有效。
thank you for posting this question.
感谢您发布这个问题。