internal ResponseEncryptAES EncryptMessage(string mensaje) { ResponseEncryptAES response = new ResponseEncryptAES { result = false }; byte[] encryptedMessage; //Inicia proceso para cifrado FileWriter.WriteOnEvents(EventLevel.Info, "Iniciando proceso de cifrado."); try { if (aes.Key == null || aes.IV == null || mensaje == "") { FileWriter.WriteOnEvents(EventLevel.Error, "Uno o mas de los argumentos para cifrado aes invalidos."); } ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV); using (MemoryStream msEncrypt = new MemoryStream()){ using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)){ using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)){ //write the message to the stream FileWriter.WriteOnEvents(EventLevel.Info, "Escribiendo mensaje en el bloque de flujo."); swEncrypt.Write(mensaje); } encryptedMessage = msEncrypt.ToArray(); response.encryptedData = encryptedMessage; response.result = true; response.privateKey = aes.Key; response.InitVector = aes.IV; } } } catch (System.Exception ex) { FileWriter.WriteOnEvents(EventLevel.Exception, "Excepcion en intento de cifrado. " + ex.Message); } return(response); }
public IActionResult EncryptMessage(InteractionModel interactModel) { //Generate url's file string filePublicKey = parameters.Value.FilesOutput + parameters.Value.PubKeyFile + interactModel.userNameDestination + interactModel.userNameOrigin; //Initialize models and classes SendMessageModel sendFirstMessage = new SendMessageModel(); RSAEncryption rsaEncrypt = new RSAEncryption(); RSASigning rsaSigning = new RSASigning(interactModel.userNameDestination + interactModel.userNameOrigin); AESEncryption aesEncryption = new AESEncryption(parameters.Value.KeyAESSize); ResponseSignData responseSign = new ResponseSignData(); ResponseSignData responseSignId = new ResponseSignData(); ResponseEncryptAES responseAES = new ResponseEncryptAES(); ResponseEncryptAESKey responseAESKey = new ResponseEncryptAESKey(); // Looking for partner RSA public key if (rsaEncrypt.KeysPartnerExists(interactModel.userNameDestination + interactModel.userNameOrigin, filePublicKey)) { FileWriter.WriteOnEvents(EventLevel.Info, "Llaves RSA para cifrado encontradas."); FileWriter.WriteOnEvents(EventLevel.Info, "Iniciando firmado de mensaje."); //Sign data with RSA Private Key responseSign = rsaSigning.signData(interactModel.mensaje); if (responseSign.result) { //Encrypt Message if (aesEncryption.generateProperties()) { responseAES = aesEncryption.EncryptMessage(interactModel.mensaje); if (!responseAES.result) { FileWriter.WriteOnEvents(EventLevel.Error, "Error en el proceso de cifrado de mensaje, verifique los eventos previos."); return(BadRequest(sendFirstMessage)); } } } else { FileWriter.WriteOnEvents(EventLevel.Error, "Falla en intento de firma de mensaje, verificar logs anteriores."); return(BadRequest(sendFirstMessage)); } } else { FileWriter.WriteOnEvents(EventLevel.Error, "Imposible cifrar mensaje, llaves RSA para origen:" + interactModel.userNameOrigin + "\tdestino:" + interactModel.userNameDestination + " no encontradas"); return(BadRequest(sendFirstMessage)); } //Encrypt AES Key if (responseAES.privateKey != null) { FileWriter.WriteOnEvents(EventLevel.Info, "Iniciando proceso de cifrado llaves AES con RSA"); responseAESKey = rsaEncrypt.EncryptAESKey(responseAES.privateKey, filePublicKey); } else { FileWriter.WriteOnEvents(EventLevel.Error, "Error en cifrado llave AES con RSA, no existe la llave de AES."); return(BadRequest(sendFirstMessage)); } //Generate de sign for server identification //responseSignId = rsaSigning.signData(interactModel.userNameOrigin+interactModel.userNameDestination); //if(!responseSignId.result){ // FileWriter.WriteOnEvents(EventLevel.Error,"Falla en intento de firma de identificacion contra servidor, verificar logs anteriores."); // return BadRequest(sendFirstMessage); // } //Call the server service and send the data model //ServerRequest server = new ServerRequest(parameters.Value.EndpointServer,parameters.Value.SendFirstMessage,parameters.Value.GetRequest); sendFirstMessage.encryptedMessage = responseAES.encryptedData; sendFirstMessage.encryptSignature = responseSign.signData; sendFirstMessage.encryptedKey = responseAESKey.encryptedKey; sendFirstMessage.idSignature = responseSignId.signData; sendFirstMessage.initVector = responseAES.InitVector; sendFirstMessage.userNameOrigin = interactModel.userNameOrigin; sendFirstMessage.userNameDestination = interactModel.userNameDestination; FileWriter.WriteOnEvents(EventLevel.Info, "Solicitud de envio de llave exitoso."); return(Ok(sendFirstMessage)); }