[Tutorial] Encriptaзгo de Textos (Entendimento e criaзгo de cуdigos).
#1

Olб б todos, hoje vou ensinar neste tutorial como entender e como criar seu prуprio cуdigo de encriptaзгo de textos .





1 - O que й encriptaзгo







Encriptaзгo (do grego, "cripto" = "oculto") й uma transformaзгo em textos que faz com que os mesmos nгo sejam interpretados sem uma maneira especнfica, deixando-os impossнveis de serem lidos .



Como exemplo da utilidade da encriptaзгo, podemos citar o prуprio arquivo AMX (Abstract Machine Executor, resultado da compilaзгo de cуdigo-fonte em Pawn), que й um cуdigo encriptado que sу pode ser interpretado pelo samp-server.exe.



Tambйm й уtimo para esconder o valor de dados salvos em arquivos de textos, como senhas, quantidade de dinheiro e pontos dos jogadores .







2 - O bбsico



Para poder entender este tutorial, vocк deverб ter conhecimento no mнnimo, sobre os assuntos abaixo:



- Variбveis
- Variбveis Arrays/Vetores
- Loops
- Operadores



Bem, como vocкs sabem (ou nгo ) cada caractere de uma string (texto) corresponde б um nъmero, esse nъmero vai depender do caractere equivalente б ele na tabela ASCII (tabela de sнmbolos), por exemplo :




pawn Code:
new Oo;
Oo = 'A'; //Agora essa variбvel tem " A " como valor de texto, mas tem 65 como valor, pois a letra A corresponde ao nъmero 65 na tabela ASCII.
printf("%s", Oo);//O que serб mostrado й o " A ", pois a variбvel Oo tem valor de texto " A ".
printf("%d", Oo);//O que serб mostrado й o nъmero 65, valor real da variбvel



Entгo, podemos que concluir que se a linha
pawn Code:
new Oo = 'A';
fosse
pawn Code:
new Oo = 65;
nгo faria diferenзa .






3 - Encriptando um texto qualquer




Vamos encriptar o seguinte texto:


pawn Code:
new Texto[5] = "SAMP";

O que sabemos sobre esse texto й:


pawn Code:
printf("%d", Texto[0]);//Vale 83, que equivale б S na tabela ASCII
printf("%d", Texto[1]);//Vale 65, que equivale б A na tabela ASCII
printf("%d", Texto[2]);//Vale 77, que equivale б M na tabela ASCII
printf("%d", Texto[3]);//Vale 80, que equivale б P na tabela ASCII
//Juntando tudo acima:

printf("%s",Texto); //Vai mostrar a palavra SAMP


Opa, mas se cada letra corresponde б um nъmero, entгo podemos fazer operaзхes como divisгo, multiplicaзгo, adiзгo, entre outras com essas variбveis.


Vamos fazer isso entгo, nas linhas abaixo, o valor de cada variбvel й aumentado em 1 :



pawn Code:
Texto[0] += 1;//Vale agora, 84, que equivale б T na tabela ASCII
Texto[1] += 1;//Vale agora, 66, que equivale б B na tabela ASCII
Texto[2] += 1;//Vale agora, 78, que equivale б N na tabela ASCII
Texto[3] += 1;//Vale agora, 81, que equivale б Q na tabela ASCII
//Juntando tudo acima:

printf("%s", Texto); //Vai mostrar a palavra TBNQ



Resultado:

Texto antes de ser encriptado: SAMP
Texto depois de ser encriptado: TBNQ




Simples nгo, mas OPA, e como fazer pra ele voltar a ser o que era ?


Basta fazer o processo inverso do que vocк usou para encriptar a senha, ou seja, jб que aumentamos o valor de cada variбvel em 1, vamos agora diminuir o valor delas de novo, em 1, assim fazendo com que elas voltem a ser como eram antes :



pawn Code:
Texto[0] -= 1;
Texto[1] -= 1;
Texto[2] -= 1;
Texto[3] -= 1;
printf("%s", Texto);//Mostrando agora, a palavra SAMP novamente, como se ela nunca tivesse sido encriptada, pois o 1 adicionado antes foi retirado com a diminuiзгo



Agora que jб sabemos como encriptar textos simples, vamos fazer um pouco mais avanзado :








4 - Funзхes, de encriptar uma senha e desencriptб-la:





Vamos agora imaginar que estamos encriptando a senha de um jogador recйm registrado em um servidor, e vamos imaginar isso sendo salvo e depois carregado usando Dini, tudo acontecendo no OnDialogResponse.



Sejam as funзхes de encriptar e desencriptar:



pawn Code:
stock Encriptar(texto[])//Cуdigo irб pegar a senha normal, encriptar, e retornar em forma de texto
{
    new SenhaEncriptada[100];
    for(new x = 0; x <= strlen(texto); x++)
    {
        SenhaEncriptada[x] = (texto[x] * 2);//Cada caractere da senha Encriptada vai ser igual ao da original multiplicado por 2
    }
    return SenhaEncriptada;
}


stock Desencriptar(texto[])//Cуdigo irб pegar a senha encriptada, desencriptar, e retornar em forma de texto :D
{
    new Senha[100];
    for(new x = 0; x <= strlen(texto); x++)
    {
        Senha[x] = (texto[x] / 2);//Cada caractere da senha normal vai ser o da encriptada divido pra 2 (pois divisгo й o processo inverso da multiplicaзгo).
    }
    return Senha;
}



Salvamos (isso na hora do registro) por exemplo, usando Dini (sistema de salvamento de dados):




pawn Code:
dini_Set("arquivo.txt", "Chave", Encriptar(inputtext));




Acima, o que serб salvo no arquivo й a palavra digitada no Dialog (equivalente б inputtext), mas encriptada (pela funзгo Encriptar) .






E agora, carregando (na hora do Login, por exemplo):




pawn Code:
if(!strcmp(inputtext,Desencriptar(dini_Get("arquivo.txt", "Chave")), true))


Acima, o texto digitado pelo jogador no Dialog estarб sendo comparado б o que estб no arquivo, ou seja, a senha encriptada, mas, desencriptada (pela funзгo Desencriptar) .



Nгo entendeu ? Leia mais uma vez .









5 - Final - XOR na encriptaзгo:






XOR ( ^ ) й um operador de bits raramente usado pois sua interpretaзгo й muito difнcil para quem nunca mexeu com bits ou binбrio .




Cуdigos como por exemplo:



pawn Code:
printf("%d", 100 ^ 200);//Vai mostrar 172
printf("%d", 300 ^ 400);//Vai mostrar 188


Olhando o cуdigo acima, alguns podem dizer : "PQP, nгo isso nгo tem sentido !", pois a funзгo do XOR nгo й algo que podemos tirar uma conclusгo de cara, como 1 + 3 = 4 .



E й exatamente por isso que estou citando o XOR aqui neste tutorial, pois o motivo que leva senhas de jogadores de vбrios servidores serem descobertas e б contas "hackeadas" й justamente por que o "hacker" descobre o modo de encriptaзгo de senhas comparando as mesmas (й o meu caso =X), ou pega o cуdigo de encriptaзгo das senhas daquele servidor e joga o processo inverso, como й o caso da multiplicaзгo e divisгo, como citei antes .




Nгo й necessбrio saber como funciona o XOR, apenas saibam que o processo inverso do XOR й o prуprio XOR .



Como assim ? Analise:



pawn Code:
public OnFilterScriptInit()
{
    new A = 100;
    new B = 200;
    printf("%d", A ^ B);//O Xor de A e B й 172
    printf("%d",172 ^ B);//O Xor de B e 172 (valor do Xor de A e B) й igual б 100 (valor de A)
    return 1;
}


Quem jб fez a Prova Real (Conteъdo da quarta sйrie) em divisхes, vai entender perfeitamente o que fiz no cуdigo acima .





E й isso, este й o FIM do Tutorial .



Espero ter ajudado .
Reply


Messages In This Thread

Forum Jump:


Users browsing this thread: 1 Guest(s)