public IActionResult ReceiveMessage(SendMessageModel messageModel) { string filePublicKey = parameters.Value.FilesOutput + parameters.Value.PubKeyFile + messageModel.userNameDestination + messageModel.userNameOrigin; RSAEncryption rsaEncryption = new RSAEncryption(); AESEncryption aesEncryption = new AESEncryption(); RSASigning rsaSigning = new RSASigning(); //Decrypt symmetric key ResponseRSADecryption rsaDecryptResponse = new ResponseRSADecryption(); rsaDecryptResponse = rsaEncryption.DecryptAESKey(messageModel.encryptedKey, messageModel.userNameDestination + messageModel.userNameOrigin); if (!rsaDecryptResponse.result) { FileWriter.WriteOnEvents(EventLevel.Error, "Error descifrando llave AES con RSA."); return(BadRequest(new { result = false })); } //Decrypt Message ResponseAESDecryption responseAESDecryption = new ResponseAESDecryption(); responseAESDecryption = aesEncryption.DecryptMessage(messageModel, rsaDecryptResponse.decryptedKey); if (!responseAESDecryption.result) { FileWriter.WriteOnEvents(EventLevel.Error, "Error descifrando mensaje con AES."); return(BadRequest(new { result = false })); } //Validate Sign if (!rsaSigning.validateSignAndHash(responseAESDecryption.decryptedMessage, messageModel.encryptSignature, filePublicKey)) { FileWriter.WriteOnEvents(EventLevel.Atention, "La información recibida es corrupta."); return(BadRequest(new { result = false })); } //Muestra mensaje return(Ok(new{ mensaje = responseAESDecryption.decryptedMessage })); }
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)); }