[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
#2

Bom.
Reply
#3

Otimo Tuto Ken'ga'..Parabйййnss...
Reply
#4

Muito Obrigado a Todos !


@Drakon


Eu tambйm pensei no udb hash antes de fazer o Tutorial, pois muitos tem usado esse cуdigo, inclusive na бrea inglesa, nгo imaginei que ele tivesse uma falha .


Bem, agora cada um pode fazer seu prуprio cуdigo de encriptar senhas .




Quote:
Originally Posted by [FeK]DraKiNs
Erro no tutorial:
^ = Potenciaзгo
Pesquisei na internet de onde vocк tirou isso, e acho que estб confundindo com Visual Basic .




No Visual Basic funciona assim:


base ^ expoente


Retorna o resultado da base elevado ao expoente .




No caso do Pawn e C/C++, o sнmbolo й chamado XOR, e ele altera a sequкncia final do valor correspondente em binбrio:


pawn Code:
public OnFilterScriptInit()
{
    printf("%d", 4^2);//Vai imprimir 6, sendo que, como voce disse, teria que mostrar 16, pois 4І = 16
    return 1;
}

No Pawn, podemos usar:

pawn Code:
floatpower(valor,expoente);

Nгo existe operador de potenciaзгo nem de radiaciaзгo em C/C++, por isso, nгo acho que exista tambйm em Pawn .


Obrigado б todos mais uma vez .
Reply
#5

Quote:
Originally Posted by [FeK]DraKiNs
View Post
Nгo estou confundindo com visual basic nгo,realmente value ^ value irб retornar uma forma de potenciaзгo,Y_less a alguns dias disse isto para RyDeR (que usava floatpower)

Entгo procure melhor,abraзos
Ok entгo , jб que vocк tem certeza procurarei sobre esse caso da potenciaзгo do Y_Less, afinal, binбrios tambйm sгo integers, mas isso da potencia foge um pouco da definiзгo do XOR do C/C++, que diz que um bit serб 1 sу se apenas um dos bits (da composiзгo dos integers) de mesma posiзгo nos dois integers for 1 .



Ou seja, analisando a composiзгo de 2 integers:


Code:
00000011    
00000101
O Xor deles vai ser:

Code:
00000110
A galera que nгo entendeu, isso acima й a composiзгo em bits dos integers (nъmeros) como 1,2,3 etc.


Estudei isso б uns meses atrбs, pelo que entendi, digo que nгo tem lуgica o resultado dos dois valores terem uma relaзгo como adiзгo e potenciaзгo, por isso me encafifei mas mas vou procurar .


Obrigado por apontar o erro do tutorial Drakon, mas nгo podemos considerar isso um erro como mostrei acima, talvez o que seja sгo outros casos б parte (como o do Visual Basic e o da potenciaзгo do Y_Less, como vocк disse), qualquer coisa posto aqui o resultado da minha pesquisa.



E galera, qualquer dъvida, perguntem aqui no tуpico mesmo !


Obrigado mais uma vez Ricop, Drakon e Badio !
Reply
#6

Quote:
Originally Posted by rjjj
View Post
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 .
Pra quem nгo conseguiu entender a lуgica, vou tentar explicar.

1є - Transforme os dois nъmeros em questгo para binбrios.

2є - Como disse o rjjj :
Quote:
Originally Posted by rjjj
View Post
[...]um bit serб 1 sу se apenas um dos bits (da composiзгo dos integers) de mesma posiзгo nos dois integers for 1 .
Traduzindo, comparando os dois nъmeros(um emcima do outro pra facilitar), se o nъmero que estiver emcima for igual ao debaixo, o "resultado" vai ser 0, caso contrбrio vai ser 1.
Ex:

000
010
-----
010 = XOR

Note que apenas a comparaзгo dos nъmeros verdes deu 1.

pawn Code:
Exemplos :

printf("%d", 0^2); // Valor exibido = 2

 000 // 0 em binбrio
 010 // 2 em binбrio
----
 010 = 2  em decimal



printf("%d", 1^2); // Valor exibido = 3

 001 // 1 em binбrio
 010 // 2 em binбrio
----
 011 = 3 em decimal



printf("%d", 2^2); // Valor exibido = 0

 010 // 2 em binбrio
 010 // 2 em binбrio
----
 000 = 0 em decimal



printf("%d", 3^2); // Valor exibido = 1

 011 // 3 em binбrio
 010 // 2 em binбrio
----
 001 = 1 em decimal
Reply
#7

Bom trabalho (:
Reply
#8

Bom tuto =)
Reply
#9

Aff Coveiro /\/\... Olha a data do post amigo...
Reply
#10

lol nunca tinha visto esse tuto muito bom,
Reply
#11

Tutoriais nunca se perdem Izaac. ; )
Reply
#12

Muito bom esse tutorial..
Eu atй queria comeзar a programar vendo umas tutoriais pela internet, mais й muito complicado :S
Reply
#13

Quote:
Originally Posted by Eddy.
View Post
Muito bom esse tutorial..
Eu atй queria comeзar a programar vendo umas tutoriais pela internet, mais й muito complicado :S
Nгo й complicado, basta ter curiosidade, e vontade de aprender. Criatividade tambйm conta.
Reply
#14

Quote:
Originally Posted by Eddy.
View Post
Muito bom esse tutorial..
Eu atй queria comeзar a programar vendo umas tutoriais pela internet, mais й muito complicado :S
Eu achava isso. A primeira vez que abri um arquivo pawn eu olhei e perguntei:

Que Po#$@@ e essa Meol Deols?

Pra comeзar eu nem sabia q era o pwn q tinha q abrir eu achava q era o Amx D:
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)