コード例 #1
0
        private void DecryptWorkerDoWork(object sender, DoWorkEventArgs e)
        {
            TimeSpan  ts;
            const int timeSlice = 50;
            const int nrOfSpeedMeasurements = 50;
            ulong     passwordCount = 0, prevPasswordCount = 0;

            object[]          args             = (object[])e.Argument;
            IDecryptor        decryptor        = DecryptorFactory.Get((EncryptionRecord)args[0]);
            IPasswordIterator passwordIterator = (IPasswordIterator)args[1];
            ValidationMode    validationMode   = (ValidationMode)args[2];
            IMovingAverage    avg              = new SimpleMovingAverage(nrOfSpeedMeasurements);
            PasswordValidity  passwordValidity = PasswordValidity.Invalid;
            Stopwatch         stopWatch        = new Stopwatch();

            stopWatch.Start();
            string currentPassword = passwordIterator.GetNextPassword();

            while (!string.IsNullOrEmpty(currentPassword) &&
                   validationMode != ValidationMode.None &&
                   !decryptBackgroundWorker.CancellationPending)
            {
                passwordValidity = decryptor.ValidatePassword(currentPassword, validationMode);

                passwordCount++;
                ts = stopWatch.Elapsed;
                if (ts.Milliseconds > timeSlice || passwordValidity != PasswordValidity.Invalid)
                {
                    avg.AddSample((60000 * (passwordCount - prevPasswordCount)) / ((ulong)ts.Milliseconds + 1)); //Avoid div by zero
                    decryptBackgroundWorker.ReportProgress(0, new object[]
                                                           { passwordValidity, currentPassword, (ulong)avg.Average, passwordCount });
                    prevPasswordCount = passwordCount;
                    stopWatch.Restart();

                    if ((passwordValidity & PasswordValidity.OwnerPasswordIsValid) == PasswordValidity.OwnerPasswordIsValid)
                    {
                        validationMode &= ~ValidationMode.ValidateOwnerPassword;
                    }

                    if ((passwordValidity & PasswordValidity.UserPasswordIsValid) == PasswordValidity.UserPasswordIsValid)
                    {
                        validationMode &= ~ValidationMode.ValidateUserPassword;
                    }
                }
                currentPassword = passwordIterator.GetNextPassword();
            }

            if (decryptBackgroundWorker.CancellationPending)
            {
                e.Cancel = true;
            }
            else
            {
                e.Result = passwordCount;
            }
        }
コード例 #2
0
        private void OnDecryptCmdExecute()
        {
            Status = string.Empty;

            ClearAllErrors();

            if (SelectedFile == null)
            {
                Status = "Please select a PDF file to decrypt.";
                SetErrors("SelectedFile", new List <ValidationResult>()
                {
                    new ValidationResult(false, Status)
                });
            }
            else if (!SelectedFile.EncryptionRecordInfo.isEncrypted)
            {
                Status = "No encryption dictionary found in PDF.";
            }
            else if (!SelectedFile.OwnerPasswordIsSet && !SelectedFile.UserPasswordIsSet)
            {
                Status = "Both the User password and the Owner password are empty.";
            }
            else if (ValidationModeRequested == ValidationMode.None)
            {
                Status = "Please select the password you want to recover.";
                SetErrors("ValidationModeRequested", new List <ValidationResult>()
                {
                    new ValidationResult(false, Status)
                });
            }
            else if ((ValidationModeRequested & ValidationMode.ValidateOwnerPassword) == ValidationMode.ValidateOwnerPassword &&
                     (ValidationModeRequested & ValidationMode.ValidateUserPassword) == ValidationMode.ValidateUserPassword &&
                     !string.IsNullOrEmpty(SelectedFile.RecoveredOwnerPassword) &&
                     !string.IsNullOrEmpty(SelectedFile.RecoveredUserPassword))
            {
                Status = "The requested passwords are already recovered.";
            }
            else if ((ValidationModeRequested == ValidationMode.ValidateOwnerPassword &&
                      !string.IsNullOrEmpty(SelectedFile.RecoveredOwnerPassword)) ||
                     ((ValidationModeRequested == ValidationMode.ValidateUserPassword &&
                       !string.IsNullOrEmpty(SelectedFile.RecoveredUserPassword))))
            {
                Status = "The requested password is already recovered.";
            }
            else if (SelectedTabItem is ITabViewModel)
            {
                string            errormsg         = string.Empty;
                IPasswordIterator passwordIterator = SelectedTabItem.PasswordIterator;
                if (passwordIterator.Initialize(SelectedFile.EncryptionRecordInfo.PasswordCharset,
                                                SelectedFile.EncryptionRecordInfo.MaxPasswordSize,
                                                ref errormsg) == Constants.Success)
                {
                    IsBusy          = true;
                    CurrentPassword = string.Empty;
                    passwordIterator.PasswordCasing   = PasswordCasing;
                    passwordIterator.RemoveWhitespace = RemoveWhitespace;
                    decryptBackgroundWorker.RunWorkerAsync(new object[]
                                                           { SelectedFile.EncryptionRecordInfo, passwordIterator, ValidationModeRequested });
                }
                else
                {
                    SetErrors("SelectedTabItem", new List <ValidationResult>()
                    {
                        new ValidationResult(false, errormsg)
                    });
                    Status = errormsg;
                }
            }
        }