ubuntuusers.de

C / C++ und mcrypt

Status: Gelöst | Ubuntu-Version: Kubuntu
Antworten |

MS47

Anmeldungsdatum:
30. Juli 2007

Beiträge: 202

Hallo,

ich suche nach einem einfachen Beispiel, wie mit der Library mcrypt in C / C++ ein String verschlüsselt und dann wieder entschlüsselt werden kann. Ich bekomme das irgendwie nicht hin.
In PHP ist das ja recht einfach, wie es unten aufgeführt ist. In C / C++ bekomme ich das aber nicht hin.
Beide Programme habe ich mal unten beigefügt.
Was mache ich verkehrt. Ich hoffe mir kann geholfen werden 😉
Danke schon mal im Voraus.

Gruß
Markus

<?php
    $td = mcrypt_module_open('rijndael-256', '', 'ofb', '');
    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_RANDOM);
    $ks = mcrypt_enc_get_key_size($td);
    $key = substr(md5('very secret key'), 0, $ks);
    mcrypt_generic_init($td, $key, $iv);
    $encrypted = mcrypt_generic($td, 'This is very important data');
    mcrypt_generic_deinit($td);
    mcrypt_generic_init($td, $key, $iv);
    $decrypted = mdecrypt_generic($td, $encrypted);
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
    echo trim($encrypted);
    echo trim($decrypted);
?>
// g++ -o main main.c -lmcrypt
#include <mcrypt.h>
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

MCRYPT td;
char *key;
char block_buffer;
char *IV;
int blocksize=1;
int keysize=4;

int buffer_size = 20;
char buffer[20];
const char* password      = "abcd";

void decrypt_buffer()
{
    int x=0;
    for(x=0;x<buffer_size;x++)
    {
        mdecrypt_generic(td,&buffer[x],1);
    }
}

void encrypt_buffer()
{
    int x;
    for(x=0;x<buffer_size;x++)
    {
        mcrypt_generic(td,&buffer[x],1);
    }
}

int encrypt_init()
{
    int i;
    int iv_size;

    td=mcrypt_module_open((char*)MCRYPT_RIJNDAEL_256,NULL,(char*)"cfb",NULL);
    iv_size=mcrypt_enc_get_iv_size(td);
    IV=(char *)malloc(iv_size);

    srand(time(NULL));
    for(i=0;i<iv_size;i++)
        IV[i]=rand();

    keysize=mcrypt_enc_get_key_size(td);

    key=(char *)malloc(keysize);
    bzero(key,keysize);

    if(keysize<strlen(password))
        strncpy(key,password,keysize);
    else
        strncpy(key,password,strlen(password));

    mcrypt_generic_init(td,key,keysize,IV);

    return 0;
}

int main(int argc, char *argv[])
{
    encrypt_init();
    buffer[0] = 'H';
    buffer[1] = 'a';
    buffer[2] = 'l';
    buffer[3] = 'l';
    buffer[4] = 'o';
    cout << buffer << endl;
    encrypt_buffer();
    cout << buffer << endl;
    decrypt_buffer();
    cout << buffer << endl;

    return 0;
}

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4695

Wohnort: Berlin

Versuch doch mal das PHP-Programm etwas mehr 1:1 um zu setzen, also wirklich die gleichen Schritte aus zu führen. Du lässt da im C++-Programm nämlich was aus.

Und selbst geschriebene Funktionen können auch Argumente entgegennehmen. 😉

MS47

(Themenstarter)

Anmeldungsdatum:
30. Juli 2007

Beiträge: 202

Marc 'BlackJack' Rintsch schrieb:

Versuch doch mal das PHP-Programm etwas mehr 1:1 um zu setzen, also wirklich die gleichen Schritte aus zu führen. Du lässt da im C++-Programm nämlich was aus.

Und selbst geschriebene Funktionen können auch Argumente entgegennehmen. 😉

Nachdem das Portal wieder läuft, kann ich auch ne Antwort geben: Das selbst geschriebene Funktionen auch Argumente entgegennehmen können weiß ich 😀 Globale Variablen sind schlechte Programmierung, aber zum testen und ausprobieren wie etwas läuft, mache ich das meistens so. Dient dann ja auch nur als Prototyp.

Der Tipp mit dem 1:1 umsetzen war gut. In den einzelnen Funktionen fehlte zum Anfang und Ende noch etwas und jetzt läuft es auch:

void decrypt_buffer()
{
    mcrypt_generic_init(td,key,keysize,IV);
    int x=0;
    for(x=0;x<buffer_size;x++)
    {
        mdecrypt_generic(td,&buffer[x],1);
    }
    mcrypt_generic_deinit(td);
}

void encrypt_buffer()
{
    mcrypt_generic_init(td,key,keysize,IV);
    int x;
    for(x=0;x<buffer_size;x++)
    {
        mcrypt_generic(td,&buffer[x],1);
    }
    mcrypt_generic_deinit(td);
}

Besten Dank für den Schubser 😉

Gruß Markus

Antworten |