示例#1
0
        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);
        }
示例#2
0
 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);
             }
         }
     }
 }