17.04.2011, 00:24
(
Last edited by rjjj; 20/09/2012 at 02:55 PM.
)
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 :
Entгo, podemos que concluir que se a linha
fosse
nгo faria diferenзa .
3 - Encriptando um texto qualquer
Vamos encriptar o seguinte texto:
O que sabemos sobre esse texto й:
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 :
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 :
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:
Salvamos (isso na hora do registro) por exemplo, usando Dini (sistema de salvamento de dados):
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):
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:
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:
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 .
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';
pawn Code:
new Oo = 65;
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 .