¿Puede ChatGPT ofuscar código?

Ya hemos probado a usar ChatGPT para desofuscar código, ahora lo vamos a probar para lo contrario, ofuscarlo.

Puedes ver el resultado en el siguiente vídeo de mi canal de Youtube:

Haz click para ver el vídeo en mi canal de Youtube

Prueba 1: Hola mundo en C

#include <stdio.h>
int main() {
   // printf() displays the string inside quotation
   printf("Hello, World!");
   return 0;
}

Resultados:

Como ofuscación es bastante pobre:

#include <stdio.h>
#define p printf
#define r return
int main() {
   p("H");
   p("e");
   p("l");
   p("l");
   p("o");
   p(",");
   p(" ");
   p("W");
   p("o");
   p("r");
   p("l");
   p("d");
   p("!");
   r 0;
}

Otro intento con mejor pinta aunque sigue sin ser perfecto y la cadena de texto sigue expuesta:

#include <stdio.h>
#include <string.h>

char *encode(char *str) {
    static char buffer[256];
    int i;
    for (i = 0; str[i] != '\0'; i++) {
        buffer[i] = str[i] + 1; // se suma 1 al código ASCII de cada caracter
    }
    buffer[i] = '\0';
    return buffer;
}

char *decode(char *str) {
    static char buffer[256];
    int i;
    for (i = 0; str[i] != '\0'; i++) {
        buffer[i] = str[i] - 1; // se resta 1 al código ASCII de cada caracter
    }
    buffer[i] = '\0';
    return buffer;
}

int main() {
    char *message = "Hello, World!";
    char *encoded_message = encode(message);
    char *decoded_message = decode(encoded_message);
    printf("%s", decoded_message);
    return 0;
}

El último intento tiene mejor pinta pero un ser humano seria capaz de entenderlo fácilmente ya que solo trata de añadir un

#include <stdio.h>

#define a(e)(char)(e-1)
#define b(e)(char)(e+1)

int main() {
    char* m = b('G') + a('F') + b('m') + a('n') + b('m') + a('k') + b('`') + b('V') + a('m') + a('o') + b('y') + b('q') + b('t') + b('u') + b('k') + b('w') + a('t');
    char* c = m;
    while(*c) {
        putchar(*c);
        c++;
    }
    return 0;
}

Para ver si obtiene mejor resultado le especifico desde el principio que no se pueda leer «Hello, world» y ChatGPT cumple….a su manera:

#include <stdio.h>

#define H e##l##l##o
#define W o##r##l##d
#define S(x) #x

int main() {
   printf("%s, %s!", S(H), S(W));
   return 0;
}

Prueba 2: Fibonacci en C

Para la segunda prueba le pediremos que ofusque el siguiente código en C que calcula la serie de Fibonacci y veremos como lo ofusca:

El primer resultado no es malo (omitiendo las cadenas que ya hemos visto que no entiende que hay que «ocultarlas»):

#include <stdio.h>
#include <stdlib.h>

unsigned long long f(int n){
    unsigned long long a,b,c;
    if (n<=0) return 0;
    if (n==1) return 1;
    a=0,b=1;
    for(int i=2;i<=n;i++)c=a+b,a=b,b=c;
    return c;
}

int main(int a,char **b){
    printf("fibo[%s] = %llu\n",b[1],f(atoi(b[1])));
    return 0;
}

Pidiéndole que lo ofusque aun más el resultado es bueno aunque falta añadir una linea con F(x) para que funcione:/s

#include <stdio.h>
#include <stdlib.h>
#define O unsigned long long
#define F(x) O f(x){O a,b,c;if(x<=0)return 0;if(x==1)return 1;a=0,b=1;for(int i=2;i<=x;i++)c=a+b,a=b,b=c;return c;}int main(int a,char**b){printf("fibo[%s] = %llu\n",b[1],f(atoi(b[1])));return 0;}

Prueba 3: Fibonacci en JS

fibonacci(n) {
  if (n <= 1) {
    return n;
  } else {
    return fibonacci(n - 1) + fibonacci(n - 2);
  }
}

Resultados:

function f(n){if(n<=1){return n}else{return f(n-1)+f(n-2)}}

Y:

var f=function(g){if(g<=1){return g;}else{return f(g-1)+f(g-2);}};