# Bases numéricas

## Definição

Base numérica é um conjunto de símbolos (ou algarismos) com o qual podemos representar uma certa quantidade ou número.

Normalmente encontramos bases numéricas a partir do 10, onde o conjunto de algarismos possui dez possibilidades: 0 ao 9.

Algumas das bases numéricas mais comuns são:

* **Binária (2)**
* **Hexadecimal (16)**
* **Octal (8)**

## Conversão de Bases

### 1. Divisão Sucessiva

Converte números de uma base maior para uma base menor.\
Exemplo: **2510 → x16**

```txt
25 ÷ 16 = 1,  resto 9  (9 em hexadecimal é 9)  
1 ÷ 16 = 0,  resto 1  (1 em hexadecimal é 1)  
```

Resultado: **1916**

### 2. Conversão de Base Fracionária

Para converter bases "diferentes", pode-se transformar para a base 10 antes.\
Exemplo: **3B516 → x7**

3B516 = 3×16² + 11×16¹ + 5×16⁰\
3B516 = 94910

Agora, convertendo da base 10 para base 7:

```txt
949 ÷ 7 = 135, resto 4  
135 ÷ 7 = 19, resto 2  
19 ÷ 7 = 2, resto 5  
2 ÷ 7 = 0, resto 2  
```

Resultado: **25247**

### 3. Conversão Direta

Quando as bases são potências umas das outras, pode-se agrupar os dígitos.\
Exemplo: **101000112 → x4**

```txt
Agrupar: 10 10 00 11  
Converter: 10₂ = 2₄, 10₂ = 2₄, 00₂ = 0₄, 11₂ = 3₄  
```

Resultado: **20234**

***

Existem algumas outras formas básicas de conversão de bases, porém as ferramentas facilitam bastante esse processo.\
Alguma delas são:

1. [**Calculadora Online - Conversão de Bases**](https://www.calculadoraonline.com.br/conversao-bases)\
   Possui uma ferramenta que pode converter um número em base _n_ para qualquer número em base _x_.
   * Ideal para transformar bases irregulares em bases padrão, como base 8 ou base 16.
   * Bases padrão possuem diversos _decoders_ online disponíveis para análise e interpretação.
2. [**Dcode - Base 32 Encoding**](https://www.dcode.fr/base-32-encoding)\
   Além de oferecer um decodificador para base 32, também fornece:
   * Conversão para base 64.
   * Conversão para base 8.
   * Capacidade de entregar os números diretamente no formato ASCII (formato de texto).
3. **Bibliotecas Python**

* Existem algumas bibliotecas em Python que facilitam as conversões e testes por meio de código, como:
  * **PyCryptodome**: Pode ser utilizado para:
    * Converter uma sequência numérica para string.
    * Decodificar sequências numéricas.

## Conversão de Texto para Sequências Numéricas

### ASCII

ASCII é um padrão de codificação de 7 bits para representar caracteres de texto.

Exemplo: Converter a palavra **"Pedro"** em ASCII:

```python
nome = "Pedro"
criptografado = [ord(letra) for letra in nome]
print(criptografado)  # [80, 101, 100, 114, 111]
```

Agora, converter de ASCII para texto:

```python
flag = [99, 114, 121, 112, 116, 111, 123, 65, 83, 67, 73, 73, 95, 112, 114, 49, 110, 116, 52, 98, 108, 51, 125]
palavranova = ''.join(chr(letra) for letra in flag)
print(palavranova)  # crypto{ASCII_pr1nt4bl3}
```

## Conversão para Hexadecimal

Quando um texto é convertido para hexadecimal, cada caractere se torna seu código ASCII em base 16.

Exemplo:

```python
hexadecimal = "63727970746f7b596f755f77696c6c5f62655f776f726b696e675f776974685f6865785f737472696e67735f615f6c6f747d"
bytes_flag = bytes.fromhex(hexadecimal)
flag = bytes_flag.decode('utf-8')
print(flag)  # crypto{You_will_be_working_with_hex_strings_a_lot}
```

## Conversão para Base64

Base64 é uma codificação que representa dados binários como texto ASCII.

Exemplo de conversão de hexadecimal para Base64:

```python
import base64

flag_base16 = "72bca9b68fc16ac7beeb8f849dca1d8a783e8acf9679bf9269f7bf"
binarios = bytes.fromhex(flag_base16)
flag_base64 = base64.b64encode(binarios).decode('utf-8')
print(flag_base64)
```

Agora, decodificando uma string Base64 para texto legível:

```python
flag = "Q1RGe0ZsYWdneVdhZ2d5UmFnZ3l9"
binarios = base64.b64decode(flag)
flag_ascii = binarios.decode('utf-8')
print(flag_ascii)  # CTF{FlaggyWaggyRaggy}
```

***

## Ferramentas Online

* [CryptoHack](https://cryptohack.org/challenges/general/)
* [Calculadora Online de Bases](https://www.calculadoraonline.com.br/conversao-bases)
* [Dcode - Conversão de Base 32](https://www.dcode.fr/base-32-encoding)
