mirror of
https://github.com/Priyatham-sai-chand/Steganography-in-C.git
synced 2026-10-05 08:51:35 -07:00
149 lines
No EOL
4.4 KiB
C
149 lines
No EOL
4.4 KiB
C
#include <openssl/conf.h>
|
|
#include <openssl/evp.h>
|
|
#include <openssl/err.h>
|
|
#include <string.h>
|
|
#include <openssl/applink.c>
|
|
#include "ppm.h"
|
|
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";
|
|
|
|
/* A 128 bit IV */
|
|
unsigned char *iv = (unsigned char *)"0123456789012345";
|
|
/* Message to be encrypted */
|
|
unsigned char *plaintext =(unsigned char *)malloc(sizeof(unsigned char)*100);
|
|
printf("enter the message-> ");
|
|
scanf("%s",plaintext);
|
|
/*
|
|
* Buffer for ciphertext. Ensure the buffer is long enough for the
|
|
* ciphertext which may be longer than the plaintext, depending on the
|
|
* algorithm and mode.
|
|
*/
|
|
unsigned char ciphertext[128];
|
|
|
|
/* Buffer for the decrypted text */
|
|
unsigned char decryptedtext[128];
|
|
|
|
int decryptedtext_len, ciphertext_len;
|
|
|
|
/* Encrypt the plaintext */
|
|
ciphertext_len = encrypt (plaintext, strlen ((char *)plaintext), key, iv,
|
|
ciphertext);
|
|
|
|
/* Do something useful with the ciphertext here */
|
|
printf("Ciphertext is:\n");
|
|
BIO_dump_fp (stdout, (const char *)ciphertext, ciphertext_len);
|
|
|
|
/* Decrypt the ciphertext */
|
|
decryptedtext_len = decrypt(ciphertext, ciphertext_len, key, iv,
|
|
decryptedtext);
|
|
|
|
/* Add a NULL terminator. We are expecting printable text */
|
|
decryptedtext[decryptedtext_len] = '\0';
|
|
|
|
/* Show the decrypted text */
|
|
printf("Decrypted text is:\n");
|
|
printf("%s\n", decryptedtext);
|
|
|
|
|
|
return 0;
|
|
}
|
|
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
|
|
*/
|
|
if(1 != EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv))
|
|
handleErrors();
|
|
|
|
/*
|
|
* 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
|
|
*/
|
|
if(1 != EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), 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;
|
|
} |