PDA

View Full Version : سوال: Encrypt کردن یک عکس



Salar Ashgi
دوشنبه 27 آبان 1387, 14:59 عصر
سلام به همه دوستان عزیز . من یک سوالی داشتم در مورد Encrypt کردن یک عکس .

آیا میشه این عمل رو اینجوری انجام داد که فایل عکس بخونیم و بریزیم در یک آرایه ای از

بایت ها و بعد یه بایتشو (تصادفی) تغییر بدیم و بعد این فایل جدید رو با متود File.Replace

جایگزین فایل قبلی کنیم ؟؟ آیا الگوریتم درسته ؟؟؟ ممنون میشم راهنمایی کنید !!!!

علیرضا مداح
دوشنبه 27 آبان 1387, 16:16 عصر
سلام دوست عزیز،
شما میتوانید الگوریتم های گوناگون Encryption/Decryption اعم از Symmetric/Asymmetric را با استفاده از اشیاء فضای نام System.Security.Cryptography پیاده سازی کرده و فایل تصویر خود را نیز مانند هر فایل دیگری ، با بهره گیری از یکی از الگوریتم های موجود Encrypt/Decrypt نمایید ،/
یک نمونه :

CodeProject: File Encryption and Decryption in C# (http://www.codeproject.com/KB/files/encryption.aspx)

asm.coder
دوشنبه 27 آبان 1387, 18:27 عصر
سلام به همه دوستان عزیز . من یک سوالی داشتم در مورد Encrypt کردن یک عکس .

آیا میشه این عمل رو اینجوری انجام داد که فایل عکس بخونیم و بریزیم در یک آرایه ای از

بایت ها و بعد یه بایتشو (تصادفی) تغییر بدیم و بعد این فایل جدید رو با متود File.Replace

جایگزین فایل قبلی کنیم ؟؟ آیا الگوریتم درسته ؟؟؟ ممنون میشم راهنمایی کنید !!!!
بعد موقعی که می خوای decrypt کنی اون بایت تصادفی رو چطوری می خوای ‍یدا کنی ؟
راه ساده تر اینه که به همه بایت ها یکی اضافه کنی.

systam
جمعه 26 دی 1393, 23:18 عصر
سلام
این برنامه عکس اینکریپت میکنه
چجوری باید دیکریپتش کنیم

systam
شنبه 27 دی 1393, 22:21 عصر
سلام

جناب مداح این برنامه ای که شما معرفی کردید عکس رمزنگاری میکنه و عکس غیر قابل نمایش میشه
ولی دیگریپت کردنش مشکل داره
باید چیکار کنیم

Hossis
شنبه 26 اردیبهشت 1394, 18:14 عصر
درسته اون سورس تو کدپروژکت اشتباه بود و دیکریپت نمی کرد، اتفاقا همون جا هم خیلی اعتراض کرده بودند
من خودم به سلیقه و ابتکار خودم، یه جوری اینکریپت کردم که قابل بازیابی هست. البت خیلی ساده و ابتدائی، منتها خوب کار می کنه


Private Sub btDycrypt_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btDycrypt.Click
Dim ofd As New OpenFileDialog With {.Filter = "Pictures|*.jpg;*.png|All Files|*.*"}
Dim Fn As String
If ofd.ShowDialog = 1 Then
Fn = ofd.FileName
Dim nfn As String = Fn.Replace("_1", "_0")
Dec(Fn, nfn)
pic.Image = Image.FromFile(nfn)
End If

End Sub

Private Sub btEncrypt_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btEncrypt.Click

Dim ofd As New OpenFileDialog With {.Filter = "Pictures|*.jpg;*.png|All Files|*.*"}
Dim Fn As String
If ofd.ShowDialog = 1 Then
Fn = ofd.FileName
Enc(Fn, Fn.Insert(Fn.LastIndexOf("."), "_1"))
pic.Image = Image.FromFile(Fn)
End If

End Sub

Function Enc(ByVal inputFn As String, ByVal OutFn As String) As String()
Dim Byt() As Byte = IO.File.ReadAllBytes(inputFn)
Dim img(Byt.Length) As String
For i = 0 To Byt.Length - 1
Dim bit As Byte = Byt(i)
img(i) = bit + password
Next

Dim st As String = Join(img, "")
IO.File.WriteAllText(OutFn, st)
Return img
End Function

Function Dec(ByVal inputFn As String, ByVal OutFn As String) As Byte()
Dim st() As String = IO.File.ReadAllText(inputFn).Split("")
Dim byt(st.Length) As Byte
For i = 0 To st.Length - 1
If st(i) = "" Then Continue For
Dim s As Byte = byt(i)
byt(i) = st(i) - password
Next

' Dim st As String = Join(img, "")
IO.File.WriteAllBytes(OutFn, byt)
Return byt
End Function

Dim password As Integer = "1385"

Hossis
شنبه 26 اردیبهشت 1394, 18:18 عصر
البته ببخشید که من با وی بی نوشتم ، چون اصلا با سی شارپ بلد نیستم.
منتها چیزی که واضحه اینه که من تک تک بایت ها رو خونده و اون رو به اضافۀ پسورد می کنم بعد در فایل متنی ذخیره
شما می تونید بایتها رو ضرب در پسورد کرده هر محاسبات دیگری روش انجام بدید. یا فایل رمزی شده رو به صورت باینری ذخیره کنید. ولی این جوری بهتره
منتظر نظرات بقیه هستم.

systam
شنبه 26 اردیبهشت 1394, 22:22 عصر
سلام با تشکر از دوست عزیزمون
اینم کد سی شارپ :
using System;

private void btDycrypt_Click(object sender, System.EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog {Filter = "Pictures|*.jpg;*.png|All Files|*.*"};
string Fn = null;
if (ofd.ShowDialog == 1)
{
Fn = ofd.FileName;
string nfn = Fn.Replace("_1", "_0");
Dec(Fn, nfn);
pic.Image = Image.FromFile(nfn);
}


}


private void btEncrypt_Click(object sender, System.EventArgs e)
{


OpenFileDialog ofd = new OpenFileDialog {Filter = "Pictures|*.jpg;*.png|All Files|*.*"};
string Fn = null;
if (ofd.ShowDialog == 1)
{
Fn = ofd.FileName;
Enc(Fn, Fn.Insert(Fn.LastIndexOf("."), "_1"));
pic.Image = Image.FromFile(Fn);
}


}


public string[] Enc(string inputFn, string OutFn)
{
byte[] Byt = IO.File.ReadAllBytes(inputFn);
string[] img = new string[Byt.Length + 1];
for (var i = 0; i < Byt.Length; i++)
{
byte bit = Byt[i];
img[i] = bit + password;
}


string st = string.Join("", img);
IO.File.WriteAllText(OutFn, st);
return img;
}


public byte[] Dec(string inputFn, string OutFn)
{
string[] st = IO.File.ReadAllText(inputFn).Split("".ToCharArray());
byte[] byt = new byte[st.Length + 1];
for (var i = 0; i < st.Length; i++)
{
if (string.IsNullOrEmpty(st[i]))
{
continue;
}
byte s = byt[i];
byt[i] = Convert.ToByte(st[i] - password);
}


// Dim st As String = Join(img, "")
IO.File.WriteAllBytes(OutFn, byt);
return byt;
}




//INSTANT C# NOTE: Converted event handler wireups:
private bool EventsSubscribed = false;
private void SubscribeToEvents()
{
if (EventsSubscribed)
return;
else
EventsSubscribed = true;


btDycrypt.Click += btDycrypt_Click;
btEncrypt.Click += btEncrypt_Click;
}

reza_noei
شنبه 26 اردیبهشت 1394, 23:17 عصر
سلام
دوستان دارید اشتباه میکتید رمزنگاری تصویر با رمزنگاری فایل فرق میکنه.
رمزنگاری تصویر یعنی بتونید روی عکس رمز بگذارید بعنی بتوانید ریخت عکس رو رمز کنید.
نه اینکه فایل رو رمز کنید.

ghasem110deh
یک شنبه 27 اردیبهشت 1394, 12:04 عصر
سلام
دوستان دارید اشتباه میکتید رمزنگاری تصویر با رمزنگاری فایل فرق میکنه.
رمزنگاری تصویر یعنی بتونید روی عکس رمز بگذارید بعنی بتوانید ریخت عکس رو رمز کنید.
نه اینکه فایل رو رمز کنید.

دقیقا ...
رمزنگاری عکس یعنی ریخت عکس رو به هم بزنی ! (طوری که یه سری رنگ غیر قابل فهم مشاهده بشه)
مثلا یه جا دیدم عکس رو مثل استوانه (بصورت سه بعدی) دور خودش می چرخوند ... و فقط شما یه قیف کج و کوله می دیدین ؛ وقتی هم از حالت رمز خارج می کرد ... عکس کامل و درست بود !
ولی هم الگوریتم و هم کدنویسی ش خیلی پیچیده است (از نظر خودم رو میگم)

Javad_raouf
یک شنبه 27 اردیبهشت 1394, 15:05 عصر
سلام دوستان
من یک الگوریتم همین الان از خودم ساختم
خیلی ابتدایی ولی خودم خوشم اومد:لبخند:
اینم کدش:
Bitmap bmp = new Bitmap(@"C:\pic.bmp");
long Password = 58768;
int BaseNum = 256 * 256 * 255 + 256 * 255 + 256;
int BaseR = 256 * 256;
int BaseG = 256;
Color Pixel;
int rgb;
int r, g, b;
int Width, Height;
private void Form1_Load(object sender, EventArgs e)
{
Width = bmp.Width;
Height = bmp.Height;
pictureBox1.Image = bmp;
}


private void btnEncrypt_Click(object sender, EventArgs e)
{
for (int i = 0; i < Width; i++)
{
for (int j = 0; j < Height; j++)
{
Pixel = bmp.GetPixel(i, j);
//rgb = rgbPlus(Pixel.R, (i + j) * Password) * BaseR + rgbPlus(Pixel.G, i * Password) * BaseG + rgbPlus(Pixel.B, j * Password);
rgb = rgbPlus(Pixel.R, i * j * Password) * BaseR + rgbPlus(Pixel.G, i * Password) * BaseG + rgbPlus(Pixel.B, j * Password);
rgb = (int)((rgb + Password) % BaseNum);
r = rgb / BaseR;
rgb = rgb % BaseR;
g = rgb / BaseG;
b = rgb % BaseG;
bmp.SetPixel(i, j, Color.FromArgb(r, g, b));
}
}
pictureBox1.Image = bmp;
}
private void btnDecrypt_Click(object sender, EventArgs e)
{
int Width = bmp.Width;
int Height = bmp.Height;
Color Pixel;
int rgb;
int r, g, b;
for (int i = 0; i < Width; i++)
{
for (int j = 0; j < Height; j++)
{
Pixel = bmp.GetPixel(i, j);
//rgb = rgbMinus(Pixel.R, (i + j) * Password) * BaseR + rgbMinus(Pixel.G, i * Password) * BaseG + rgbMinus(Pixel.B, j * Password);
rgb = rgbMinus(Pixel.R, i * j * Password) * BaseR + rgbMinus(Pixel.G, i * Password) * BaseG + rgbMinus(Pixel.B, j * Password);
rgb = (int)((rgb - Password) % BaseNum);
if (rgb < 0)
rgb += BaseNum;
r = rgb / BaseR;
rgb = rgb % BaseR;
g = rgb / BaseG;
b = rgb % BaseG;
bmp.SetPixel(i, j, Color.FromArgb(r, g, b));
}
}
pictureBox1.Image = bmp;
}
byte rgbPlus(byte rgb, long Plus)
{
byte bytRet = (byte)((rgb + Plus) % 256);
return bytRet;
}
byte rgbMinus(byte rgb, long Minus)
{
long Result = (rgb - Minus) % 256;
if (Result < 0)
Result += 256;
return (byte)Result;
}

Javad_raouf
یک شنبه 27 اردیبهشت 1394, 15:13 عصر
ایرادات الگوریتم بالا:
1. تصویر به هم میریزه و عجق وجق نشون داده میشه ولی گاهی اوقات از توی اون عجق وجق ها میشه تصویر اصلی رو حدس زد
2. تغییرات کم در Password موجب تغییرات زیاد در نتیجه نمیشه یعنی مثلا وقتی تصویر رو با پسوورد 55847854 Encrypt کنیم و با پسوورد 55847855 Decrypt کنیم تصویر به حالت اول برنمی گرده ولی شبیه به حالت اول میشه
در نتیجه الگوریتم جهت رفع مشکلات بالا نیاز به بهینه سازی داره

ghasem110deh
یک شنبه 27 اردیبهشت 1394, 19:21 عصر
تا جایی که من هم شنیدم (کار نکردم) رمزنگاری تصویر یه همچینی چیزیه !
یه نمونه هم توی codeProject گذاشتن (لینکش رو پیدا نکردم) که اونم تصویر رو به حالت برفک تلویزیون تبدیل میکرد و بعد از رمزگشایی به حالت اولیه بر میگردوند !