Мне нужно добавить заголовок 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, это просто пустая информация, которую мне нужно проверить, если шифрование работает.Когда я не добавляю заголовок, шифрование и дешифрование работает нормально.Есть идеи, как получить эту работу?