[Tutorial] Criptografia (dicas)
#1

Introduзгo rбpida: eu decidi fazer um tutorial sobre criptografia,
sim, eu pretendo explicar como funciona e fazer aplicaзхes em cуdigo,
mas no mais eu vim para dar DICAS que podem ser ъtil ao 'pessoal' de cada um,
quando se trata de seus servidores/arquivos.
Нndice:

- O que й ?
- Como funciona ?
- Exemplos & aplicaзхes
- Dicas

--------------------------------------------------------
O que й ?

Muito bem, eu costumo usar o significado cientнfico ou idealizado pelos primeiros habituados da funзгo, pois se eu for falar de outra forma seria algo pessoal e do meu ponto de vista.

Criptografia: й o estudo dos princнpios e tйcnicas pelas quais a informaзгo pode ser transformada da sua forma original para outra ilegнvel, de forma que possa ser conhecida apenas por seu destinatбrio (detentor da "chave secreta"), o que a torna difнcil de ser lida por alguйm nгo autorizado.

No cotidiano dos 'scripters' tem sido utilizado para dificultar a legibilidade das senhas que sгo impostas
pelos jogadores quando se cadastram nos servidores.
No meu cotidiano eu uso para dificultar a legibilidade de qualquer coisa que seja informaзгo/dado relacionado ao meu projeto, quanto nгo estгo alocados em um banco de dados.
Como funciona ?

Existem alguns scripts prй-definidos e criados por desenvolvedores veteranos que sгo em muitos casos,
utilizados por boa parte do fуrum que nгo tem um conhecimento apurado sobre isso.

Os mesmos consistem em multiplicar/somar, dividir/subtrair dos caracteres, assim fazendo uso da codificaзгo da tabela ASCII.

Vejamos um exemplo com multiplicaзгo/divisгo:
Код:
new string[] = "Willian";

//string agora й um vetor que contйm 7 posiзхes(0-6)
//Vamos fazer um split manual nela e ver como isso funciona.

string[0] = 'W';
string[1] = 'i';
string[2] = 'l';
string[3] = 'l';
string[4] = 'i';
string[5] = 'a';
string[6] = 'n';
Vejamos os valores na tabela ascii e seus respectivos sнmbolos:

Alfabeto maiusculo(ASCII codes)
Код:
65= A 	66= B 	67= C 	68= D
69= E 	70= F 	71= G 	72= H
73= I 	74= J 	75= K 	76= L
77= M 	78= N 	79= O 	80= P
81= Q 	82= R 	83= S 	84= T
85= U 	86= V 	87= W 	88= X
89= Y 	90= Z
Alfabeto minusculo(ASCII codes)
Код:
97= a 	98= b 	99= c 	100= d
101= e 	102= f 	103= g 	104= h
105= i 	106= j 	107= k 	108= l
109= m 	110= n 	111= o 	112= p
113= q 	114= r 	115= s 	116= t
117= u 	118= v 	119= w 	120= x
121= y	122= z
Agora vamos supor que multiplicamos cada valor da 'string' por 2:
Код:
string[0] = 'W' * 2;
string[1] = 'i' * 2;
string[2] = 'l' * 2;
string[3] = 'l' * 2;
string[4] = 'i' * 2;
string[5] = 'a' * 2;
string[6] = 'n' * 2;

resultado:

string[0] = '«';
string[1] = 'К';
string[2] = 'П';
string[3] = 'П';
string[4] = 'К';
string[5] = '┬';
string[6] = '▄';

//Resultado nгo й 100%, usei valores "fictнcios" para demonstraзгo.
Olhando pelo resultado ficou meio difнcil de ler, mas essa й a intenзгo, apenas o dono/scripter
deve obter acesso a informaзгo.
Agora a questгo й, como retornar essa string ao valor normal ?

Atualmente ela estб assim: "«КППК┬▄"

Pela lуgica, se multiplicamos todos os indexes do vetor por 2, entгo devemos dividir ambos por 2 agora,
para obtermos o resultado antigo: "Willian"
Exemplos & aplicaзхes:

Agora estarei citando um pouco mais na prбtica, existem atualmente exemplos funcionais e bons
para criptografar nossas informaзхes.

Ex1:
pawn Код:
new gCript[128];
stock cript(str[])
{
    for (new i = 0; i < strlen(str); ++i) //iremos rodar um loop, para facilitar nosso trabalho.
    {
        str[i] *= 2; //aqui iremos por em prбtica no exemplo anterior, iremos multiplicar os valores por 2
    }
    strcat(gCript, str);
}
stock uncript()
{
    for (new i = 0; i < strlen(gCript); ++i) gCript[i] /= 2;
    return gCript;
}

public OnGameModeInit()
{
    new teste[] = "Willian";
    cript(teste);
    printf(teste);
    teste[0] = '\0';
    strcat(teste, uncript());
    printf(teste);
    return 1;
}
Ex2:
pawn Код:
stock cript_2(s[])
{
    new i, j;
    for (i = 0, j = 2; i < strlen ( s ); ++i, ++j)
    {
        if (j == 4) j = 2 ; //Vamos fazer com que a multiplicaзгo fique variando entre 2, 3
        s [ i ] *= j ;
    }
}
stock uncript_2(s[])
{
    new i, j;
    for (i = 0, j = 2; i < strlen ( s ); ++i, ++j)
    {
        if (j == 4) j = 2;
        s [ i ] /= j;
    }
}


public OnGameModeInit()
{
    new teste[] = "Willian";
    cript_2(teste);
    printf(teste);
    uncript_2(teste);
    printf(teste);
    return 1;
}
Este ultimo exemplo complica um pouco mais, pois vocк estarб multiplicando os valores uma vez por 2, uma por 3, e etc..(2, 3)

Bom estas sгo as prбticas mais comuns que se vк, sгo boas ? sim, como exemplos...
Dicas:

Como eu citei a cima, as aplicaзхes sгo boas como exemplos, como exemplos...
Veja bem, como diz o prуprio conceito de criptografia: "de forma que possa ser conhecida apenas por seu destinatбrio", entгo a dica mais valiosa que posso passar para vocкs й, a nгo ser que o cуdigo seja muito dinвmico, recomendo que vocк estude por estes exemplos, mas que utilize uma metodologia de criptografia pessoal(feita por vocк), pois assim piora as coisas pro lado de quem quer acessar, com certeza.
Conclusгo:

O conceito й simples, opiniгo pessoal: й vocк saber uma forma sua de trocar os caracteres, que tambйm contenha um 'reverse' para vocк ter acesso a informaзгo limpa.

Espero que seja ъtil a informaзгo, se tiverem dъvidas deixem ai que discutimos nos comentбrios.

--------------------------------------------------------
Crйditos: Willian Luigi (© code.me - 2013.1)
Reply
#2

essa parte me interessa:

pawn Код:
new string[] = "Willian";
 
string[0] = 'W';
string[1] = 'i';
string[2] = 'l';
string[3] = 'l';
string[4] = 'i';
string[5] = 'a';
string[6] = 'n';

Eu estou trabalhando com otimizaзгo e velocidade.
como sйria a maneira mas rapida e optimizada de fazer isto.


asim:

pawn Код:
new string[7];

string[0] = 'W';
string[1] = 'i';
string[2] = 'l';
string[3] = 'l';
string[4] = 'i';
string[5] = 'a';
string[6] = 'n';
Ou asim:

pawn Код:
new string[];

string[0] = 'W';
string[1] = 'i';
string[2] = 'l';
string[3] = 'l';
string[4] = 'i';
string[5] = 'a';
string[6] = 'n';
em minha opiniгo acho que da primeira forma sйria mas rбpido porque estas definindo um valor.
desde seu ponto de vista como vк-lo-ia ?

Bom trabalho amigo.
Reply
#3

Quote:
Originally Posted by Parka
Посмотреть сообщение
essa parte me interessa:

pawn Код:
new string[] = "Willian";
 
string[0] = 'W';
string[1] = 'i';
string[2] = 'l';
string[3] = 'l';
string[4] = 'i';
string[5] = 'a';
string[6] = 'n';

Eu estou trabalhando com otimizaзгo e velocidade.
como sйria a maneira mas rapida e optimizada de fazer isto.


asim:

pawn Код:
new string[7];

string[0] = 'W';
string[1] = 'i';
string[2] = 'l';
string[3] = 'l';
string[4] = 'i';
string[5] = 'a';
string[6] = 'n';
Ou asim:

pawn Код:
new string[];

string[0] = 'W';
string[1] = 'i';
string[2] = 'l';
string[3] = 'l';
string[4] = 'i';
string[5] = 'a';
string[6] = 'n';
em minha opiniгo acho que da primeira forma sйria mas rбpido porque estas definindo um valor.
desde seu ponto de vista como vк-lo-ia ?

Bom trabalho amigo.
A segunda forma nгo funciona se nгo me engano, tu tб atribuindo valores a uma variбvel que nгo teve inicializaзгo e nem se quer tem um marco de posiзхes...

pawn Код:
new teste[] = "Willian";
new teste[7] = "Willian";
Nгo vejo tanta diferenзa, eu vejo mais diferenзa na forma como irei manipular esses valores.
Reply
#4

Quote:
Originally Posted by Willian_Luigi
Посмотреть сообщение
Nгo vejo tanta diferenзa, eu vejo mais diferenзa na forma como irei manipular esses valores.
entendo, Obrigado Amigo.

Eu teste:

[05:46:22] Um milhгo de iteraзхes: 68 ms ||[ Data: Var0[] ]
[05:46:22] Um milhгo de iteraзхes: 39 ms ||[ Data: Var1[5] ]
Reply
#5

Isso estб longe de ser eficiente. Qualquer pessoa com um cйrebro conseguiria "descriptografar" isso em menos de 5 minutos.
Reply
#6

Quote:
Originally Posted by steki.
Посмотреть сообщение
Isso estб longe de ser eficiente. Qualquer pessoa com um cйrebro conseguiria "descriptografar" isso em menos de 5 minutos.
Quote:
Originally Posted by Willian_Luigi
Посмотреть сообщение
eu pretendo explicar como funciona e fazer aplicaзхes em cуdigo,
mas no mais eu vim para dar DICAS
Quote:
Originally Posted by Willian_Luigi
Посмотреть сообщение
Como eu citei a cima, as aplicaзхes sгo boas como exemplos, como exemplos...
Veja bem, como diz o prуprio conceito de criptografia: "de forma que possa ser conhecida apenas por seu destinatбrio", entгo a dica mais valiosa que posso passar para vocкs й, a nгo ser que o cуdigo seja muito dinвmico, recomendo que vocк estude por estes exemplos, mas que utilize uma metodologia de criptografia pessoal(feita por vocк), pois assim piora as coisas pro lado de quem quer acessar, com certeza.
Desculpa Steki se nгo lhe agradou, vocк talvez jб entenda o bastante e tambйm deve ter um cйrebro para fazer o seu prуprio, mas eu nгo quis mostrar eficiкncia, sу quis mostrar o conceito, como funciona, deixar a ideia para ambos de que a criptografia pode ser mais vantajosa se vocк fizer por vocк mesmo, ao invйs de utilizar cуdigos alheios.

E como eu falei os exemplos citados, sгo os mais vistos em GM's e em tutoriais aqui do fуrum/tуpicos de ajuda, em momento algum quis mostrar algo avanзado, pelo contrбrio й base mesmo.
Reply
#7

O tutorial em si apresentando os conceitos de criptografia atй estб com um conteъdo legal, todavia, achei um grande erro seu estimular as pessoas criarem suas prуprias criptografias...

Criar uma criptografia realmente segura nгo й tarefa para pessoas sem conhecimento nas mesmas, entгo й totalmente errфneo estimular pessoas a criarem as suas.

Existem bibliotecas de criptografia excelentes, para SA-MP, como Encryptm, que encrypta em Sha2(256 e 512) que sгo codificaзхes realmente poderosas e garante um nнvel de seguranзa muito maior do que uma criptografia criada por um leigo.

De restante, achei muito legal essa introduзгo sobre criptografia. Parabйns
Reply
#8

Quote:
Originally Posted by godkrad
Посмотреть сообщение
O tutorial em si apresentando os conceitos de criptografia atй estб com um conteъdo legal, todavia, achei um grande erro seu estimular as pessoas criarem suas prуprias criptografias...

Criar uma criptografia realmente segura nгo й tarefa para pessoas sem conhecimento nas mesmas, entгo й totalmente errфneo estimular pessoas a criarem as suas.

Existem bibliotecas de criptografia excelentes, para SA-MP, como Encryptm, que encrypta em Sha2(256 e 512) que sгo codificaзхes realmente poderosas e garante um nнvel de seguranзa muito maior do que uma criptografia criada por um leigo.
^Isso. Pode fechar o tуpico.
Reply
#9

уtimo.
Reply
#10

Quote:
Originally Posted by godkrad
Посмотреть сообщение
O tutorial em si apresentando os conceitos de criptografia atй estб com um conteъdo legal, todavia, achei um grande erro seu estimular as pessoas criarem suas prуprias criptografias...

Criar uma criptografia realmente segura nгo й tarefa para pessoas sem conhecimento nas mesmas, entгo й totalmente errфneo estimular pessoas a criarem as suas.

Existem bibliotecas de criptografia excelentes, para SA-MP, como Encryptm, que encrypta em Sha2(256 e 512) que sгo codificaзхes realmente poderosas e garante um nнvel de seguranзa muito maior do que uma criptografia criada por um leigo.

De restante, achei muito legal essa introduзгo sobre criptografia. Parabйns
Obrigado, dб pra entender seu ponto de vista, mas й como eu citei, a maioria(Vamos generalizar) ainda utiliza criptografias que encontraram em algum tutorial qualquer, espero que aqui ao menos fique e ideia de que isso nгo й bom, e tambйm os mostrando o funcionamento.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)