diff --git a/cifra_railOnSteroids.c b/cifra_railOnSteroids.c
index a282c10f959ef3b41cd4aad16738a058175c1851..141b150f28e75222d6fe39db84ea00ccb51f4639 100644
--- a/cifra_railOnSteroids.c
+++ b/cifra_railOnSteroids.c
@@ -49,7 +49,8 @@ int main(){
     for(int itr = 0; itr < num_chaves; itr++){
         printf("itr %d de %d \n", itr, num_chaves);
         int mod_text_pela_chave = (tamanho_texto) % chaves_parciais[itr];
-        int caracteres_p_completar = chaves_parciais[itr]-mod_text_pela_chave;
+        
+        int caracteres_p_completar = (mod_text_pela_chave > 0) ? chaves_parciais[itr]-mod_text_pela_chave : 0;
         printf("completando %d caracteres, texto tinha %d\n", caracteres_p_completar, tamanho_texto);
 
 
diff --git a/decifra_railOnSteroids.c b/decifra_railOnSteroids.c
new file mode 100644
index 0000000000000000000000000000000000000000..74e35a45a00d2b0f8889cadb4099cdcf6e9583e4
--- /dev/null
+++ b/decifra_railOnSteroids.c
@@ -0,0 +1,106 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+
+#define TAM_MAX_TEXTO 1000000
+
+int main(){
+    char texto_claro[TAM_MAX_TEXTO];
+    char texto_cifrado[TAM_MAX_TEXTO] ;
+    long int chave;
+
+    puts("digite o texto a ser cifrado");
+    fgets(texto_claro, sizeof texto_claro, stdin);  
+    puts("digite a chave (inteiros) para cifrar o texto");
+    scanf("%ld", &chave);
+
+
+    
+    int num_chaves = 0;
+    long int aux = chave;
+
+    while(aux != 0){
+        num_chaves++;
+        aux = aux/10;
+    }
+
+    int * chaves_parciais = malloc(sizeof(int)*num_chaves);
+
+    for(int i=0; i < num_chaves; i++){
+        chaves_parciais[i] = chave % 10;
+        chave = chave/10;
+    }
+
+   
+
+    int tamanho_texto = strlen(texto_claro)-1; 
+
+    for(int i=0; i<tamanho_texto; i++){
+        texto_claro[i] = toupper(texto_claro[i]);
+    }
+
+    for(int i=0; i<tamanho_texto; i++){
+        texto_cifrado[i] = texto_claro[i];
+    }
+
+
+    for(int itr = 0; itr < num_chaves; itr++){
+        printf("itr %d de %d \n", itr, num_chaves);
+        int mod_text_pela_chave = (tamanho_texto) % chaves_parciais[itr];
+        int caracteres_p_completar = (mod_text_pela_chave > 0) ? chaves_parciais[itr]-mod_text_pela_chave : 0;
+        printf("completando %d caracteres, texto tinha %d\n", caracteres_p_completar, tamanho_texto);
+    
+
+
+    
+        for(int i=0; i<caracteres_p_completar; i++){
+            texto_cifrado[tamanho_texto+i]='X';
+        }
+
+        tamanho_texto+=caracteres_p_completar;
+
+
+        int caracteresporlinha = (tamanho_texto+mod_text_pela_chave)/chaves_parciais[itr];
+        printf("caracteres por linha = %d\n", caracteresporlinha);
+
+        char matrizTransposicao[10][caracteresporlinha];
+
+        int caracter=0;
+            for(int i=0; i < chaves_parciais[itr]; i++){
+                for(int j=0; j<caracteresporlinha; j++){
+                    printf("linha %d coluna %d caracter %c\n", i,j,texto_cifrado[caracter]);
+                    matrizTransposicao[i][j] = texto_cifrado[caracter];
+                    caracter++;
+                }
+            }
+            
+            caracter = 0;
+            for(int j=0; j<caracteresporlinha; j++){
+                for(int i=0; i < chaves_parciais[itr]; i++){
+                    if(caracter < tamanho_texto){
+                        printf("%c\n", matrizTransposicao[i][j]);
+                        texto_cifrado[caracter] = matrizTransposicao[i][j];
+                    }
+                    caracter++;
+                }
+            }
+    
+    }
+    
+
+
+
+    puts("=== texto decifrado eh ===");
+    for(int i=0; i<tamanho_texto; i++){
+        printf("%c", texto_cifrado[i]);
+    }
+    puts("");
+
+    
+
+
+
+    return 0;
+}
\ No newline at end of file