public static async Task <bool> EncryptFilename(string uploadfilename, string enckey, string checkpoint, CancellationToken ct = default(CancellationToken)) { int retry = 30; while (--retry > 0) { var child = (await GetChanges(checkpoint, ct).ConfigureAwait(false)).Where(x => x.name.Contains(uploadfilename)).LastOrDefault(); if (child?.status == "AVAILABLE") { Config.Log.LogOut("EncryptFilename"); using (var ms = new MemoryStream()) { byte[] plain = Encoding.UTF8.GetBytes(enckey); ms.Write(plain, 0, plain.Length); ms.Position = 0; using (var enc = new CryptCTR.AES256CTR_CryptStream(ms, child.id)) { byte[] buf = new byte[ms.Length]; enc.Read(buf, 0, buf.Length); string cryptname = ""; foreach (var c in buf) { cryptname += (char)('\u2800' + c); } int retry2 = 30; FileMetadata_Info reItem = null; while (--retry2 > 0) { try { if (reItem == null) { reItem = await Drive.renameItem(id : child.id, newname : cryptname, ct : ct).ConfigureAwait(false); } } catch { } var child2 = (await GetChanges(checkpoint: ChangeCheckpoint, ct: ct).ConfigureAwait(false)).Where(x => x.name.Contains(cryptname)).LastOrDefault(); if (reItem != null && child2?.status == "AVAILABLE") { AmazonDriveTree[reItem.id].IsEncrypted = CryptMethods.Method1_CTR; AmazonDriveTree[reItem.id].ReloadCryptedMethod1(); break; } await Task.Delay(2000).ConfigureAwait(false); } return(true); } } } await Task.Delay(2000).ConfigureAwait(false); } return(false); }
public static string DecryptFilename(FileMetadata_Info downloaditem) { using (var ms = new MemoryStream()) { string cryptname = downloaditem?.name; if (string.IsNullOrEmpty(cryptname)) { return(null); } byte[] buf = new byte[cryptname.Length]; int i = 0; foreach (var c in cryptname) { if (c < '\u2800' || c > '\u28ff') { return(null); } buf[i++] = (byte)(c - '\u2800'); } ms.Write(buf, 0, i); ms.Position = 0; using (var dec = new CryptCTR.AES256CTR_CryptStream(ms, downloaditem.id)) { byte[] plain = new byte[i]; dec.Read(plain, 0, plain.Length); var plainname = Encoding.UTF8.GetString(plain); if (plainname.IndexOfAny(Path.GetInvalidFileNameChars()) < 0) { if (Regex.IsMatch(plainname ?? "", ".*?\\.[a-z0-9]{8}$")) { return(plainname); } else { return(null); } } else { return(null); } } } }