Warum erhalte ich die Meldung "Die Eingabe ist keine gültige Base-64-Zeichenfolge" Ausnahme
in meinem Projekt habe ich zwei Methoden zum Verschlüsseln und Entschlüsseln der XML-Datei
und andere Schlepptau Methoden zum speichern und laden von Daten in die XML-Datei
ich weiß nicht, warum ich diese Ausnahme, wenn ich Daten Load()
Die Eingabe ist keine gültige Base-64-Zeichenfolge, da es enthält eine nicht-base-64
Zeichen, mehr als zwei Füllzeichen, oder ein nicht-Leerzeichen
Charakter unter dem Füllzeichen.
- und das ist meine Methoden
public static string Encrypt(string plainText)
{
byte[] initVectorBytes = Encoding.ASCII.GetBytes("teto1620@#$%asdf");
byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
byte[] keyBytes = Encoding.Unicode.GetBytes("_+)&qwer9512popo");
var symmetricKey = new RijndaelManaged();
symmetricKey.Mode = CipherMode.CBC;
ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes);
MemoryStream memoryStream = new MemoryStream();
CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write);
cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
cryptoStream.FlushFinalBlock();
byte[] cipherTextBytes = memoryStream.ToArray();
memoryStream.Close();
cryptoStream.Close();
string cipherText = Convert.ToBase64String(cipherTextBytes);
return cipherText;
}
public static string Decrypt(string cipherText)
{
byte[] initVectorBytes = Encoding.ASCII.GetBytes("teto1620@#$%asdf");
byte[] cipherTextBytes = Convert.FromBase64String(cipherText);
byte[] keyBytes = Encoding.Unicode.GetBytes("_+)&qwer9512popo");
RijndaelManaged symmetricKey = new RijndaelManaged();
symmetricKey.Mode = CipherMode.CBC;
ICryptoTransform decryptor = symmetricKey.CreateDecryptor(keyBytes, initVectorBytes);
MemoryStream memoryStream = new MemoryStream(cipherTextBytes);
CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read);
byte[] plainTextBytes = new byte[cipherTextBytes.Length];
int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
memoryStream.Close();
cryptoStream.Close();
string plainText = Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount);
return plainText;
}
zwei weitere Methoden zum speichern und laden von Daten
public bool Save()
{
bool isSaved = false;
try
{
if (SharedData.DeviceList != null)
{
var fileInfo = new FileInfo(SharedData.CONFIGURATION_FULL_PATH);
if (!fileInfo.Exists)
{
File.Create(SharedData.CONFIGURATION_FULL_PATH).Close();
}
var streamWriter = new StreamWriter(SharedData.CONFIGURATION_FULL_PATH);
streamWriter.Write(Encrypt("<?xml version=\"1.0\" encoding=\"utf-8\"?><settings>"));
if (SharedData.DeviceList.Count > 0)
{
foreach (var device in SharedData.DeviceList)
{
streamWriter.Write(Encrypt("<username>" +device.Username + "</username>"));
streamWriter.Write(Encrypt("<AgentName>" +device.AgentName + "</AgentName>"));
streamWriter.Write(Encrypt("<password>" + device.Password + "</password>"));
streamWriter.Write(Encrypt("<domain>" + device.Domain + "</domain>"));
streamWriter.Write(Encrypt("<peerUri>" + device.PeerURI + "</peerUri>"));
streamWriter.Write(Encrypt("<sipUri>" + device.SipURI + "</sipUri>"));
streamWriter.Write(Encrypt("<fqdn>" + device.FQDN+ "</fqdn>"));
streamWriter.Write(Encrypt("<type>" + ((byte)device.Type).ToString() + "</type>"));
streamWriter.Write(Encrypt("<transportType>" +((byte)device.TransportType).ToString() + "</transportType>"));
}
}
streamWriter.Write(Encrypt("</settings>"));
streamWriter.Close();
isSaved = true;
}
else isSaved = false;
}
catch { isSaved = false; }
return isSaved;
}
private bool Load()
{
bool isLoaded = false;
try
{
if (SharedData.DeviceList != null)
{
var fileInfo = new FileInfo(SharedData.CONFIGURATION_FULL_PATH);
if (fileInfo.Exists)
{
var textTodecrypt = File.ReadAllText(SharedData.CONFIGURATION_FULL_PATH);
var xmlReader = new XmlTextReader(Decrypt(textTodecrypt));
var nodeElement = string.Empty;
var thisDevice = new Device();
while (xmlReader.Read())
{
if (xmlReader.NodeType == XmlNodeType.Element) nodeElement = xmlReader.Name;
if (xmlReader.NodeType == XmlNodeType.Text)
{
switch (nodeElement)
{
case @"username":
if (xmlReader.Value.Length > 0) thisDevice = new Device
{
Username = xmlReader.Value
};
break;
case @"AgentName":
if (xmlReader.Value.Length > 0)
thisDevice.AgentName = xmlReader.Value;
break;
case @"password":
if (xmlReader.Value.Length > 0)
thisDevice.Password = xmlReader.Value;
break;
case @"peerUri":
if (xmlReader.Value.Length > 0)
thisDevice.PeerURI = xmlReader.Value;
break;
case @"sipUri":
if (xmlReader.Value.Length > 0)
thisDevice.SipURI = xmlReader.Value;
break;
case @"domain":
if (xmlReader.Value.Length > 0)
thisDevice.Domain = xmlReader.Value;
break;
case @"fqdn":
if (xmlReader.Value.Length > 0)
thisDevice.FQDN = xmlReader.Value;
break;
case @"type":
if (xmlReader.Value.Length > 0)
thisDevice.Type = (Enums.DeviceType)byte.Parse(xmlReader.Value);
break;
case @"transportType":
if (xmlReader.Value.Length > 0)
{
thisDevice.TransportType = (Enums.ServerTransportType)byte.Parse(xmlReader.Value);
if (!IsExist(thisDevice, false)) SharedData.DeviceList.Add(thisDevice);
}
break;
}
}
}
xmlReader.Close();
SharedData.TempDeviceList = SharedData.DeviceList;
isLoaded = true;
}
else isLoaded = false;
}
}
catch (Exception)
{
isLoaded = false;
}
return isLoaded;
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ok, dein Fehler ist, dass Sie verschlüsseln Ihre Daten Zeile für Zeile und versuchen Sie zu entschlüsseln, es als ganzen block.
Base64 konvertiert jedes 3 bytes auf 4 Zeichen. Wenn Sie die Eingabe von Daten ist nicht ein Vielfaches von 3 bytes, die Codierung fügt 1 oder 2 null-bytes als padding. Dies ist dann gekennzeichnet durch ein oder zwei " = " - Zeichen an das Ende des Streams.
Nun, wenn Sie versuchen zu entschlüsseln, mehrere verkettete code-Blöcke, die Sie wahrscheinlich haben ' = ' - Zeichen innerhalb der stream, das ist illegal.
Die Lösung: schreiben Sie Ihre Save-Methode zuerst speichern Sie alle Ihre xml-Entitäten in einem großen string/memory block (StringBuilder verwenden, oder schreiben einen MemoryStream) und die Verwendung Ihrer encrypt-Methode auf den gesamten Datenblock auf einmal.