/// <summary> /// Шифрование (зашифрование или расшифрование) заключительного /// массива байтов. /// </summary> /// /// <param name="inputBuffer">Входной массив байтов.</param> /// <param name="inputOffset">Смещение от начала входного /// массива.</param> /// <param name="inputCount">Число обрабатываемых байтов входного /// массива.</param> /// /// <returns>Зашифрованный или расшифрованный оконечный /// блок.</returns> /// /// <argnull name="inputBuffer" /> /// <exception cref="ArgumentOutOfRangeException"> /// <paramref name="inputOffset"/> меньше нуля.</exception> /// <exception cref="ArgumentException"> /// <paramref name="inputCount"/> меньше нуля или /// входной блок выходит за границы массива.</exception> /// <exception cref="CryptographicException">При расшифровании /// в блочном режиме массива байтов с разером не кратным /// размеру блока.</exception> public byte[] TransformFinalBlock(byte[] inputBuffer, int inputOffset, int inputCount) { if (inputBuffer == null) { throw new ArgumentNullException("inputBuffer"); } if (inputOffset < 0) { throw new ArgumentOutOfRangeException("inputOffset", SR.ArgumentOutOfRange_NeedNonNegNum); } if ((inputCount < 0) || (inputCount > inputBuffer.Length)) { throw new ArgumentException( SR.Argument_InvalidValue); } if ((inputBuffer.Length - inputCount) < inputOffset) { throw new ArgumentException(SR.Argument_InvalidValue); } if (_encrypting) { byte[] buffer1 = null; CapiHelper.EncryptDataCp(_safeProvHandle, safeKeyHandle_, inputBuffer, inputOffset, inputCount, ref buffer1, 0, _paddingValue, true, _isStream); Reset(); return(buffer1); } // На поточных алгоритмах не проверяем соответствие длин. if (_isStream) { byte[] buffer2 = null; CapiHelper.DecryptDataCp(safeKeyHandle_, inputBuffer, inputOffset, inputCount, ref buffer2, 0, _paddingValue, true); Reset(); return(buffer2); } if ((inputCount % InputBlockSize) != 0) { throw new CryptographicException(SR.Argument_InvalidValue); } if (depadBuffer_ == null) { byte[] buffer2 = null; CapiHelper.DecryptDataCp(safeKeyHandle_, inputBuffer, inputOffset, inputCount, ref buffer2, 0, _paddingValue, true); Reset(); return(buffer2); } byte[] buffer3 = new byte[depadBuffer_.Length + inputCount]; Array.Copy(depadBuffer_, 0, buffer3, 0, depadBuffer_.Length); Array.Copy(inputBuffer, inputOffset, buffer3, depadBuffer_.Length, inputCount); byte[] buffer4 = null; CapiHelper.DecryptDataCp(safeKeyHandle_, buffer3, 0, buffer3.Length, ref buffer4, 0, _paddingValue, true); Reset(); return(buffer4); }
/// <summary> /// Шифрование (зашифрование или расшифрование) /// заданной области входного массива байтов и в заданную /// область выходного массива байтов. /// </summary> /// /// <param name="inputBuffer">Входной массив байтов.</param> /// <param name="inputOffset">Смещение от начала входного /// массива.</param> /// <param name="inputCount">Число обрабатываемых байтов входного /// массива.</param> /// <param name="outputBuffer">Выходной массив байтов.</param> /// <param name="outputOffset">Смещение от начала выходного /// массива.</param> /// /// <returns>Количество записанных байтов.</returns> /// /// <argnull name="inputBuffer" /> /// <argnull name="outputBuffer" /> /// /// <exception cref="ArgumentException">Длина входного массива меньше /// суммы смещения от его начала и числа обрабатываемых /// байтов.</exception> /// /// <exception cref="ArgumentOutOfRangeException">Если начальное /// смещение отрицательно.</exception> public int TransformBlock(byte[] inputBuffer, int inputOffset, int inputCount, byte[] outputBuffer, int outputOffset) { if (inputBuffer == null) { throw new ArgumentNullException("inputBuffer"); } if (outputBuffer == null) { throw new ArgumentNullException("outputBuffer"); } if (inputOffset < 0) { throw new ArgumentOutOfRangeException("inputOffset", SR.ArgumentOutOfRange_NeedNonNegNum); } if (((inputCount <= 0) || ((inputCount % InputBlockSize) != 0)) || (inputCount > inputBuffer.Length)) { throw new ArgumentException(SR.Argument_InvalidValue); } if ((inputBuffer.Length - inputCount) < inputOffset) { throw new ArgumentException(SR.Argument_InvalidValue); } if (_encrypting) { return(CapiHelper.EncryptDataCp(_safeProvHandle, safeKeyHandle_, inputBuffer, inputOffset, inputCount, ref outputBuffer, outputOffset, _paddingValue, false, _isStream)); } if ((_paddingValue == PaddingMode.Zeros) || (_paddingValue == PaddingMode.None)) { return(CapiHelper.DecryptDataCp(safeKeyHandle_, inputBuffer, inputOffset, inputCount, ref outputBuffer, outputOffset, _paddingValue, false)); } if (depadBuffer_ == null) { depadBuffer_ = new byte[InputBlockSize]; int num1 = inputCount - InputBlockSize; Array.Copy(inputBuffer, inputOffset + num1, depadBuffer_, 0, InputBlockSize); return(CapiHelper.DecryptDataCp(safeKeyHandle_, inputBuffer, inputOffset, num1, ref outputBuffer, outputOffset, _paddingValue, false)); } int num2 = CapiHelper.DecryptDataCp(safeKeyHandle_, depadBuffer_, 0, depadBuffer_.Length, ref outputBuffer, outputOffset, _paddingValue, false); outputOffset += OutputBlockSize; int num3 = inputCount - InputBlockSize; Array.Copy(inputBuffer, inputOffset + num3, depadBuffer_, 0, InputBlockSize); num2 = CapiHelper.DecryptDataCp(safeKeyHandle_, inputBuffer, inputOffset, num3, ref outputBuffer, outputOffset, _paddingValue, false); return(OutputBlockSize + num2); }