Simple game to learn common port numbers for Sec+ exam
Naming things is hard

Two of your variables have terrible names. To see what I mean, try to guess what the following variables contain, by only looking at their name, but not at your code:


numbers
random_gen


All the other variables are named really good. They name exactly their purpose or accurately describe their content, like incorrect or answer.

Source code layout

In the first section you list the quiz questions. Each of these questions should be on its own line of the code, to clearly show to the reader how the code is structured. That way, all quiz questions are listed nicely below each other, and it's easily possible to count the questions by checking their line numbers in the editor.

It's also easy to see that the 443 question is missing the protocol (TCP), which is difficult to see in the current layout.

The 443 question uses a single string as answer, while the 22 question uses a tuple of the application protocols. Which one is correct, or are they both? I doubt so.

What is the difference between AND and and in the questions? If there is none, choose one spelling and stick to it.

Redundancy

Instead of repeating the question names in random_gen, you can just use the expression numbers.keys().

Instead of writing the number 20 everywhere, better describe what you really mean by that number, which is len(questions). (By now you should have renamed the numbers variable to the more appropriate questions).

Typos


Imap is spelled IMAP
VPN443 is spelled VPN
incorrectis is spelled incorrect is


Bug

The program does not guarantee that you get each question once. Instead of using random_choice for each of the questions you should rather shuffle the questions and then just iterate over them.

Code improvements


Instead of (1==1), better write True.
Instead of var == first or var == second, better write var in (first, second).
There is no need to enclose each condition of an if or while in parentheses. That's only necessary in C and related languages. In Python and Go, it is considered bad style.


The function Sec_port_game should simply be named quiz since that is more specific than game, and at the same time makes the code independent from the Sec+ exam.

The function quiz should take the questions as a parameter, so that you can call it like this:

quiz(secplus_questions)
quiz(popular_rock_bands_questions)


It could be implemented like this:

import random
from typing import Dict


def quiz(questions: Dict[str, str]):

    shuffled_keys = random.shuffle(list(questions.keys()))
    for key in shuffled_keys:
        question = questions[key]

        # TODO: ask the question, compare the answer