DELIMITER $$
CREATE OR REPLACE DEFINER=`vn-admin`@`localhost` PROCEDURE `vn`.`crypt`(vText VARCHAR(255), vKey VARCHAR(255), OUT vResult VARCHAR(255) )
BEGIN

	DECLARE vEncryptedText VARCHAR(255) DEFAULT '';
    
	DECLARE vKeyLength INT;
    DECLARE vKeyPosition INT DEFAULT 1;
    DECLARE vKeyChar VARCHAR(1);
    
    DECLARE vTextLength INT;
    DECLARE vTextPosition INT DEFAULT 1;
    DECLARE vTextChar VARCHAR(1);
    
    DECLARE vEncryptedChar VARCHAR(1);
    DECLARE vEncryptedCharPosition INT;
    
    DECLARE vChain VARCHAR(255) DEFAULT '#$.-_0123456789abcdefghijklmnopqrstuvwxyz';
    DECLARE vChainTextPosition INT;
    DECLARE vChainKeyPosition INT;
    DECLARE vChainLength INT;
    
    DECLARE vInvalidadChars VARCHAR(255) DEFAULT '';
    
    SET vTextLength = LENGTH(vText);	
    SET vKeyLength = LENGTH(vKey);
    SET vChainLength = LENGTH(vChain);
	
	WHILE vTextPosition <= vTextLength DO
    
		SET vTextChar = MID(vText,vTextPosition,1);
        SET vKeyChar =  MID(vKey,vKeyPosition,1);
        
        SET vChainTextPosition = LOCATE(vTextChar, vChain);
        SET vInvalidadChars = IF(vChainTextPosition, vInvalidadChars, CONCAT(vInvalidadChars,vTextChar));
        SET vChainKeyPosition = LOCATE(vKeyChar, vChain);
        SET vEncryptedCharPosition = vChainTextPosition + vChainKeyPosition;
        
        IF vEncryptedCharPosition > vChainLength THEN
        
			SET vEncryptedCharPosition = vEncryptedCharPosition - vChainLength;
            
		END IF;
        
        SET vEncryptedChar = MID(vChain, vEncryptedCharPosition,1);
        
        SET vEncryptedText = CONCAT(vEncryptedText, vEncryptedChar);
        
		SET vKeyPosition = IF(vKeyPosition = vKeyLength, 1,vKeyPosition + 1);
		SET vTextPosition = vTextPosition + 1;
    
    END WHILE;

	SET vResult = IF(LENGTH(vInvalidadChars), CONCAT('Caracteres no válidos: ',vInvalidadChars),vEncryptedText);

END$$
DELIMITER ;
