2016-10-06 5 views
-1

Ich habe einen C# -Code, der die verschlüsselte codierte Zeichenfolge eines Anhangs in infopath übernimmt und entschlüsselt. Dies ist der Code unter:Attachment Decryption System.FormatException: Ungültige Länge für ein Base-64 Char-Array oder String

private int fileSize; 
    private int attachmentNameLength; 
    private string attachmentName; 
    private byte[] decodedAttachment; 


    /// <summary> 
    /// Accepts the Base64 encoded string 
    /// that is the attachment. 
    /// </summary> 
    public InfoPathAttachmentDecoder(string theBase64EncodedString) 
    { 
     **byte[] theData =  Convert.FromBase64String(theBase64EncodedString);** //This line throws a System.FormatException: Invalid length for a Base-64 char array or string. 
     using (MemoryStream ms = new MemoryStream(theData)) 
     { 
      BinaryReader theReader = new BinaryReader(ms); 
      DecodeAttachment(theReader); 
     } 
    } 

    private void DecodeAttachment(BinaryReader theReader) 
    { 
     //Position the reader to obtain the file size. 
     byte[] headerData = new byte[FIXED_HEADER]; 
     headerData = theReader.ReadBytes(headerData.Length); 

     fileSize = (int)theReader.ReadUInt32(); 
     attachmentNameLength = (int)theReader.ReadUInt32() * 2; 

     byte[] fileNameBytes = theReader.ReadBytes(attachmentNameLength); 
     //InfoPath uses UTF8 encoding. 
     Encoding enc = Encoding.Unicode; 
     attachmentName = enc.GetString(fileNameBytes, 0, attachmentNameLength - 2); 
     decodedAttachment = theReader.ReadBytes(fileSize); 
    } 

    public void SaveAttachment(string saveLocation) 
    { 
     string fullFileName = saveLocation; 
     if (!fullFileName.EndsWith(Path.DirectorySeparatorChar.ToString())) 
     { 
      fullFileName += Path.DirectorySeparatorChar; 
     } 

     fullFileName += attachmentName; 

     if (File.Exists(fullFileName)) 
      File.Delete(fullFileName); 

     FileStream fs = new FileStream(fullFileName, FileMode.CreateNew); 
     BinaryWriter bw = new BinaryWriter(fs); 
     bw.Write(decodedAttachment); 

     bw.Close(); 
     fs.Close(); 
    } 

    public string Filename 
    { 
     get { return attachmentName; } 
    } 

    public byte[] DecodedAttachment 
    { 
     get { return decodedAttachment; } 
    } 

} 

Die Linie byte [] = theData Convert.FromBase64String (theBase64EncodedString); Gibt eine ungültige Systemlänge für ein Array oder eine Zeichenfolge der Basis 64 aus.

+0

1. Wo ist die Verschlüsselung im Code. 2. Base64-codierte Strings müssen ein Vielfaches von 4 Bytes sein. 3. Wo ist die Base64-Zeichenfolge, mit der Sie Probleme haben? – zaph

+0

Die Verschlüsselung in infopath erfolgt beispiels ein Dokument, das ich hochgeladen verschlüsselt als x0lGQRQAAAABAAAAAAAAAH8IAAALAAAAdABlAHMAdAAwADEALgB0AHgAdAAAAHVzaW5nIFN5c3RlbTsNCnVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KdXNpbmcgU3lzdGVtLkxpbnE7DQp1c2luZyBTeXN0ZW0uV2ViOw0KdXNpbmcgU3lzdGVtLldlYi5NdmM7DQoNCm5hbWVzcGFjZSBNb3ZpZXNBcHAuQ29udHJvbGxlcnM –

+0

den zusätzlichen informatiin hinzufügen ** auf die Frage **, so dass jeder es sehen wil. Dann lösche diesen Kommentar. – zaph

Antwort

0

Das, was Sie haben, ist nicht Base64-kodiert und scheint kompromittiert zu sein.

Die bereitgestellte „Base64 Daten:

x0lGQRQAAAABAAAAAAAAAH8IAAALAAAAdABlAHMAdAAwADEALgB0AHgAdAAA AHVzaW5nIFN5c3RlbTsN CnVzaW5nIFN5c3RlbS5D b2xsZWN0aW9ucy5HZW5l cmljOw0KdXNpbmcgU3lz dGVtLkxpbnE7DQp1c2lu ZyBTeXN0ZW0uV2ViOw0K dXNpbmcgU3lzdGVtLldl Yi5NdmM7DQoNCm5hbWVz cGFjZSBNb3ZpZXNBcHAu Q29udHJvbGxlcnM

Dies ist nicht verschlüsselt Daten aufgrund von wiederholte Zeichen

Wenn man sich die Hex-Werte der Daten anschauen, werden Sie sehen:

78306c4751525141414141424141414141414141414838494141414c414141416441426c41484d4164414177414445414c6742304148674164414141e2808ce2808b4148567a6157356e49464e356333526c6254734ee2808ce2808b436e567a6157356e49464e356333526c62533544e2808ce2808b623278735a574e3061573975637935485a57356ce2808ce2808b636d6c6a4f77304b64584e70626d636755336c7ae2808ce2808b644756744c6b7870626e45374451703163326c75e2808ce2808b5a79425465584e305a573075563256694f77304be2808ce2808b64584e70626d636755336c7a644756744c6c646ce2808ce2808b5969354e646d4d3744516f4e436d35686257567ae2808ce2808b6347466a5a53424e62335a705a584e4263484175e2808ce2808b5132397564484a766247786c636e4d

Beachten Sie, dass Zeichen aus dem Base64-Zeichensatz wie 0xe2, 0x80, 0x8c, 0xe2, 0x80, 0x8b vorhanden sind.

Zusätzlich scheint es zwei Teile zu geben, es gibt einen ersten Abschnitt von 60 Byte, der Base64 zu sein scheint. Dieser Abschnitt Base64 zu hex decodiert ist:

EFCDF4E9CE3BE75E76E75E35E35E35E35E36E35E35E35E35E35E35E35E35E35E3CDFCE3DE35E35E35E1CE35E35E35E35EB8E35E36E9CE35E3CE1DE35EB8E35E35EFBE35E38E39E35E1CEBBE36DF4E35E3CEBBE35EB8E35E35E35

Verwandte Themen