/// <summary> /// Шифрует общий секретный ключ. /// </summary> /// <param name="keyExchangeAlgorithm">Алгоритм шифрации общего секретного ключа.</param> /// <exception cref="ArgumentNullException"></exception> public GostKeyExchange CreateKeyExchangeInfo(SymmetricAlgorithm keyExchangeAlgorithm) { if (keyExchangeAlgorithm == null) { throw ExceptionUtility.ArgumentNull("keyExchangeAlgorithm"); } var keyExchange = new GostKeyExchange(); var keyExchangeParameters = _publicKey.ExportParameters(false); using (var keyExchangeAsym = new Gost3410EphemeralAsymmetricAlgorithm(keyExchangeParameters)) { byte[] encodedKeyExchangeInfo; using (var keyExchangeAlg = keyExchangeAsym.CreateKeyExchange(keyExchangeParameters)) { encodedKeyExchangeInfo = keyExchangeAlg.EncodeKeyExchange(keyExchangeAlgorithm, GostKeyExchangeExportMethod.CryptoProKeyExport); } var keyExchangeInfo = new GostKeyExchangeInfo(); keyExchangeInfo.Decode(encodedKeyExchangeInfo); keyExchange.SessionEncryptedKey = keyExchangeInfo; keyExchange.TransportParameters = keyExchangeAsym.ExportParameters(false); } return(keyExchange); }
/// <summary> /// Дешифрует общий секретный ключ. /// </summary> /// <param name="encryptedKeyExchangeInfo">Зашифрованный общий секретный ключ.</param> /// <exception cref="ArgumentNullException"></exception> public SymmetricAlgorithm DecryptKeyExchangeAlgorithm(GostKeyExchange encryptedKeyExchangeInfo) { if (encryptedKeyExchangeInfo == null) { throw ExceptionUtility.ArgumentNull("encryptedKeyExchangeInfo"); } var keyExchangeAlg = _privateKey.CreateKeyExchange(encryptedKeyExchangeInfo.TransportParameters); var encodedKeyExchangeInfo = encryptedKeyExchangeInfo.SessionEncryptedKey.Encode(); return(keyExchangeAlg.DecodeKeyExchange(encodedKeyExchangeInfo, GostKeyExchangeExportMethod.CryptoProKeyExport)); }
/// <summary> /// Дешифрует общий секретный ключ. /// </summary> /// <param name="encryptedKeyExchangeData">Зашифрованный общий секретный ключ.</param> /// <exception cref="ArgumentNullException"></exception> public SymmetricAlgorithm DecryptKeyExchangeAlgorithm(byte[] encryptedKeyExchangeData) { if (encryptedKeyExchangeData == null) { throw ExceptionUtility.ArgumentNull("encryptedKeyExchangeData"); } var keyExchange = new GostKeyExchange(); keyExchange.Decode(encryptedKeyExchangeData); return(DecryptKeyExchangeAlgorithm(keyExchange)); }
/// <summary> /// Шифрует общий секретный ключ. /// </summary> /// <param name="keyExchangeAlgorithm">Алгоритм шифрации общего секретного ключа.</param> /// <exception cref="ArgumentNullException"></exception> public GostKeyExchange CreateKeyExchangeInfo(SymmetricAlgorithm keyExchangeAlgorithm) { if (keyExchangeAlgorithm == null) { throw ExceptionUtility.ArgumentNull("keyExchangeAlgorithm"); } var keyExchange = new GostKeyExchange(); var keyExchangeParameters = _publicKey.ExportParameters(false); var digestoid = keyExchangeParameters.DigestParamSet; Gost3410 keyExchangeAsym; if (digestoid == Constants.OID_GR3411_12_256) { keyExchangeAsym = new Gost3410_2012_256EphemeralAsymmetricAlgorithm(keyExchangeParameters); } else if (digestoid == Constants.OID_GR3411_12_512) { keyExchangeAsym = new Gost3410_2012_512EphemeralAsymmetricAlgorithm(keyExchangeParameters); } else { keyExchangeAsym = new Gost3410EphemeralAsymmetricAlgorithm(keyExchangeParameters); } byte[] encodedKeyExchangeInfo; using (var keyExchangeAlg = keyExchangeAsym.CreateKeyExchange(keyExchangeParameters)) { encodedKeyExchangeInfo = keyExchangeAlg.EncodeKeyExchange(keyExchangeAlgorithm, GostKeyExchangeExportMethod.CryptoProKeyExport); } var keyExchangeInfo = new GostKeyExchangeInfo(); keyExchangeInfo.Decode(encodedKeyExchangeInfo); keyExchange.SessionEncryptedKey = keyExchangeInfo; keyExchange.TransportParameters = keyExchangeAsym.ExportParameters(false); keyExchangeAsym.Dispose(); return(keyExchange); }