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.
Base64 é um método para codificação de dados para transferência na Internet. É utilizado frequentemente para transmitir dados binários por meios de transmissão que lidam apenas com texto, como por exemplo para enviar arquivos anexos por email.
É constituído por 64 caracteres ([A-Za-z0-9], “/” e “+”) que deram origem ao seu nome. O carácter “=” é utilizado como um sufixo especial e a especificação original (RFC 989) definiu que o símbolo “*” pode ser utilizado para delimitar dados convertidos, mas não criptografados, dentro de um stream.
Exemplo de codificação:
- Texto original: hello world
- Texto convertido para Base64: aGVsbG8gd29ybGQK
O objetivo deste artigo é desenvolver um aplicativo simples que poderá ser utilizado para criptografar seus arquivos ou códigos fontes em PHP.
Veja na Figura 1 como será o desenvolvimento do nosso programa.
- Usuário faz upload do arquivo em PHP;
- O sistema faz a criptografia do código usando sistema de Base 64 nativo do PHP;
- É gerado dois arquivos: o Original e o Cifrado.
Processo de funcionamento na Prática
Conforme podemos ver na Figura 2, o programa gera dois arquivos o original e o cifrado. Na Listagem 1 temos a classe index.php e na Listagem 2 temos a classe geradora. Ambas as listagens estão comentadas para que você possa entender o código.
A criação do aplicativo será dividida em duas partes: a primeira será o desenvolvimento da página denominada index.php, que será a interface do usuário final podendo ele carregar seu arquivos PHP e fazer a criptografia das páginas em tempo real; a segunda parte é denominada funcao.php e ela não possui interface com o usuário final, pois é uma classe desenvolvida para pegar o arquivo PHP enviado pelo usuário e fazer o processo de criptografia e mudança de nome do arquivo.
Crie os Arquivos:
– index.php
– funcao.php
Pasta: – cifrado
Arquivo 1 – index.php
<html>
<body>
<form action="index.php" method="post" enctype="multipart/form-data">
<input type="file" name="Arquivo" id="Arquivo"><br>
<input type="submit" value="Enviar">
<input type="reset" value="Apagar">
</form>
<?php
if (isset($_FILES["Arquivo"])){
if (!empty($_FILES["Arquivo"])) {
//Upload do arquivo.
$nome_temporario=$_FILES["Arquivo"]["tmp_name"];
$nome_real=$_FILES["Arquivo"]["name"];
copy($nome_temporario,"cifrado/$nome_real");
// Chamar o arquivo com as Funções.
include_once("funcao.php");
// Arquivo que irá ser Cifrado.
$arquivo = "cifrado/$nome_real";
// Cria a Class Codificar.
$codificador = new Codificar();
// Executa a função de Cifragem
$arquivo_c = $codificador->codificador($arquivo);
// Se gerar erro apresente o erro.
if($codificador->erro()){
$erros=$codificador->pegar_erro();
echo "<pre>";
print_r($erro);
}
// Se não apresente o resultado.
else {
print("<p>O arquivo <u>$nome_real</u> foi cifrado com sucesso, Para testar a cifragem acesse: <a href='$arquivo_c'><strong>$arquivo_c</strong></a></p>");
}
}
}
?>
</body>
</html>
Arquivo 2 – funcao.php
<?php
// Nivel 0 não Cifra nada.
// Nivel 10 é o Nivel Padrão Recomendado.
// Nivel 30 é o Nivel Maximo acima de 30 pode ocorrer erros e o arquivo ficar muito grande.
define("NIVEL_CIFRAGEM", 10);
Class Codificar {
private $arquivo="";
private $prefixo="cod";
private $arquivo_c="";
private $erro=array();
// Função de Construção.
public function __construct($prefixo=""){
if (trim($prefixo)!="") {
$this->prefixo=$prefixo;
}
}
// Função de Codificação do Arquivo.
public function codificador($arquivo) {
if (trim($arquivo)=="") {
$this->erro[]="Nome do arquivo não pode ficar em branco na função ".__FUNCTION__;
return false;
}
if (!is_readable($arquivo)){
$this->erro[]="Falha ao abrir o arquivo $arquivo na função ".__FUNCTION__;
return false;
}
$this->arquivo=trim($arquivo);
$ext=end(explode(".",$this->arquivo));
$pfx=strrpos($this->arquivo,".");
$arquivo=substr($this->arquivo,0,$pfx);
$this->arquivo_c=$arquivo_c=$arquivo."_".$this->prefixo.".".$ext;
if(($fp=fopen($arquivo_c,"w+"))===false){
$this->erro[]="Falha ao abrir o arquivo $arquivo_c ao escrever a função ".__FUNCTION__;
return false;
}
else {
fwrite($fp,"<?php \r\n");
$linha=file_get_contents($this->arquivo);
$linha=str_replace("<?php","",$linha);
$linha=str_replace("<?","",$linha);
$linha=str_replace("?>","",$linha);
$linha=trim($linha);
$linha=$this->codificar_string($linha,NIVEL_CIFRAGEM);
$linha.="\r\n";
fwrite($fp,$linha);
fwrite($fp,"?>");
}
fclose($fp);
return $arquivo_c;
}
// Função para codificar o conteúdo do arquivo antes de escrevê-lo.
private function codificar_string($string, $levels=""){
if (trim($levels)=="") {
$levels=rand(1,9);
}
$levels=(int) $levels;
for ($i=0; $i<$levels;$i++){
$string=base64_encode($string);
$string='eval(base64_decode("'.$string.'"));';
}
return $string;
}
// Função para retornar todos os erros encontrados.
public function pegar_erro(){
return $this->erro;
}
// Função para descobrir se havia alguma erro.
public function erro(){
if (count($this->erro)>0) {
return true;
}
else {
return false;
}
}
}
?>