Déchiffrement d'image (C#)

    Publicités

Users Who Are Viewing This Thread (Total: 0, Members: 0, Guests: 0)

Status
Not open for further replies.

EdgeReborn

Membre
Feb 3, 2014
13
0
126
Bonjour tout le monde,

J'ai décidé de créer un crypteur/décrypteur d'image grâce à une fonction pseudo-aléatoire avec un seed.
Donc cette fonction change chaque pixel avec un modulo pour que le chiffre soit entre 0 et 255 (RGB).
Le problème c'est que ca ne marche pas trop quand le R = 0 ou le B ou le G.

Code source :
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.VisualBasic;

namespace Onion_Image
{
    public partial class Form1 : Form
    {

        double m = Math.Pow(2, 32);
        double a = 1664525;
        double c = 1013904223;
        public double z;

        Bitmap image;
        Bitmap newImg;

        public void Rand()
        {
            z = (a * z + c) % m;
        }


        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void normalToolStripMenuItem_Click(object sender, EventArgs e)
        {
            
            string response = Interaction.InputBox("Insert the first key : ");
            z = Convert.ToInt32(response);


            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "Image file|*.png;*.jpg";
            if (ofd.ShowDialog() == DialogResult.OK)
            {

                image = new Bitmap(ofd.FileName);
                newImg = new Bitmap(image.Size.Width, image.Size.Height);
                for (int y = 0; y < image.Size.Height; y++)
                {
                    for (int x = 0; x < image.Size.Width; x++)
                    {
                        double R;
                        double G;
                        double B;

                        Rand();
                        double _R = image.GetPixel(x, y).R;
                        R = (z + _R) % 255;
                        
                        double _G = image.GetPixel(x, y).G;
                        G = (z + _G) % 255;
                        
                        double _B = image.GetPixel(x, y).B;
                        B = (z + _B) % 255;

                        newImg.SetPixel(x, y, Color.FromArgb((int)R, (int)G, (int)B));
                    }
                }

                pictureBox1.Image = newImg;
            }
        }

        private void encryptedToolStripMenuItem_Click(object sender, EventArgs e)
        {
            SaveFileDialog sfd = new SaveFileDialog();
            sfd.Filter = "Image file|*.png;*.jpg";
            if (sfd.ShowDialog() == DialogResult.OK)
            {
                newImg.Save(sfd.FileName);
            }

        }

        private void encryptedToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            string response = Interaction.InputBox("Insert the first key : ");
            z = Convert.ToInt32(response);


            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "Image file|*.png;*.jpg";
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                image = new Bitmap(ofd.FileName);
                newImg = new Bitmap(image.Size.Width, image.Size.Height);
                for (int y = 0; y < image.Size.Height; y++)
                {
                    for (int x = 0; x < image.Size.Width; x++)
                    {


                        Rand();
                        double _R = image.GetPixel(x, y).R;
                        double R = (z - _R) % 255;

                        double _G = image.GetPixel(x, y).G;
                        double G = (z - _G) % 255;

                        double _B = image.GetPixel(x, y).B;
                        double B = (z - _B) % 255;


                        newImg.SetPixel(x, y, Color.FromArgb(255 - (int)R, 255 - (int)G, 255 - (int)B));
                    }
                }
                pictureBox1.Image = newImg;

            }
        }

        private void normalToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            SaveFileDialog sfd = new SaveFileDialog();
            sfd.Filter = "Image file|*.png;*.jpg";
            if (sfd.ShowDialog() == DialogResult.OK)
            {
                newImg.Save(sfd.FileName);
            }
        }

    }
}

Merci d'avance, n'hésitez pas a poser des questions si vous n'avez psa compris ce que je veux faire ;)
 

EdgeReborn

Membre
Feb 3, 2014
13
0
126
Et je fais quoi avec ce chiffre après ? Car je peu pas l'ajouter ou le soustraire à une valeur du RGB sinon ca risque de faire + ou - de 256 ou 0 ...
 

Evaelis

La Voix de la Sagesse
V
Ancien staff
Apr 28, 2010
22,949
468
1,699
Valhalla
Non mais, tu transforme ta couleur en autre chose (String, Tableau, ...) et tu ajoutes 1 à toutes ces valeurs. Ainsi tu n'auras aucun problème avec le 0
Après tu continus avec ton cryptage à toi.
 
Jul 5, 2010
3,543
0
601
Ça me semble bizarre de stocker les composantes RGB dans des doubles et surtout d'utiliser l'opérateur modulo dessus..

Sinon, histoire de donner un quelques pistes :

  • Le type double n'est clairement pas prévu pour ce genre de chose (surtout pour le modulo), tu devrais utiliser des unsigned int 32 ou 64 bits.
    .
  • Le fomat .jpg est un format compressé qui va légèrement changer la couleur de certains pixel de façon à pouvoir faire des groupes de pixels pour réduire l'espace disque ; du coup, je ne suis pas certain que ces légers changements soient vraiment bien appréciés de ton algorithme.
 
Status
Not open for further replies.