fread modifica algunos bytes tratando de volcar parte de un archivo en otro

Iniciado por @XSStringManolo, 9 Agosto 2021, 23:39 PM

0 Miembros y 1 Visitante están viendo este tema.

@XSStringManolo

Estoy haciendo un cifrado CBC y añado 1024 bytes generados de forma pseudoaleatoria al final del archivo que el usuario eliga cifrar. Por motivos de debug, estos 1024 bytes a parte de añadirlos al archivo, también creo un archivo llamado lastIV.txt con estos 1024 bytes.

Estoy programando la parte que descifra y el primer paso que estoy haciendo es obtener esos últimos 1024 bytes del final del archivo cifrado que corresponden al IV generado aleatoriamente. Para ver el resultado, escribo estos 1024 bytes en un archivo externo al que llamo extractedIV.txt

Al comparar ambos archivos, que deberían ser exactamente iguales, algunos bytes no coinciden y no tengo ni idea de porque ambos archivos no son iguales.

Aquí adjunto sus hex creados con xxd:

lastIV.txt
00000000: 5dcf c46c d3d7 561f 5b23 2c8c d252 c5c9  ]..l..V.[#,..R..
00000010: 8cf5 8070 706e df2b 2fe8 5d2b f3ff f2d8  ...ppn.+/.]+....
00000020: bd7e 8c99 edc4 a87a 26f1 077f 5d2f 132b  .~.....z&...]/.+
00000030: 2b83 1319 4e76 0e0f 0822 0d9b f686 071d  +...Nv..."......
00000040: 0ea2 b106 5cf6 1401 48a8 a95e f9b7 2ade  ....\...H..^..*.
00000050: 194e 5e80 c744 1fac 81c3 af2b ae30 2ba9  .N^..D.....+.0+.
00000060: 3f56 7b6c c413 e4af c24b 2cc4 001e b74f  ?V{l.....K,....O
00000070: f1a2 1a2b 8881 20fc b41f 12bd 14e0 9017  ...+.. .........
00000080: d8ee 866e cea9 6759 36a6 6c7d c55c b389  ...n..gY6.l}.\..
00000090: ae80 d81f 2c2b 8049 826c b9df 071b d5cd  ....,+.I.l......
000000a0: 943f acd7 0f20 4f13 1956 5c23 0b89 81c4  .?... O..V\#....
000000b0: 95e2 f3f2 7b90 f174 bdc9 0df4 ec81 6ea9  ....{..t......n.
000000c0: 132a 5e42 93e0 0d5e a4ca 13ec d013 63dc  .*^B...^......c.
000000d0: a218 5dca c54e 2ea9 0607 d53c b022 2781  ..]..N.....<."'.
000000e0: 0b7e 7142 135b de22 c5de df6d 825d 755c  .~qB.[."...m.]u\
000000f0: 6c81 1a53 6c1b 2e2b d32a fdd0 0bd6 d629  l..Sl..+.*.....)
00000100: 816e 5780 4e0b bde1 13c9 1159 4950 5c88  .nW.N......YIP\.
00000110: 927d 235c c9e8 e83c 0b9e 7fbd 959f 830d  .}#\...<........
00000120: 3b8c d7ca d7ef c3a2 2e8e ff5e dae2 f494  ;..........^....
00000130: 9fbd 5be1 a65d abe8 d8d5 862d 42b7 0ba9  ..[..].....-B...
00000140: e6ed 3ccc 2ca8 30f2 a950 883b 6722 225d  ..<.,.0..P.;g""]
00000150: 3c5c 1907 f2f7 9ab7 01b3 2cd5 98da 4080  <\........,...@.
00000160: 2319 9859 1a1a 22e8 2f21 f5c2 363d c918  #..Y.."./!..6=..
00000170: 9990 e842 ef1b efab 5e3d a2bd 2b1f 2b2a  ...B....^=..+.+*
00000180: 922f 80f5 4b36 e636 aba6 5d17 c375 8095  ./..K6.6..]..u..
00000190: 8de8 e813 aef4 ce04 33d8 f221 e8c5 d801  ........3..!....
000001a0: 93b7 ed1b 9a95 bf3d b72b 08da a4bf b165  .......=.+.....e
000001b0: bd71 c77d ee2b a853 79c0 9e52 2092 c5d8  .q.}.+.Sy..R ...
000001c0: 19e8 4052 1fde 83a1 4e8c 30b3 e619 361e  ..@R....N.0...6.
000001d0: 6cd0 9248 13d8 7bae 9536 5d44 d5e4 131b  l..H..{..6]D....
000001e0: 8c40 49f3 c38d 5d26 c3ec f790 131f f95b  .@I...]&.......[
000001f0: 635c e679 75f3 42e8 a41e 52b4 8852 2bfd  c\.yu.B...R..R+.
00000200: 7a87 d759 f43d c988 537d 6380 cfa4 b7f4  z..Y.=..S}c.....
00000210: b41b ecc7 ccfd 825c e46e 6eb4 e4c9 e83d  .......\.nn....=
00000220: 2ad1 f2a2 1fd7 7df1 843f 01f1 9664 185c  *.....}..?...d.\
00000230: 0000 0000 0000 0000 8776 ec75 5ba2 4052  .........v.u[.@R
00000240: 0004 0000 0000 0000 2010 61f9 7c00 0000  ........ .a.|...
00000250: 0000 0000 0000 0000 2010 61f9 7c00 0000  ........ .a.|...
00000260: 0010 0000 0000 0000 0010 0000 0000 0000  ................
00000270: d0d0 53d5 7f00 0000 5453 55f9 7c00 0000  ..S.....TSU.|...
00000280: 4841 01f9 7c00 0000 5417 2ce1 2c13 3c04  HA..|...T.,.,.<.
00000290: 90d1 53d5 7f00 0000 54da 5cf9 7c00 0000  ..S.....T.\.|...
000002a0: 0d17 da1a 2220 1f18 47b3 0000 0000 0000  ...." ..G.......
000002b0: 9fcc 1400 0000 0000 8081 0000 0100 0000  ................
000002c0: 8f27 0000 8f27 0000 0000 0000 0000 0000  .'...'..........
000002d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000002e0: 0010 0000 0000 0000 0000 0000 0000 0000  ................
000002f0: 3a9e 1161 0000 0000 0092 fe1e 0000 0000  :..a............
00000300: 3a9e 1161 0000 0000 0092 fe1e 0000 0000  :..a............
00000310: 3a9e 1161 0000 0000 0092 fe1e 0000 0000  :..a............
00000320: 0000 0000 0000 0000 843f 01f1 9664 185c  .........?...d.\
00000330: 40ce 53d5 7f00 0000 0100 0000 0000 0000  @.S.............
00000340: 20d2 53d5 7f00 0000 4841 01f9 7c00 0000   .S.....HA..|...
00000350: b0d1 53d5 7f00 0000 08f4 5cf9 7c00 0000  ..S.......\.|...
00000360: 4841 01f9 7c00 0000 0004 0000 0004 0000  HA..|...........
00000370: 10d2 53d5 7f00 0000 28d3 5cf9 7c00 0000  ..S.....(.\.|...
00000380: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000390: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000003a0: 0004 0000 0000 0000 2010 61f9 7c00 0000  ........ .a.|...
000003b0: 40ce 53d5 7f00 0000 0100 0000 0000 0000  @.S.............
000003c0: 0004 0000 0000 0000 4841 01f9 7c00 0000  ........HA..|...
000003d0: 80d2 53d5 7f00 0000 f410 5ef9 7c00 0000  ..S.......^.|...
000003e0: 38d2 53d5 7f00 0000 0100 0000 7c00 0000  8.S.........|...
000003f0: 0004 0000 0000 0000 40ce 53d5 7f00 0000  ........@.S.....


extractedIV.txt
00000000: 5dcf c46c d3d7 561f 5b23 2c8c d252 c5c9  ]..l..V.[#,..R..
00000010: 8cf5 8070 706e df2b 2fe8 5d2b f3ff f2d8  ...ppn.+/.]+....
00000020: bd7e 8c99 edc4 a87a 26f1 077f 5d2f 132b  .~.....z&...]/.+
00000030: 2b83 1319 4e76 0e0f 0822 0d9b f686 071d  +...Nv..."......
00000040: 0ea2 b106 5cf6 1401 48a8 a95e f9b7 2ade  ....\...H..^..*.
00000050: 194e 5e80 c744 1fac 81c3 af2b ae30 2ba9  .N^..D.....+.0+.
00000060: 3f56 7b6c c413 e4af c24b 2cc4 001e b74f  ?V{l.....K,....O
00000070: f1a2 1a2b 8881 20fc b41f 12bd 14e0 9017  ...+.. .........
00000080: d8ee 866e cea9 6759 36a6 6c7d c55c b389  ...n..gY6.l}.\..
00000090: ae80 d81f 2c2b 8049 826c b9df 071b d5cd  ....,+.I.l......
000000a0: 943f acd7 0f20 4f13 1956 5c23 0b89 81c4  .?... O..V\#....
000000b0: 95e2 f3f2 7b90 f174 bdc9 0df4 ec81 6ea9  ....{..t......n.
000000c0: 132a 5e42 93e0 0d5e a4ca 13ec d013 63dc  .*^B...^......c.
000000d0: a218 5dca c54e 2ea9 0607 d53c b022 2781  ..]..N.....<."'.
000000e0: 0b7e 7142 135b de22 c5de df6d 825d 755c  .~qB.[."...m.]u\
000000f0: 6c81 1a53 6c1b 2e2b d32a fdd0 0bd6 d629  l..Sl..+.*.....)
00000100: 816e 5780 4e0b bde1 13c9 1159 4950 5c88  .nW.N......YIP\.
00000110: 927d 235c c9e8 e83c 0b9e 7fbd 959f 830d  .}#\...<........
00000120: 3b8c d7ca d7ef c3a2 2e8e ff5e dae2 f494  ;..........^....
00000130: 9fbd 5be1 a65d abe8 d8d5 862d 42b7 0ba9  ..[..].....-B...
00000140: e6ed 3ccc 2ca8 30f2 a950 883b 6722 225d  ..<.,.0..P.;g""]
00000150: 3c5c 1907 f2f7 9ab7 01b3 2cd5 98da 4080  <\........,...@.
00000160: 2319 9859 1a1a 22e8 2f21 f5c2 363d c918  #..Y.."./!..6=..
00000170: 9990 e842 ef1b efab 5e3d a2bd 2b1f 2b2a  ...B....^=..+.+*
00000180: 922f 80f5 4b36 e636 aba6 5d17 c375 8095  ./..K6.6..]..u..
00000190: 8de8 e813 aef4 ce04 33d8 f221 e8c5 d801  ........3..!....
000001a0: 93b7 ed1b 9a95 bf3d b72b 08da a4bf b165  .......=.+.....e
000001b0: bd71 c77d ee2b a853 79c0 9e52 2092 c5d8  .q.}.+.Sy..R ...
000001c0: 19e8 4052 1fde 83a1 4e8c 30b3 e619 361e  ..@R....N.0...6.
000001d0: 6cd0 9248 13d8 7bae 9536 5d44 d5e4 131b  l..H..{..6]D....
000001e0: 8c40 49f3 c38d 5d26 c3ec f790 131f f95b  .@I...]&.......[
000001f0: 635c e679 75f3 42e8 a41e 52b4 8852 2bfd  c\.yu.B...R..R+.
00000200: 7a87 d759 f43d c988 537d 6380 cfa4 b7f4  z..Y.=..S}c.....
00000210: b41b ecc7 ccfd 825c e46e 6eb4 e4c9 e83d  .......\.nn....=
00000220: 2ad1 f2a2 1fd7 7df1 843f 01f1 9664 185c  *.....}..?...d.\
00000230: 0000 0000 0000 0000 8776 ec75 5ba2 4052  .........v.u[.@R
00000240: 0004 0000 0000 0000 2010 61f9 7c00 0000  ........ .a.|...
00000250: 0000 0000 0000 0000 2010 61f9 7c00 0000  ........ .a.|...
00000260: 0010 0000 0000 0000 0010 0000 0000 0000  ................
00000270: d0d0 53d5 7f00 0000 5453 55f9 7c00 0000  ..S.....TSU.|...
00000280: b040 01f9 7c00 0000 5417 2ce1 2c13 3c04  .@..|...T.,.,.<.
00000290: 90d1 53d5 7f00 0000 54da 5cf9 7c00 0000  ..S.....T.\.|...
000002a0: 0d17 da1a 2220 1f18 47b3 0000 0000 0000  ...." ..G.......
000002b0: 3b78 0c00 0000 0000 8081 0000 0100 0000  ;x..............
000002c0: 8f27 0000 8f27 0000 0000 0000 0000 0000  .'...'..........
000002d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000002e0: 0010 0000 0000 0000 0000 0000 0000 0000  ................
000002f0: ed8d 1161 0000 0000 00a0 2526 0000 0000  ...a......%&....
00000300: 3a9e 1161 0000 0000 0092 fe1e 0000 0000  :..a............
00000310: 3a9e 1161 0000 0000 0092 fe1e 0000 0000  :..a............
00000320: 0000 0000 0000 0000 843f 01f1 9664 185c  .........?...d.\
00000330: 2ce7 53d5 7f00 0000 0100 0000 0000 0000  ,.S.............
00000340: 20d2 53d5 7f00 0000 b040 01f9 7c00 0000   .S......@..|...
00000350: b0d1 53d5 7f00 0000 08f4 5cf9 7c00 0000  ..S.......\.|...
00000360: b040 01f9 7c00 0000 ee39 806d 2bd7 3d50  .@..|....9.m+.=P
00000370: 10d2 53d5 7f00 0000 843f 01f1 9664 185c  ..S......?...d.\
00000380: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000390: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000003a0: 0004 0000 0000 0000 2010 61f9 7c00 0000  ........ .a.|...
000003b0: 40ce 53d5 7f00 0000 0100 0000 0000 0000  @.S.............
000003c0: 0004 0000 0000 0000 b040 01f9 7c00 0000  .........@..|...
000003d0: 80d2 53d5 7f00 0000 f410 5ef9 7c00 0000  ..S.......^.|...
000003e0: 38d2 53d5 7f00 0000 0100 0000 0000 0000  8.S.............
000003f0: 0004 0000 0000 0000 40ce 53d5 7f00 0000  ........@.S.....


Aquí el código:
Código (cpp) [Seleccionar]
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

// add operation between 2 buffers
void addBuffers(char * buf1, char * buf2, int bufSize) {
 for(int i = 0; i < bufSize; ++i) {
   buf1[i] = (buf1[i] + buf2[i]);
 }
}

// substract operation between 2 buffers
void substractBuffers(char * buf1, char * buf2, int bufSize) {
 for(int i = 0; i < bufSize; ++i) {
   buf1[i] = (buf1[i] - buf2[i]);
 }
}

// make key match the block size
void securizeKey(char * keyBuf, char * key, int keySize, int chunkSize) {
 for (int i = 0, j = 0; i < chunkSize; ++i, ++j) {
   if (j > keySize) {
     j = 0;
   }
   keyBuf[i] = key[j];
 }
}

// generate pseudorandom buffer
char *allocate_random_heap_buffer(size_t size) {
 time_t current_time = time(NULL);
 srandom((unsigned int) current_time);
 char* allocatedMemory = (char *) malloc(size);

 for (int bufferIndex = 0; bufferIndex < size; bufferIndex++) {
   uint8_t randomNumber = (uint8_t) random();
   allocatedMemory[bufferIndex] = randomNumber;
 }

 return allocatedMemory;
}

// generate a pseudorandom IV
void generateIV(char * ivBuf, int chunkSize) {
 char * random = allocate_random_heap_buffer(chunkSize);
 for (int i = 0; i < chunkSize; ++i) {
   if (random[i] < chunkSize) {
     ivBuf[i] = random[random[i]];
   } else {
     ivBuf[i] = random[i];
   }
 }
}

char * GENERATED_IV;
// block cipher encryption
void cipherBlock(char * bufferBlock, char * bufferBlock2, char * key, int blockSize, int round) {
 if (round == 1) { // add IV to first block
   char IV[blockSize];
   generateIV(IV, blockSize);
   addBuffers(bufferBlock, IV, blockSize);
   GENERATED_IV = IV;
 } else { // add Last Block to Current Block
   addBuffers(bufferBlock, bufferBlock2, blockSize);
   addBuffers(bufferBlock, key, blockSize);
 }
}


// reverse


int main(int argc, char *argv[]) {
 /*** Fetch CLI Arguments */
 char * filename; int filenameSet = 0; // file to work on
 char * mode;     int modeSet = 0; // encrypt or decrypt
 char * key;      int keySet = 0; // simmetric key
 char * output;   int outputSet = 0; // file to output results on
 for(int i = 0; i < argc; ++i) {
   // -f or --file
   if (strcmp(argv[i], "-f") == 0 || strcmp(argv[i], "--file") == 0) {
     filename = argv[i + 1];
     filenameSet = 1;
   // -m or --mode
   } else if (strcmp(argv[i], "-m") == 0 || strcmp(argv[i], "--mode") == 0) {
     mode = argv[i + 1];
     modeSet = 1;
   // -k or --key
   } else if (strcmp(argv[i], "-k") == 0 || strcmp(argv[i], "--key") == 0) {
     key = argv[i + 1];
     keySet = 1;
   } else if (strcmp(argv[i], "-o") == 0 || strcmp(argv[i], "--output") == 0) {
     output = argv[i + 1];
     outputSet = 1;
   }
 }
 
 // Check if mandatory arguments are set
 if (filenameSet != 1) {
   printf("Missing filename argument, use -f ./myFile");
   return 0;
 }

 if (modeSet != 1) {
   printf("Please select a mode, use -m cipher or use -m reverse");
   return 0;
 }

 if (keySet != 1) {
   printf("Missing key argument, use -k mySecretKey");
   return 0;
 }

 if (outputSet != 1) {
   printf("Missing output argument, use -o ./newFile");
   return 0;
 }
 /* Fetch CLI Arguments ***/


 #define BLOCK_SIZE 1024
 const int keySize = strlen(key);
 char keyBuf[BLOCK_SIZE];
 securizeKey(keyBuf, key, keySize, BLOCK_SIZE);


 if (strcmp(mode, "cipher") == 0) { // user selected encryption mode
   char buf[BLOCK_SIZE];
   char lastBuf[BLOCK_SIZE];
   FILE *file;
   size_t nread;

   file = fopen(filename, "r");
   FILE * encrypted = fopen(output, "w"); // file to output the encrypted file
   if (file) {
     int i = 0;
     while ((nread = fread(buf, 1, sizeof buf, file)) > 0) {
       cipherBlock(buf, lastBuf, keyBuf, BLOCK_SIZE, ++i);
       memcpy(lastBuf, buf, BLOCK_SIZE);
       fwrite(buf, 1, nread, encrypted);
     }
     fwrite(GENERATED_IV, 1, BLOCK_SIZE, encrypted);
     
     FILE * lastIV = fopen("./lastIV.txt", "w");
     fwrite(GENERATED_IV, 1, BLOCK_SIZE, lastIV); // debug IV

     if (ferror(file)) {
       // deal with error
     }
     fclose(file);
   }
 } else if (strcmp(mode, "reverse") == 0) {
   /* TODO: READ REVERSE IN CHUNKS */
   char buf[BLOCK_SIZE];
   char lastBuf[BLOCK_SIZE];
   FILE *file;
   size_t nread;

   file = fopen(filename, "r");
   FILE * decrypted = fopen(output, "w"); // file to output the decrypted file
   
   if (file) {
     int i = 0;
     fseek(file, 0, SEEK_END);
     int sz = ftell(file); // file size
     char IV[BLOCK_SIZE];

     char aux[BLOCK_SIZE];


     for (int j = sz - BLOCK_SIZE; /* j > 0 */; j -= BLOCK_SIZE, ++i) {
       fseek(file, j, SEEK_SET);
fread(aux, 1, BLOCK_SIZE, file);
       if (i == 0) {
         memcpy(IV, aux, BLOCK_SIZE);
         FILE * extractedIV = fopen("./extractedIV.txt", "w");
         fwrite(IV, 1, BLOCK_SIZE, extractedIV); // debug IV
         fclose(extractedIV);
         return 0;
       }

if (j <= 0) {
         break;
}
     }
     fclose(file);
   }
   
 } else {
   printf("Select -m cipher or -m reverse");
   return 0;
 }
 return 0;
}


PD: Adjunto output de radiff2 de los bytes que son transformados:
0x00000280 4841 => b040 0x00000280
0x000002b0 9fcc14 => 3b780c 0x000002b0
0x000002f0 3a9e => ed8d 0x000002f0
0x000002f9 92fe1e => a02526 0x000002f9
0x00000330 40ce => 2ce7 0x00000330
0x00000348 4841 => b040 0x00000348
0x00000360 4841 => b040 0x00000360
0x00000368 0004000000040000 => ee39806d2bd73d50 0x00000368
0x00000378 28d35cf97c000000 => 843f01f19664185c 0x00000378
0x000003c8 4841 => b040 0x000003c8
0x000003ec 7c => 00 0x000003ec

RayR

No probé el programa, pero tienes un error en la línea 62:

   GENERATED_IV = IV;

IV es local a la función cipherBlock, por lo que sólo existe dentro de ella (de hecho, dentro del bloque if donde fue declarada) de manera que al retornar de esa función, GENERATED_IV apunta a una dirección inválida. Es de esas cosas que a veces funcionan por casualidad pero son un error. Probablemente eso es lo que te ocasiona el problema. También por ahí reservas memoria sin liberarla pero eso aquí sólo gasta memoria y no es la causa del error.

Añado: lo más simple sería que hagas GENERATED_IV un arreglo de tamaño fijo.

@XSStringManolo

Cita de: RayR en 10 Agosto 2021, 03:01 AM
No probé el programa, pero tienes un error en la línea 62:

   GENERATED_IV = IV;

IV es local a la función cipherBlock, por lo que sólo existe dentro de ella (de hecho, dentro del bloque if donde fue declarada) de manera que al retornar de esa función, GENERATED_IV apunta a una dirección inválida. Es de esas cosas que a veces funcionan por casualidad pero son un error. Probablemente eso es lo que te ocasiona el problema. También por ahí reservas memoria sin liberarla pero eso aquí sólo gasta memoria y no es la causa del error.

Añado: lo más simple sería que hagas GENERATED_IV un arreglo de tamaño fijo.

Creo que al modificar lo que comentas no me vuelve a surgir el error. Comentaré si me vuelve a aparecer y es casualidad que no vuelva a surgir. Muchas gracias, no me di cuenta que estaba guardando un puntero a memoria del stack xD


kub0x

Buenas @XSStringManolo,

¿tu algoritmo hace lo siguiente?

Separo el plaintext en k bloques de N, es decir una colección (B1, ..., Bk)
El primer bloque cifrado C1 es C1 = IV + B1
El segundo C2 = (C1 + B2) + K = IV + B1 + B2 + K
... Ck = IV + (B1 + ... + Bk) + (k-1)*K

Un atacante averigua un triplet (IV, plaintext, ciphertext) pero desconoce la clave K.
Coge el segundo bloque C2 y como sabe los bloques (porque sabe el plaintext) hace:
C2 - B1 - B2 - IV = K
y así puede averiguar la clave, asociada a dicho triplet.

No sé si estaré en lo cierto. Si pudieras comprobar si encaja esta descipción en tu algoritmo.

Saludos.
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate


@XSStringManolo

Cita de: kub0x en 11 Agosto 2021, 15:20 PM
Buenas @XSStringManolo,

¿tu algoritmo hace lo siguiente?

Separo el plaintext en K bloques de N, es decir una colección (B1, ..., BK)
El primer bloque cifrado C1 es C1 = IV + B1
El segundo C2 = (C1 + B2) + K = IV + B1 + B2 + K
... Cn = IV + (B1 + ... + Bn) + (n-1)*K

Un atacante averigua un triplet (IV, plaintext, ciphertext) pero desconoce la clave K.
Coge el segundo bloque C2 y como sabe los bloques (porque sabe el plaintext) hace:
C2 - B1 - B2 - IV = K
y así puede averiguar la clave, asociada a dicho triplet.

No sé si estaré en lo cierto. Si pudieras comprobar si encaja esta descipción en tu algoritmo.

Saludos.
Sí es inseguro, aún lo estoy desarrollando :P


kub0x

Cita de: @XSStringManolo en 11 Agosto 2021, 15:55 PM
Sí es inseguro, aún lo estoy desarrollando :P

Estaría bien que subieras un challenge cuando lo termines.  :rolleyes:
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate


@XSStringManolo

Cita de: kub0x en 11 Agosto 2021, 18:05 PM
Estaría bien que subieras un challenge cuando lo termines.  :rolleyes:
Ya he subido varios pero participan 1 o 2 personas y 2 minutos y lo dejan :(

Danielㅤ

Cita de: @XSStringManolo en 11 Agosto 2021, 19:03 PM
Ya he subido varios pero participan 1 o 2 personas y 2 minutos y lo dejan :(

Si lo subes de nuevo por ejemplo con el código de éste tema, podes insertar el link aquí en tu mismo tema haciendo referencia para que así lo vean más personas y te ayuden más.


Saludos
¡Regresando como cual Fenix! ~
Bomber Code © 2021 https://www.bombercode.net/foro/

Ayudas - Aportes - Tutoriales - Y mucho mas!!!