1

オーディオ/ビデオ ファイルをサーバーに送信し、そこでデータが暗号化され、ソケットでクライアントに送り返されるプログラムを作成しています。クライアント部分では、データが抽出され、復号化されて別のファイルに保存されます。データも暗号化および復号化されますが、復号化されたファイルは正しく再生されません。

誰でも助けることができますか?私のコードは次のとおりです

サーバ:

    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();
   }
   }

クライアント:

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();
}

}
4

2 に答える 2

1

ランダムキーを生成するクライアントで使用kgen.generateKey()しています-サーバーとクライアントに同じキーを使用する必要があります。そうしないと、意味不明になります。

この質問に対する受け入れられた回答には、使用できる優れた暗号化コードが含まれています。これを使用KeySpec spec = new PBEKeySpec(password, salt, 64, 128);して、反復回数を減らし、256 ビット暗号化の代わりに 128 ビット暗号化を使用します。このコードは、はるかに安全な電子コードブックの代わりに暗号ブロック連鎖も使用しています(暗号モードの説明については、このウィキペディアの記事を参照してください)。サーバーとクライアントの両方が、キーが一致するように同じキー生成コードを使用する必要があります。同じキーを使用することに加えて、暗号化と復号化は同じ初期化ベクトル (IV) を使用する必要がありますが、これは秘密ではありません (プレーンテキストで送信できます)。

于 2013-04-20T13:30:48.513 に答える
1

私はあなたが尋ねたようにアプリケーションを開発している最中です。あなたのコードは私を助けてくれました。

クライアントモジュールでは、二重の復号化を行いました...私のコードは次のようになります

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();

それを削除して、AES を使用して Android でファイルを復号化するにはどうすればよいですか? のようにキー生成を行いました。. コードが動作します。

この質問を投稿していただきありがとうございます。

于 2014-12-24T12:43:38.183 に答える