0

クライアントからサーバーにファイルを安全に暗号化して送信するためのクライアントとサーバーを作成しようとしています。まず、RSAを使用して、2つの側(クライアントからサーバー)間でDESキーを送信します。私はRSAパブリックがそれを使用して送信し、DESキーを暗号化してサーバーに送信し、復号化しました。次に、サーバーに送信されるバイト配列に、ファイル名の長さ、ファイル名、およびデータ(暗号化)を追加しました。DESを使用してファイルを復号化しているときに、不正なデータ例外を受け取ったため、ファイルが誤って送信されたか、DESキーがクライアントからサーバーに誤って送信されたと思いました。また、ファイルはオリジンで復号化できます。

クライアントコードは次のとおりです。

//encrypt the file with the des key
            byte [] encryptedFile = DESEncrypt(fileBytes);
            MessageBox.Show("enc file length  " + encryptedFile.Length);
            //send the file
            byte[] k = DESdecrypt(encryptedFile);

            byte[] fileNameByte = Encoding.ASCII.GetBytes(Path.GetFileName(filePath.Text));

            byte[] clientData = new byte[4 + fileNameByte.Length + encryptedFile.Length];
            byte[] fileNameLen = BitConverter.GetBytes(fileNameByte.Length);

            fileNameLen.CopyTo(clientData, 0);
            fileNameByte.CopyTo(clientData, 4);
            encryptedFile.CopyTo(clientData, 4 + fileNameByte.Length);

            soc.Send(clientData);

サーバーコードは次のとおりです。

byte[] clientData = new byte[1024 * 5000];
                int receivedBytesLen = s.Receive(clientData);
                byte[] b = clientData;
                int fileNameLen = BitConverter.ToInt32(clientData, 0);

                fileName = Encoding.ASCII.GetString(clientData, 4, fileNameLen);
                byte[] l = Encoding.ASCII.GetBytes(fileName);
                Console.WriteLine("Client:{0} connected & File {1} started received.", s.RemoteEndPoint, fileName);
                Console.WriteLine("buffer size  : ", b.Length);
                Console.WriteLine("index  : ", 4 + fileNameLen);

                string temp = System.Text.Encoding.UTF8.GetString(b, 3 + fileNameLen, receivedBytesLen);
                fileBytes = System.Text.Encoding.UTF8.GetBytes(temp);
                Console.WriteLine("rec file");

            }
            catch (Exception exx)
            {
                Console.WriteLine(exx.ToString());
                Console.Read();
            }
            //decrypt
            byte[] decryptedFile = null;
            try
            {

                decryptedFile = DESdecrypt(fileBytes);
            }
            catch(Exception exx)
            {
                Console.WriteLine(exx.ToString());
                Console.Read();
            }
4

1 に答える 1

0

問題は、間違ったブロックを解読しようとしていることです。これは、間違ったインデックスを使用したためです

string temp = System.Text.Encoding.UTF8.GetString(b, 3 + fileNameLen, receivedBytesLen);

に更新:

Array.Copy(b, fileNameLen + 4, fileBytes, 0, dataLengthInt - fileNameLen-4);

私が使用したファイルでは、受け取ったBytesLenは2756バイトで、復号化されたデータは1496バイトであるため、データ長を送信してデータブロックから抽出する必要がありました。

于 2012-04-28T12:17:15.870 に答える