007
10.04.2007, 17:58 Uhr
0xdeadbeef
Gott (Operator)
|
Ich hab da mal grad was zusammengeschustert. Auf UNIX mit gcrypt sieht das so aus:
C++: |
#include <gcrypt.h>
#include <pwd.h> #include <unistd.h>
#include <stdio.h> #include <stdlib.h> #include <string.h>
#define BLOCKSIZE 512 #define KEYSIZE 32
#define SALT "fia921m dwq+=**" #define SALT_SIZE sizeof(SALT)
#define RUN_AND_CHECK(call) { \ gcry_error_t err = 0; \ err = call; \ if(err) { \ fprintf(stderr, "Fehler: Zeile %d: %s/%s\n", __LINE__, gcry_strsource(err), gcry_strerror(err)); \ return -1; \ } \ }
int main(int argc, char *argv[]) { gcry_md_hd_t hash; gcry_cipher_hd_t cipher; char *pass; FILE *in, *out; char inbuf[BLOCKSIZE], outbuf[BLOCKSIZE]; size_t chars_read;
if(argc != 4 || !strchr("de", argv[1][0])) { return -1; }
gcry_check_version(NULL);
RUN_AND_CHECK(gcry_cipher_open(&cipher, GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_CFB, 0)); RUN_AND_CHECK(gcry_md_open(&hash, GCRY_MD_SHA256, 0));
pass = getpass("Schlüssel: ");
gcry_md_write(hash, pass, strlen(pass)); gcry_md_final(hash);
RUN_AND_CHECK(gcry_cipher_setkey(cipher, gcry_md_read(hash, GCRY_MD_SHA256), KEYSIZE)); RUN_AND_CHECK(gcry_cipher_setiv(cipher, SALT, SALT_SIZE));
in = fopen(argv[2], "r"); out = fopen(argv[3], "w");
while((chars_read = fread(inbuf, sizeof(char), BLOCKSIZE, in)) > 0) { switch(argv[1][0]) { case 'd': RUN_AND_CHECK(gcry_cipher_decrypt(cipher, outbuf, chars_read, inbuf, chars_read)); break; case 'e': RUN_AND_CHECK(gcry_cipher_encrypt(cipher, outbuf, chars_read, inbuf, chars_read)); }
fwrite(outbuf, sizeof(char), chars_read, out); }
fclose(out); fclose(in);
gcry_md_close(hash); gcry_cipher_close(cipher);
memset( pass, 0, strlen(pass)); memset(outbuf, 0, BLOCKSIZE); memset( inbuf, 0, BLOCKSIZE);
return 0; }
|
...unter Windows müsste man im Wesentlichen die getpass-Funktion ersetzen, um das Passwort aus einer sicheren Quelle zu kriegen, der Rest geht da genauso. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra Dieser Post wurde am 10.04.2007 um 18:03 Uhr von 0xdeadbeef editiert. |