From: couturie Date: Thu, 17 Aug 2017 18:24:52 +0000 (+0200) Subject: new X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/Cipher_code.git/commitdiff_plain/48c6cd00416c7d3db8b6f9dc052903f61e040691?hp=fda7e703f6e7ddec74c5c6eb2e44cdc393804bc3 new --- diff --git a/OneRoundIoT/openssl/openssl_evp_ebc.c b/OneRoundIoT/openssl/openssl_evp_ebc.c new file mode 100644 index 0000000..c7b2425 --- /dev/null +++ b/OneRoundIoT/openssl/openssl_evp_ebc.c @@ -0,0 +1,258 @@ +//gcc pixmap_io.c -c +//gcc openssl_evp_ebc.c pixmap_io.o -o openssl_evp_ebc -I /usr/include/openssl/ -lcrypto -O3 -std=c99 + + +#include +#include +#include +#include +#include +#include +#include +#include "pixmap_io.h" + +typedef unsigned char uchar; + + +double TimeStart() +{ + struct timeval tstart; + gettimeofday(&tstart,0); + return( (double) (tstart.tv_sec + tstart.tv_usec*1e-6) ); +} + +double TimeStop(double t) +{ + struct timeval tend; + + gettimeofday(&tend,0); + t = (double) (tend.tv_sec + tend.tv_usec*1e-6) - t; + return (t); +} + + +void handleErrors(void) +{ + ERR_print_errors_fp(stderr); + abort(); +} + + +int encrypt(unsigned char *plaintext, int plaintext_len, unsigned char *key, + unsigned char *iv, unsigned char *ciphertext) +{ + EVP_CIPHER_CTX *ctx; + + int len; + + int ciphertext_len; + + /* Create and initialise the context */ + if(!(ctx = EVP_CIPHER_CTX_new())) handleErrors(); + + /* Initialise the encryption operation. IMPORTANT - ensure you use a key + * and IV size appropriate for your cipher + * In this example we are using 256 bit AES (i.e. a 256 bit key). The + * IV size for *most* modes is the same as the block size. For AES this + * is 128 bits */ + + //256 + //avant ecb + if(1 != EVP_EncryptInit_ex(ctx, EVP_aes_128_ecb(), NULL, key, iv)) + handleErrors(); + +// int cipherBlockSize = EVP_CIPHER_CTX_block_size(ctx); +// printf("INFO(evp_encrypt): block size: %d\n", cipherBlockSize); + + + /* Provide the message to be encrypted, and obtain the encrypted output. + * EVP_EncryptUpdate can be called multiple times if necessary + */ + + if(1 != EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len)) + handleErrors(); + ciphertext_len = len; + + + + + + + + /* Finalise the encryption. Further ciphertext bytes may be written at + * this stage. + */ + if(1 != EVP_EncryptFinal_ex(ctx, ciphertext + len, &len)) handleErrors(); + ciphertext_len += len; + + /* Clean up */ + EVP_CIPHER_CTX_free(ctx); + + return ciphertext_len; +} + +int decrypt(unsigned char *ciphertext, int ciphertext_len, unsigned char *key, + unsigned char *iv, unsigned char *plaintext) +{ + EVP_CIPHER_CTX *ctx; + + int len; + + int plaintext_len; + + /* Create and initialise the context */ + if(!(ctx = EVP_CIPHER_CTX_new())) handleErrors(); + + /* Initialise the decryption operation. IMPORTANT - ensure you use a key + * and IV size appropriate for your cipher + * In this example we are using 256 bit AES (i.e. a 256 bit key). The + * IV size for *most* modes is the same as the block size. For AES this + * is 128 bits */ + + //256 + + //avant => ecb + if(1 != EVP_DecryptInit_ex(ctx, EVP_aes_128_ecb(), NULL, key, iv)) + handleErrors(); + + /* Provide the message to be decrypted, and obtain the plaintext output. + * EVP_DecryptUpdate can be called multiple times if necessary + */ + + + if(1 != EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len)) + handleErrors(); + plaintext_len = len; + + /* Finalise the decryption. Further plaintext bytes may be written at + * this stage. + */ + if(1 != EVP_DecryptFinal_ex(ctx, plaintext + len, &len)) handleErrors(); + plaintext_len += len; + + /* Clean up */ + EVP_CIPHER_CTX_free(ctx); + + return plaintext_len; +} + + +int main (void) +{ + /* Set up the key and iv. Do I need to say to not hard code these in a + * real application? :-) + */ + + /* A 256 bit key */ +// unsigned char *key = (unsigned char *)"01234567890123456789012345678901"; + unsigned char *key = (unsigned char *)"0123456789012345"; + + /* A 128 bit IV */ + unsigned char *iv = (unsigned char *)"0123456789012345"; + + /* Message to be encrypted */ + + + + + + /* Buffer for ciphertext. Ensure the buffer is long enough for the + * ciphertext which may be longer than the plaintext, dependant on the + * algorithm and mode + */ + + int width; + int height; + uchar *data_R, *data_G, *data_B; +// load_RGB_pixmap("lena.ppm", &width, &height, &data_R, &data_G, &data_B); + + +// load_RGB_pixmap("No_ecb_mode_picture.ppm", &width, &height, &data_R, &data_G, &data_B); + load_RGB_pixmap("4096.ppm", &width, &height, &data_R, &data_G, &data_B); + int size=width*height*3; + + int oneD=width*height; + uchar *plaintext = malloc(size); + + + for(int i=0;i