2016-10-06 90 views
-1

我有一個c#代碼,它將infopath中附件的加密編碼字符串解密。這是下面的代碼:Attachment Decryption System.FormatException:Base-64字符數組或字符串的無效長度

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; } 
    } 

} 

行字節[]海圖= Convert.FromBase64String(theBase64EncodedString);拋出基本64數組或字符串的系統格式異常無效長度。

+0

1.哪裏有代碼加密。 2. Base64編碼的字符串必須是4字節的倍數。 3.您遇到問題的Base64字符串在哪裏? – zaph

+0

加密是在InfoPath e.g做我上傳的文檔進行加密爲x0lGQRQAAAABAAAAAAAAAH8IAAALAAAAdABlAHMAdAAwADEALgB0AHgAdAAAAHVzaW5nIFN5c3RlbTsNCnVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KdXNpbmcgU3lzdGVtLkxpbnE7DQp1c2luZyBTeXN0ZW0uV2ViOw0KdXNpbmcgU3lzdGVtLldlYi5NdmM7DQoNCm5hbWVzcGFjZSBNb3ZpZXNBcHAuQ29udHJvbGxlcnM –

+0

添加額外informatiin **的**問題,所以每個人都西港島線看到它。然後刪除此評論。 – zaph

回答

0

你有什麼是不是Base64編碼,似乎妥協的tqo部分。

所提供的「Base64的數據:

x0lGQRQAAAABAAAAAAAAAH8IAAALAAAAdABlAHMAdAAwADEALgB0AHgAdAAA AHVzaW5nIFN5c3RlbTsN CnVzaW5nIFN5c3RlbS5D b2xsZWN0aW9ucy5HZW5l cmljOw0KdXNpbmcgU3lz dGVtLkxpbnE7DQp1c2lu ZyBTeXN0ZW0uV2ViOw0K dXNpbmcgU3lzdGVtLldl Yi5NdmM7DQoNCm5hbWVz cGFjZSBNb3ZpZXNBcHAu Q29udHJvbGxlcnM

這是不加密的數據由於重複字符

如果你看一下數據的十六進制值,您將看到:

78306c4751525141414141424141414141414141414838494141414c414141416441426c41484d4164414177414445414c6742304148674164414141e2808ce2808b4148567a6157356e49464e356333526c6254734ee2808ce2808b436e567a6157356e49464e356333526c62533544e2808ce2808b623278735a574e3061573975637935485a57356ce2808ce2808b636d6c6a4f77304b64584e70626d636755336c7ae2808ce2808b644756744c6b7870626e45374451703163326c75e2808ce2808b5a79425465584e305a573075563256694f77304be2808ce2808b64584e70626d636755336c7a644756744c6c646ce2808ce2808b5969354e646d4d3744516f4e436d35686257567ae2808ce2808b6347466a5a53424e62335a705a584e4263484175e2808ce2808b5132397564484a766247786c636e4d

請注意,Base64字符集中有字符,如0xe2,0x80,0x8c,0xe2,0x80,0x8b。

另外似乎有兩個部分,有60個字節的初始部分似乎是Base64。解碼十六進制這部分Base64是:

EFCDF4E9CE3BE75E​​76E75E35E35E35E35E36E35E35E35E35E35E35E35E35E35E3CDFCE3DE35E35E35E1CE35E35E35E35EB8E35E36E9CE35E3CE1DE35EB8E35E35EFBE35E38E39E35E1CEBBE36DF4E35E3CEBBE35EB8E35E35E35

相關問題