Как расшифровать файл с дополнительной информацией? - PullRequest
0 голосов
/ 18 мая 2018

Мне нужно добавить заголовок xml в мой зашифрованный файл, чтобы он выглядел следующим образом:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <EncryptedFileHeader>
  <Algorithm>3DES</Algorithm>
  <KeySize>192</KeySize>
  <BlockSize>64</BlockSize>
  <CipherMode>ECB</CipherMode>
  <IV>some IV</IV>
  <ApprovedUsers>
    <User>
      <Email>mark</Email>
      <SessionKey>sss</SessionKey>
    </User>
  </ApprovedUsers>
</EncryptedFileHeader>encrypted data...
more encrypted data....

Для этого я использую этот код, который я нашел в MSDN:

public void EncryptData(String inName, String outName, byte[] tdesKey, byte[] tdesIV)
        {
            //Create the file streams to handle the input and output files.
            FileStream fin = new FileStream(inName, FileMode.Open, FileAccess.Read);
            FileStream fout = new FileStream(outName, FileMode.OpenOrCreate, FileAccess.Write);
            fout.SetLength(0);

            setHeader(fout , tdesIV);

            //Create variables to help with read and write.
            byte[] bin = new byte[100]; //This is intermediate storage for the encryption.
            long rdlen = 0;              //This is the total number of bytes written.
            long totlen = fin.Length;    //This is the total length of the input file.
            int len;                     //This is the number of bytes to be written at a time.

            TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();

            tdes.Padding = PaddingMode.ANSIX923;
            CryptoStream encStream = new CryptoStream(fout, tdes.CreateEncryptor(tdesKey, tdesIV), CryptoStreamMode.Write);

            //Read from the input file, then encrypt and write to the output file.
            while (rdlen < totlen)
            {
                len = fin.Read(bin, 0, 100);
                encStream.Write(bin, 0, len);
                rdlen = rdlen + len;
            }

            encStream.Close();
        }

Добавление заголовка xml:

private void setHeader(FileStream output, byte[] sal)
        {
            XmlDocument doc = new XmlDocument();
            XmlNode docNode = doc.CreateXmlDeclaration("1.0", "UTF-8", "yes");
            doc.AppendChild(docNode);

            XmlNode header = doc.CreateElement("EncryptedFileHeader");
            doc.AppendChild(header);

            XmlNode algorithm = doc.CreateElement("Algorithm");
            algorithm.InnerText = "3DES " + mw.cmb_algorithm.Text;
            header.AppendChild(algorithm);
            XmlNode keySize = doc.CreateElement("KeySize");
            keySize.InnerText = 192.ToString();
            header.AppendChild(keySize);
            XmlNode blockSize = doc.CreateElement("BlockSize");
            blockSize.InnerText = 64.ToString();
            header.AppendChild(blockSize);
            XmlNode cipherMode = doc.CreateElement("CipherMode");
            cipherMode.InnerText = mw.cmb_encryption_mode.Text;
            header.AppendChild(cipherMode);
            XmlNode salt = doc.CreateElement("IV");
            salt.InnerText = System.Text.Encoding.UTF8.GetString(sal);
            header.AppendChild(salt);
            XmlNode approvedUsers = doc.CreateElement("ApprovedUsers");
            header.AppendChild(approvedUsers);

            XmlNode user1 = doc.CreateElement("User");
            approvedUsers.AppendChild(user1);

            XmlNode mail = doc.CreateElement("Email");
            mail.InnerText = "mark";
            user1.AppendChild(mail);
            XmlNode sessionKey = doc.CreateElement("SessionKey");
            sessionKey.InnerText = "sss";
            user1.AppendChild(sessionKey);

            doc.Save(output);            
        }

Он делает то, что мне нужно, но когда дело доходит до декодирования, у меня проблема.По какой-то причине длина входного FileStream (закодированного файла) увеличилась на 3, и из-за этого я получил System.Security.Cryptography.CryptographicException «длина данных для расшифровки недопустима» при закрытии Cryptostream.

Расшифровкаcode:

public void DecryptData(String inName, String outName, byte[] tdesKey, byte[] tdesIV)
        {
            //Create the file streams to handle the input and output files.
            FileStream fin = new FileStream(inName, FileMode.Open, FileAccess.Read);
            FileStream fout = new FileStream(outName, FileMode.OpenOrCreate, FileAccess.Write);
            fout.SetLength(0);

            int position;
            Header header = new Header();
            readHeader(inName,out position, header);
            fin.Position = position;
            //Create variables to help with read and write.
            byte[] bin = new byte[100]; //This is intermediate storage for the encryption.
            long rdlen = 0;              //This is the total number of bytes written.
            long totlen = fin.Length - position;    //This is the total length of the input file.
            int len;                     //This is the number of bytes to be written at a time.

            TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();


            tdes.Padding = PaddingMode.ANSIX923;
            CryptoStream encStream = new CryptoStream(fout, tdes.CreateDecryptor(tdesKey, tdesIV), CryptoStreamMode.Write);


            //Read from the input file, then encrypt and write to the output file.
            while (rdlen < totlen)
            {
                len = fin.Read(bin, 0, 100);
                encStream.Write(bin, 0, len);
                rdlen = rdlen + len;            
            }
            encStream.Close(); //<- exception
        }

Мне нужен этот заголовок xml и зашифрованные данные в одном файле, и мне нужно расшифровать данные.Не смотрите на данные, помещенные в xml, это просто пустая информация, которую мне нужно проверить, если шифрование работает.Когда я не добавляю заголовок, шифрование и дешифрование работает нормально.Есть идеи, как получить эту работу?

...