Oprócz tego że program napisany z naruszeniem zasad programowania C++ (stosujesz VLA które są rozszerzeniem C99 i nie są częścią standardu C++), to szyfrowanie jest nieprawidłowe. Powodem nie jest to że stosujesz liczbę losową. Zapisujesz ją na wyjściu na końcu ciągu znaków i to jest ok bo umożliwia potencjalne odszyfrowanie ciągu. Problem leży w tym że odejmujesz liczbę z zakresu [1, 50] (linia 16).
Zakładając że kod ASCII znaku który wprowadzisz to min. 32 (spacja), oraz że kod to rzeczywiście jedynie ASCII (niedozwolone są litery narodowe w kodowaniach nie 8-bitowych), może dojść do wyliczenia liczby ujemnej (linia 21). Samo to nie jest problemem. Problemem jest reprezentacja bitowa tej liczby int. Może być ona różna na różnych komputerach (standard zakłada że to jest co najmniej 16 bit a może być więcej). Na wyjściu możesz mieć mniej lub więcej wartości "binarnych" 0/1 (u Ciebie i tak to znaki na konsoli). Tak więc Twój szyfrator/deszyfrator będzie działał wyłącznie na tej klasy komputerze i z tym kompilatorem którego będziesz używał do operacji w drugą stronę.
Następny błąd to przetwarzanie na wartości "binarne". Pętla od linii 23. Robisz to nieprawidłowo i w wyniku nie powstają napisy binarne ze stałą ilością znaków znaczących (zależnych od ilości bitów). To powoduje że wyliczenie gdzie jest ostatnia losowa liczba i gdzie kończy/zaczyna się odszyfrowywany znak staje się niemożliwe.
Chcesz żeby działał szyfrator? Najmniejsza poprawka to poprawienie tak aby był zgodny z C++ (radzę zastosować vector i zrezygnować z tablic), usunięcie zmiennych globalnych i wymuszenie typu na ograniczony bitowo (np int8_t z <cstdint>) oraz poprawienie konwersji do "napisu binarnego".
No i pamiętaj o założeniach które poczyniłem. Jeśli będziesz wprowadzał znaki narodowe, to psu na budę to co tu napisałem.