Реализация алгоритма шифрования по ГОСТ 28147 через
Cryptographic Service Provider (CSP). Класс не может быть унаследован.
Пространство имен:
CryptoPro.SharpeiСборка: CryptoPro.Sharpei.Base (в CryptoPro.Sharpei.Base.dll)
Синтаксис
Visual Basic |
---|
<ComVisibleAttribute(True)> _ Public NotInheritable Class Gost28147CryptoServiceProvider _ Inherits Gost28147 |
C# |
---|
[ComVisibleAttribute(true)] public sealed class Gost28147CryptoServiceProvider : Gost28147 |
Visual C++ |
---|
[ComVisibleAttribute(true)] public ref class Gost28147CryptoServiceProvider sealed : public Gost28147 |
JavaScript |
---|
CryptoPro.Sharpei.Gost28147CryptoServiceProvider = function(); Type.createClass( 'CryptoPro.Sharpei.Gost28147CryptoServiceProvider', CryptoPro.Sharpei.Gost28147); |
Заметки
Алгоритм поддерживает ключи длиной 256 бит.
Реализация поддерживает интерфейс IDisposable. Объект данного класса должен быть уничтожен явно.
Примеры
Пример шифрования при помощи CPCryptoAPITransform.
Visual Basic | Copy Code |
---|---|
Imports System Imports System.Collections Imports System.Text Imports CryptoPro.Sharpei Namespace DocBlock Class CrApiTrans ' CSP для шифрования. Shared gost As Gost28147CryptoServiceProvider = New Gost28147CryptoServiceProvider() <STAThread()> _ Shared Sub Main(ByVal args As String()) Dim message As String = "012345678901234567890" Dim sourceBytes As Byte() = Encoding.ASCII.GetBytes(message) Console.WriteLine("** Строка до зашифрования: " + message) Dim encodedBytes As Byte() = EncodeBytes(sourceBytes) ' Заменяем непечатные символы ? Dim encoded As StringBuilder = New StringBuilder() For Each c As Char In Encoding.ASCII.GetString(encodedBytes) If c < " "c Then encoded.Append("?"c) Else encoded.Append(c) Next Console.WriteLine("** Строка после зашифрования: " & _ encoded.ToString()) Dim decodedBytes As Byte() = DecodeBytes(encodedBytes) Console.WriteLine("** Строка после расшифрования: " & _ Encoding.ASCII.GetString(decodedBytes)) End Sub ' Шифрование байтовой строки с использованием CPCryptoAPITranform. Private Shared Function EncodeBytes(ByVal sourceBytes As Byte()) As Byte() Dim currentPosition As Integer = 0 Dim targetBytes As Byte() = New Byte(1024) {} Dim sourceByteLength As Integer = sourceBytes.Length ' Создаем шифратор для ГОСТ 28147. Dim cryptoTransform As CPCryptoAPITransform = _ gost.CreateEncryptor() ' Размер входного блока. Dim inputBlockSize As Integer = cryptoTransform.InputBlockSize ' Размер выходного блока. Dim outputBlockSize As Integer = cryptoTransform.OutputBlockSize Try ' Если возможна обработка нескольких блоков: If cryptoTransform.CanTransformMultipleBlocks Then Dim numBytesRead As Integer = 0 Do While sourceByteLength - currentPosition >= inputBlockSize ' Преобразуем байты начиная с currentPosition в массиве ' sourceBytes, записывая результат в массив targetBytes. numBytesRead = cryptoTransform.TransformBlock( _ sourceBytes, _ currentPosition, _ inputBlockSize, _ targetBytes, _ currentPosition) currentPosition += numBytesRead Loop ' Преобразуем последний блок. Dim finalBytes As Byte() = cryptoTransform.TransformFinalBlock( _ sourceBytes, _ currentPosition, _ sourceByteLength - currentPosition) ' Записываем последний зашифрованный блок ' в массив targetBytes. finalBytes.CopyTo(targetBytes, currentPosition) currentPosition += finalBytes.Length End If Catch ex As Exception Console.WriteLine("Неожиданное исключение:" + ex.ToString()) End Try ' Определяем, может ли CPCryptoAPITransform использоваться повторно. If Not cryptoTransform.CanReuseTransform Then ' Освобождаем занятые ресурсы. cryptoTransform.Clear() End If ' Убираем неиспользуемые байты из массива. Array.Resize(Of Byte)(targetBytes, currentPosition) Return targetBytes End Function ' Расшифрование байтовой строки с использованием CPCryptoAPITranform. Shared Function DecodeBytes(ByVal sourceBytes As Byte()) As Byte() Dim targetBytes As Byte() = New Byte(1024) {} Dim currentPosition As Integer = 0 ' Создаем дешифратор для ГОСТ. Dim cryptoTransform As CPCryptoAPITransform = _ gost.CreateDecryptor() Dim inputBlockSize As Integer = cryptoTransform.InputBlockSize Dim sourceByteLength As Integer = sourceBytes.Length Try Dim numBytesRead As Integer = 0 Do While sourceByteLength - currentPosition >= inputBlockSize ' Преобразуем байты начиная с currentPosition в массиве ' sourceBytes, записывая результат в массив targetBytes. numBytesRead = cryptoTransform.TransformBlock( _ sourceBytes, _ currentPosition, _ inputBlockSize, _ targetBytes, _ currentPosition) currentPosition += numBytesRead Loop ' Преобразуем последний блок. Dim finalBytes As Byte() = cryptoTransform.TransformFinalBlock( _ sourceBytes, _ currentPosition, _ sourceByteLength - currentPosition) ' Записываем последний расшифрованный блок ' в массив targetBytes. finalBytes.CopyTo(targetBytes, currentPosition) currentPosition += finalBytes.Length Catch ex As Exception Console.WriteLine("Неожиданное исключение:" + ex.ToString()) End Try ' Убираем неиспользуемые байты из массива. Array.Resize(Of Byte)(targetBytes, currentPosition) Return targetBytes End Function End Class End Namespace |
C# | Copy Code |
---|---|
using System; using System.Collections; using System.Text; using CryptoPro.Sharpei; namespace Samples.DocBlock { class CrApiTrans { // CSP для шифрования. static Gost28147CryptoServiceProvider gost = new Gost28147CryptoServiceProvider(); [STAThread] static void Main(string[] args) { string message = "012345678901234567890"; byte[] sourceBytes = Encoding.ASCII.GetBytes(message); Console.WriteLine("** Строка до зашифрования: " + message); byte[] encodedBytes = EncodeBytes(sourceBytes); // Заменяем непечатные символы ? StringBuilder encoded = new StringBuilder(); foreach (char c in Encoding.ASCII.GetString(encodedBytes)) if (c < ' ') encoded.Append('?'); else encoded.Append(c); Console.WriteLine("** Строка после зашифрования: " + encoded.ToString()); byte[] decodedBytes = DecodeBytes(encodedBytes); Console.WriteLine("** Строка после расшифрования: " + Encoding.ASCII.GetString(decodedBytes)); } // Шифрование байтовой строки с использованием CPCryptoAPITranform. private static byte[] EncodeBytes(byte[] sourceBytes) { int currentPosition = 0; byte[] targetBytes = new byte[1024]; int sourceByteLength = sourceBytes.Length; // Создаем шифратор для ГОСТ 28147. CPCryptoAPITransform cryptoTransform = (CPCryptoAPITransform)gost.CreateEncryptor(); // Размер входного блока. int inputBlockSize = cryptoTransform.InputBlockSize; // Размер выходного блока. int outputBlockSize = cryptoTransform.OutputBlockSize; try { // Если возможна обработка нескольких блоков: if (cryptoTransform.CanTransformMultipleBlocks) { int numBytesRead = 0; while (sourceByteLength - currentPosition >= inputBlockSize) { // Преобразуем байты начиная с currentPosition в массиве // sourceBytes, записывая результат в массив targetBytes. numBytesRead = cryptoTransform.TransformBlock( sourceBytes, currentPosition, inputBlockSize, targetBytes, currentPosition); currentPosition += numBytesRead; } // Преобразуем последний блок. byte[] finalBytes = cryptoTransform.TransformFinalBlock( sourceBytes, currentPosition, sourceByteLength - currentPosition); // Записываем последний зашифрованный блок // в массив targetBytes. finalBytes.CopyTo(targetBytes, currentPosition); currentPosition += finalBytes.Length; } } catch (Exception ex) { Console.WriteLine("Неожиданное исключение:" + ex.ToString()); } // Определяем, может ли CPCryptoAPITransform использоваться повторно. if (!cryptoTransform.CanReuseTransform) { // Освобождаем занятые ресурсы. cryptoTransform.Clear(); } // Убираем неиспользуемые байты из массива. Array.Resize<byte>(ref targetBytes, currentPosition); return targetBytes; } // Расшифрование байтовой строки с использованием CPCryptoAPITranform. private static byte[] DecodeBytes(byte[] sourceBytes) { byte[] targetBytes = new byte[1024]; int currentPosition = 0; // Создаем дешифратор для ГОСТ. CPCryptoAPITransform cryptoTransform = (CPCryptoAPITransform)gost.CreateDecryptor(); int inputBlockSize = cryptoTransform.InputBlockSize; int sourceByteLength = sourceBytes.Length; try { int numBytesRead = 0; while (sourceByteLength - currentPosition >= inputBlockSize) { // Преобразуем байты начиная с currentPosition в массиве // sourceBytes, записывая результат в массив targetBytes. numBytesRead = cryptoTransform.TransformBlock( sourceBytes, currentPosition, inputBlockSize, targetBytes, currentPosition); currentPosition += numBytesRead; } // Преобразуем последний блок. byte[] finalBytes = cryptoTransform.TransformFinalBlock( sourceBytes, currentPosition, sourceByteLength - currentPosition); // Записываем последний расшифрованный блок // в массив targetBytes. finalBytes.CopyTo(targetBytes, currentPosition); currentPosition += finalBytes.Length; } catch (Exception ex) { Console.WriteLine("Неожиданное исключение:" + ex.ToString()); } // Убираем неиспользуемые байты из массива. Array.Resize<byte>(ref targetBytes, currentPosition); return targetBytes; } } } |
Иерархия наследования
System..::..Object
SymmetricAlgorithm
CryptoPro.Sharpei..::..Gost28147
CryptoPro.Sharpei..::..Gost28147CryptoServiceProvider
SymmetricAlgorithm
CryptoPro.Sharpei..::..Gost28147
CryptoPro.Sharpei..::..Gost28147CryptoServiceProvider
Потокобезопасность
Любые открытые члены этого типа, объявленные как static (Shared в Visual Basic), являются потокобезопасными. Потокобезопасность членов экземпляров не гарантирована.
Версии CSP:
КриптоПро CSP 2.0, КриптоПро CSP 3.0, КриптоПро CSP 3.6