private static byte[] CreateSignature(Gost3410AsymmetricAlgorithmBase privateKey, Stream dataStream) { byte[] hash; using (var hashAlg = new Gost3411HashAlgorithm()) { hash = hashAlg.ComputeHash(dataStream); } return privateKey.CreateSignature(hash); }
private static bool VerifySignature(Gost3410AsymmetricAlgorithmBase publicKey, Stream dataStream, byte[] signature) { byte[] hash; using (var hashAlg = new Gost3411HashAlgorithm()) { hash = hashAlg.ComputeHash(dataStream); } return publicKey.VerifySignature(hash, signature); }
/// <summary> /// Устанавливает открытый ключ для проверки цифрововй подписи. /// </summary> /// <param name="publicKey">Открытый ключ для проверки цифровой подписи.</param> /// <exception cref="ArgumentOutOfRangeException"></exception> /// <exception cref="ArgumentNullException"></exception> public override void SetKey(AsymmetricAlgorithm publicKey) { if (publicKey == null) { throw ExceptionUtility.ArgumentNull("publicKey"); } if (!(publicKey is Gost3410AsymmetricAlgorithmBase)) { throw ExceptionUtility.ArgumentOutOfRange("publicKey", Resources.ShouldSupportGost3410); } _publicKey = (Gost3410AsymmetricAlgorithmBase)publicKey; }
public static byte[] EncryptKey(Gost28147SymmetricAlgorithmBase sessionKey, Gost3410AsymmetricAlgorithmBase publicKey) { if (sessionKey == null) { throw ExceptionUtility.ArgumentNull("sessionKey"); } if (publicKey == null) { throw ExceptionUtility.ArgumentNull("publicKey"); } var formatter = new GostKeyExchangeFormatter(publicKey); return formatter.CreateKeyExchangeData(sessionKey); }
public static SymmetricAlgorithm DecryptKeyClass(byte[] keyData, Gost3410AsymmetricAlgorithmBase privateKey) { if (keyData == null) { throw ExceptionUtility.ArgumentNull("keyData"); } if (privateKey == null) { throw ExceptionUtility.ArgumentNull("privateKey"); } var deformatter = new GostKeyExchangeDeformatter(privateKey); var decryptionKey = deformatter.DecryptKeyExchangeAlgorithm(keyData); return decryptionKey; }
private static XmlDocument EncryptXmlDocument(XmlDocument xmlDocument, Gost3410AsymmetricAlgorithmBase publicKey) { // Создание объекта для шифрации XML var encryptedXml = new GostEncryptedXml(); // Поиск элементов для шифрации var elements = xmlDocument.SelectNodes("//SomeElement[@Encrypt='true']"); if (elements != null) { var elementIndex = 0; foreach (XmlElement element in elements) { // Создание случайного сессионного ключа using (var sessionKey = new Gost28147SymmetricAlgorithm()) { // Шифрация элемента var encryptedData = encryptedXml.EncryptData(element, sessionKey, false); // Шифрация сессионного ключа с использованием публичного асимметричного ключа var encryptedSessionKeyData = GostEncryptedXml.EncryptKey(sessionKey, publicKey); // Формирование элемента EncryptedData var elementEncryptedData = new EncryptedData(); elementEncryptedData.Id = "EncryptedElement" + elementIndex++; elementEncryptedData.Type = EncryptedXml.XmlEncElementUrl; elementEncryptedData.EncryptionMethod = new EncryptionMethod(GostEncryptedXml.XmlEncGost28147Url); elementEncryptedData.CipherData.CipherValue = encryptedData; elementEncryptedData.KeyInfo = new KeyInfo(); // Формирование информации о зашифрованном сессионном ключе var encryptedSessionKey = new EncryptedKey(); encryptedSessionKey.CipherData = new CipherData(encryptedSessionKeyData); encryptedSessionKey.EncryptionMethod = new EncryptionMethod(GostEncryptedXml.XmlEncGostKeyTransportUrl); encryptedSessionKey.AddReference(new DataReference { Uri = "#" + elementEncryptedData.Id }); encryptedSessionKey.KeyInfo.AddClause(new KeyInfoName { Value = "KeyName1" }); // Добавление ссылки на зашифрованный ключ, используемый при шифровании данных elementEncryptedData.KeyInfo.AddClause(new KeyInfoEncryptedKey(encryptedSessionKey)); // Замена элемента его зашифрованным представлением GostEncryptedXml.ReplaceElement(element, elementEncryptedData, false); } } } return xmlDocument; }
private static XmlDocument DecryptXmlDocument(XmlDocument encryptedXmlDocument, Gost3410AsymmetricAlgorithmBase privateKey) { // Создание объекта для дешифрации XML var encryptedXml = new GostEncryptedXml(encryptedXmlDocument); // Добавление ссылки на приватный асимметричный ключ encryptedXml.AddKeyNameMapping("KeyName1", privateKey); // Расшифровка зашифрованных элементов документа encryptedXml.DecryptDocument(); return encryptedXmlDocument; }
public GostKeyValue(Gost3410AsymmetricAlgorithmBase key) { Key = key; }
/// <summary> /// Шифрует сессионный ключ с помощью указанного асимметричного ключа ГОСТ Р 34.10. /// </summary> /// <param name="sessionKey">Шифруемый сессионный ключ.</param> /// <param name="publicKey">Открытый ключ ГОСТ Р 34.10 для шифрования сессионного ключа.</param> /// <returns>Массив байт, содержащий зашифрованный сессионный ключ.</returns> /// <remarks>Как правило сессионный ключ используется для шифрования данных и в свою очередь так же шифруется.</remarks> public static byte[] EncryptKey(Gost28147SymmetricAlgorithmBase sessionKey, Gost3410AsymmetricAlgorithmBase publicKey) { return GostEncryptedXmlImpl.EncryptKey(sessionKey, publicKey); }
/// <summary> /// Расшифровывает сессионный ключ с помощью указанного асимметричного ключа ГОСТ Р 34.10. /// </summary> /// <param name="keyData">Массив байт, содержащий зашифрованный сессионный ключ.</param> /// <param name="privateKey">Закрытый ключ ГОСТ Р 34.10 для расшифровки сессионного ключа.</param> /// <returns>Сессионный ключ.</returns> /// <remarks>Как правило сессионный ключ используется для шифрования данных и в свою очередь так же шифруется.</remarks> public static SymmetricAlgorithm DecryptKey(byte[] keyData, Gost3410AsymmetricAlgorithmBase privateKey) { return GostEncryptedXmlImpl.DecryptKeyClass(keyData, privateKey); }