Browse Source

ajout forcage lsb

master
Astequ 2 years ago
parent
commit
6a02fa519b
  1. 4
      include/hide.h
  2. 12
      src/extract.c
  3. 26
      src/hide.c
  4. 4
      src/main.c
  5. 1
      src/utils.c

4
include/hide.h

@ -9,6 +9,8 @@
#include "utils.h"
#include "sizes.h"
void hide(string picture_path, string file_path, string output_path);
#define hide(pic, file, out) hide_lsb(pic, file, out, 0);
void hide_lsb(string picture_path, string file_path, string output_path, byte forced_lsb);
#endif //LSD_HIDE_H

12
src/extract.c

@ -30,7 +30,8 @@ void extract(string picture_path, string output_path) {
if (i % 4 == 3) continue; // on skip le canal alpha
u32 j;
for (j = 0, current_mask = mask; j < lsb; ++j, current_mask >>= 1) {
data = (data << 1) | (image[i] & current_mask) >> (lsb - (j + 1)); // on ajoute le bit courant au buffer
data = (byte) (data << 1) |
(image[i] & current_mask) >> (lsb - (j + 1)); // on ajoute le bit courant au buffer
if (++buffer_fill == 8) { // si on a recupere un octet complet
if (read_bytes < LEN_HEADER_SIZE) { // si on est en train de lire le header
real_length = (real_length << 8) | data;
@ -57,7 +58,7 @@ void clean(string picture_path, string output_path) {
u32 pixels_nb = width * height; // nombre de pixels
u32 lsb = image[0] & 7u; // nombre de bits occupes par channnel
byte mask = ((byte) (0xffu << lsb)) & 0xff;
byte mask = (byte) (((byte) (0xffu << lsb)) & 0xff);
image[0] &= ~7u;
@ -77,7 +78,7 @@ void get_info(byte *lsb, u32 *length, string picture_path) {
EXIT_ON_TRUE(lodepng_decode32_file(&image, &width, &height, picture_path), LODEPNG_ERROR);
u32 pixels_nb = width * height; // nombre de pixels
*lsb = image[0] & 7u; // nombre de bits occupes par channnel
*lsb = (byte) (image[0] & 7u); // nombre de bits occupes par channnel
u32 real_length = 0; // reelle longueur des donnees a lire
u32 read_bytes = 0; // nombre d'octets lus
@ -90,7 +91,8 @@ void get_info(byte *lsb, u32 *length, string picture_path) {
if (i % 4 == 3) continue; // on skip le canal alpha
u32 j;
for (j = 0, current_mask = mask; j < *lsb; ++j, current_mask >>= 1) {
data = (data << 1) | (image[i] & current_mask) >> (*lsb - (j + 1)); // on ajoute le bit courant au buffer
data = (byte) (data << 1) |
(image[i] & current_mask) >> (*lsb - (j + 1)); // on ajoute le bit courant au buffer
if (++buffer_fill == 8) { // si on a recupere un octet complet
if (read_bytes < LEN_HEADER_SIZE) { // si on est en train de lire le header
real_length = (real_length << 8) | data;
@ -107,4 +109,4 @@ void get_info(byte *lsb, u32 *length, string picture_path) {
}
free(image);
}
}

26
src/hide.c

@ -1,9 +1,9 @@
#include "hide.h"
void hide(string picture_path, string file_path, string output_path) {
void hide_lsb(string picture_path, string file_path, string output_path, byte forced_lsb) {
u32 width, height, size;
u32 lsb_size; // nombre de bits occupes par channnel
u32 lsb; // nombre de bits occupes par channnel
u32 w_index = 1; // nombre de groupes de bits écrits
picture image = 0;
@ -25,14 +25,16 @@ void hide(string picture_path, string file_path, string output_path) {
if (fclose(fp)) exit(3);
if ((lsb_size = (size * 8 + HEADER_SIZE_BITS) / (width * height * 3 - 1) +
((size * 8 + HEADER_SIZE_BITS) % (width * height * 3 - 1) != 0)) > 7)
if ((lsb = (size * 8 + HEADER_SIZE_BITS) / (width * height * 3 - 1) +
((size * 8 + HEADER_SIZE_BITS) % (width * height * 3 - 1) != 0)) > 7)
exit(DATA_DOESNT_FIT);
//printf("%d\n", lsb_size);
//printf("%d\n", lsb);
lsb = (forced_lsb && forced_lsb >= lsb) ? forced_lsb : lsb;
// premiere partie header (3 bits)
image[0] = (byte) ((image[0] & 0xf8) | lsb_size);
u32 mask = gen_mask(lsb_size);
image[0] = (byte) ((image[0] & 0xf8) | lsb);
u32 mask = gen_mask(lsb);
// deuxieme partie header (32 bits)
for (u32 i = 0, m = 0xff000000; i < LEN_HEADER_SIZE; ++i, m >>= 8)
@ -49,9 +51,9 @@ void hide(string picture_path, string file_path, string output_path) {
for (u32 j = 0, mk = 0x80; j < 8; ++j, mk >>= 1) {
// on decale le contenu du buffer pour liberer le dernier bit
// on ecrit le bit courant dans le buffer
write_buffer = (byte) (write_buffer << 1 | (to_hide[i] & mk) >> (8 - j - 1));
write_buffer = (byte) (write_buffer << 1u | (byte) (to_hide[i] & mk) >> (8u - j - 1u));
buffer_fill++; // on incremente le nombre d'elements dans le buffer
if (buffer_fill == lsb_size) { // si on a assez de donnees dans le buffer pour ecrire un canal de pixel
if (buffer_fill == lsb) { // si on a assez de donnees dans le buffer pour ecrire un canal de pixel
// formule pour retrouver le canal en evitant les alpha
// on insere les donnees du buffer dans l'image
image[w_index + w_index / 3] = (byte) ((image[w_index + w_index / 3] & mask) |
@ -64,17 +66,17 @@ void hide(string picture_path, string file_path, string output_path) {
if (buffer_fill) { // si le buffer n'est pas vide en fin d'execution on l'ecrit dans l'image
image[w_index + w_index / 3] =
(byte) (image[w_index + w_index / 3] & mask | write_buffer << (lsb_size - buffer_fill) & ~mask);
(byte) ((image[w_index + w_index / 3] & mask) | (write_buffer << (lsb - buffer_fill) & ~mask));
w_index++;
}
for (u32 i = w_index + w_index / 3; i < width * height * 4; ++i) { // remplissage du reste de l'image avec du bruit
if (i % 4 == 3) continue; // on skip le canal alpha
image[i] = (byte) ((image[i] & mask) | (rand() & (~mask)));
image[i] = (byte) ((image[i] & mask) | ((byte) rand() & (~mask)));
}
EXIT_ON_TRUE(lodepng_encode32_file(output_path, image, width, height), LODEPNG_ERROR);
free(to_hide);
free(image);
}
}

4
src/main.c

@ -14,11 +14,11 @@
int main(int argc, char *argv[]) {
srand(time(NULL));
srand((unsigned int) time(NULL));
if (argc > 1) {
if (!strncmp(argv[1], "-h", 2) && argc >= 5) {
hide(argv[2], argv[3], argv[4]);
hide_lsb(argv[2], argv[3], argv[4], (byte) ((argc == 6) ? ((byte) argv[5][0] - 48) & 7u : 0));
return OK;
}

1
src/utils.c

@ -2,4 +2,5 @@
u32 gen_mask(u32 i) {
return 0xffu >> i << i;
}
Loading…
Cancel
Save