Encriptaзгo de Textos (Entendimento e criaзгo de cуdigos). - rjjj - 17.04.2011
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
fosse
nгo faria diferenзa

.
3 - Encriptando um texto qualquer
Vamos encriptar o seguinte texto:
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

.
Re: Encriptaзгo de Textos (Entendimento e criaзгo de cуdigos). -
Ricop522 - 17.04.2011
Bom.
Re: Encriptaзгo de Textos (Entendimento e criaзгo de cуdigos). -
[Ips]Guh - 17.04.2011
Otimo Tuto Ken'ga'..Parabйййnss...
Re: Encriptaзгo de Textos (Entendimento e criaзгo de cуdigos). - rjjj - 17.04.2011
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

.
Re: Respuesta: Encriptaзгo de Textos (Entendimento e criaзгo de cуdigos). - rjjj - 17.04.2011
Quote:
Originally Posted by [FeK]DraKiNs
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:
O Xor deles vai ser:
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 !
Re: Encriptaзгo de Textos (Entendimento e criaзгo de cуdigos). -
ViniBorn - 17.04.2011
Quote:
Originally Posted by rjjj
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
[...]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
Re: Encriptaзгo de Textos (Entendimento e criaзгo de cуdigos). -
Diogo_Bras - 17.04.2011
Bom trabalho (:
Re: Encriptaзгo de Textos (Entendimento e criaзгo de cуdigos). -
Joker_OutLock - 16.11.2011
Bom tuto =)
Re: Encriptaзгo de Textos (Entendimento e criaзгo de cуdigos). -
[KoS]Izaac - 17.11.2011
Aff Coveiro /\/\... Olha a data do post amigo...
Re: Encriptaзгo de Textos (Entendimento e criaзгo de cуdigos). -
[NWD]Jim._.Carrey - 17.11.2011
lol nunca tinha visto esse tuto muito bom,
Re: Encriptaзгo de Textos (Entendimento e criaзгo de cуdigos). -
ViniBorn - 17.11.2011
Tutoriais nunca se perdem Izaac. ; )
Re: Encriptaзгo de Textos (Entendimento e criaзгo de cуdigos). -
Eddy. - 17.11.2011
Muito bom esse tutorial..
Eu atй queria comeзar a programar vendo umas tutoriais pela internet, mais й muito complicado :S
Re: Encriptaзгo de Textos (Entendimento e criaзгo de cуdigos). -
Lуs - 17.11.2011
Quote:
Originally Posted by Eddy.
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.
Re: Encriptaзгo de Textos (Entendimento e criaзгo de cуdigos). -
[KoS]Izaac - 17.11.2011
Quote:
Originally Posted by Eddy.
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: