Array als Argument an Funktion übergeben

lano

Aktives Mitglied
Moin.

Ich bekomm das mal wieder nicht gebacken.
Eigentlich will ich nur TP-Link Smart Plug Protocol ver- und entschlüsseln.

Ich traus mich gar nicht zu posten...

tp-link.c:
/* tp-link */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int encryption(char b[], int size) {
  int k = 171;
  for (int i = 0; i < size; i++) {
    int t = b[i] ^ k;
    k = b[i];
    b[i] = t;
    printf("%s", b[i]);
  }
  printf("\n");
  return 0;
}

int decryption(char b[], int size) {
  int k = 171;
  for (int i = 0; i < size; i++) {
    b[i] = b[i] ^ k;
    k = b[i];
    printf("%s", b[i]);
  }
  printf("\n");
  return 0;
}

int main(int argc, char *argv[], char *envp[]) {

  Encryption(argv[1], strlen(argv[1]));

  return EXIT_SUCCESS;
}

Das mein erster Versuch und ich hab jetzt schon die Schnautze voll...

Könnt mir das noch mal einer erklären? Für doofe wie mich...
 

lano

Aktives Mitglied
Ich habs noch mal nen bisschen aufgehübscht, bekomm es aber trotzdem nicht gebacken.
tp-link.c:
/* tp-link */
#include "version.h"
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int encryption(char *b, int size) {
  int k = 171;
  for (int i = 0; i < size; i++) {
    int t = b[i] ^ k;
    k = b[i];
    b[i] = t;
    printf("%02X", b[i]);
  }
  printf("\n");
  return 0;
}

int decryption(char *b, int size) {
  int k = 171;
  for (int i = 0; i < size; i++) {
    b[i] = b[i] ^ k;
    k = b[i];
    printf("%02X", b[i]);
  }
  printf("\n");
  return 0;
}

void help(void) {
  //    fprintf(stderr, "\n");
  fprintf(stderr, "TP-Link Smart Plug Protocol En-/Decryption %s\n", VERSION);
  fprintf(stderr, "\n");
  fprintf(stderr, "Usage: ./tp-link [-edh] [Data...]\n");
  fprintf(stderr, "\n");
  fprintf(stderr, "\t -e\t encryption mode\n");
  fprintf(stderr, "\t -d\t decryption mode\n");
  fprintf(stderr, "\t -h\t this help page\n");
  fprintf(stderr, "\n");
  fprintf(stderr, "%s %s\n", COPYRIGHT, ARR);
  fprintf(stderr, "%s\n\n", URL);
}

int main(int argc, char *argv[], char *envp[]) {

  int opt;
  char *name;

  enum { HELP_MODE, ENCRYPT_MODE, DECRYPT_MODE } mode = HELP_MODE;

  while ((opt = getopt(argc, argv, "edh")) != -1) {
    switch (opt) {
    case 'e':
      mode = ENCRYPT_MODE;
      break;
    case 'd':
      mode = DECRYPT_MODE;
      break;
    case 'h':
      help();
      exit(EXIT_FAILURE);
    default:
      help();
      exit(EXIT_FAILURE);
    }
  }

  if (argc != 3) {
    help();
    exit(EXIT_FAILURE);
  }

  name = malloc(sizeof(char) * (strlen(argv[2]) + 1));
  if (!name) {
    printf("Error: malloc failed....\n");
    exit(1);
  }

  if (strcpy(name, argv[2]) == NULL) {
    printf("Error: strcpy failed....\n");
  }

  if (mode == ENCRYPT_MODE) {
    encryption(name, strlen(name));
  } else if (mode == DECRYPT_MODE) {
    decryption(name, strlen(name));
  } else {
    help();
  }

  return EXIT_SUCCESS;
}
 

BAGZZlash

Mitglied
Was genau funktioniert denn nicht? Bei mir kommt hier das raus, was ich auch erwarten würde:

C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int Encryption(char *b, int size) {
  int k = 171;
  printf("Encrypting string '%s', length: %d.\n", b, size);

  for (int i = 0; i < size; i++) {
    b[i] = b[i] ^ k;
    k = b[i];

    printf("%c", b[i]);
  }
  printf("\n");

  return (0);
}

int main(int argc, char *argv[]) {
  Encryption(argv[1], strlen(argv[1]));

  return (EXIT_SUCCESS);
}

Sind halt nicht immer darstellbare Zeichen.
 

lano

Aktives Mitglied
Was genau funktioniert denn nicht?

Ach hör doch auf :ROFLMAO:

Alles scheiße. Wennde denkst mal eben kurz... denn kommt mir auch noch son speicher scheiß entgegen und ab da an kann ich mich nicht mehr erinnern :LOL:

Beim Entschlüsseln schon gedanklich brutaler fehler. ich füttere ja mit hex...

Ich bin da wohl grad kurzfristig auf dem richtigen weg. ma sehn wie lange noch....
ich meld mich wieder :)
 
Oben Unten