PDA

View Full Version : سوال: Decrypt & Encrypte File



Saman_12
دوشنبه 20 دی 1389, 17:31 عصر
از عنوانش معلومه موضوع چیه!
موضوع اینه که من می خوام یه برنامه رمز گذاری فایل و پوشه بنویسم که قرار چند تا قابلیت داشته باشه.

یکی از این قابلیت ها اینه که بتونه پوشه رو رمز گذاری کنه خوب هر کسی میدونه که نمیشه پوشه رو مثل فایل رمز گذاری کرد یعنی من با روش کد گذاری بایت های فایل میام و بایت هاشو به هم میریزم تا باز نشه و در اصل خراب بشه و لی پوشه که فایل نیست که بایت داشته باشه.(در اصل فایل های موجود در پوشه بایت های پوشه هستند.)
اولین فکری که به ذهنم رسید این بود که بیام و تمام زیر پوشه و فایل های پوشه رو بدست بیارم (اسمشون رو) بعد یک جا ذخیره کنم و بعد فایل ها رو تک تک کد کنم و بایت هاشون رو توی یک فایل ذخیره کنم ته فایل هم آدرس هر فایل و زیر پوشه ها رو بزارم تا موقع باز کردن اول پوشه ها ساخته شن بعد بایت های فایل ها رو از رمز در بایرم و هرکدوم رو جای خودش بزارم.(از نظر تئوری که درسته و کار میکنه.)

این هم مشکلی نیست اما مشکل کجاست؟:افسرده:

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

حالا کسی میدونه این مشکل چجوری رفع میشه؟(خودم یک راه حل پیدا کردم اما به نظرم مشکل داره!):لبخند:

راستی کار این برنامه تقریبا شبیه وینرار (تقلید از خودشه) هست پس هرکس میدنه این برنامه چطور این کار ها رو انجام میده اینجا پست بده.(می دونم که با برنامه نویسی میشه پوشه و ... رو زیپ کرد اما نمی خوام این کار رو بکنم.)

Saman_12
دوشنبه 20 دی 1389, 21:52 عصر
الآن که دارم به صورت عملی این کار رو میکنم میفهمم که واقعا سخته حدقل برای من!

توی این برنامه همون طور که توضیح دادم من باید بتونم چند فایل رو داخل یک فایل یریزم و دوبار به حالا اول برگردونم کلا توی این موضوع مشکل دارم دوستان لطفا پیشنهاد بدید چی کار کنم چطوری اسم فایل ها رو ذخیره کنم توی خود فایل چطوری بایت های هر فایل رو از فایل دیگه جدا کنم و....؟:افسرده:

Saman_12
سه شنبه 21 دی 1389, 00:01 صبح
این فانکشن رو خودم نوشت برای ترکیب بایت ها (یعنی میاد و بایت های جند تا فایل رو میرزه توی یک آرایه نمودونم کار مکینه یا نه!) :


Private Function MixBytes(ByVal Oldpath() As String) As Byte(,)

Dim Bytes() As Byte
Dim BytesLunch(Oldpath.Length - 1, 0) As Byte
Dim BytesLen As Integer = Nothing

For OpIndex As Integer = 0 To Oldpath.Length - 1

BytesLen = IO.File.ReadAllBytes(Oldpath(OpIndex)).Length - 1
ReDim Bytes(BytesLen)

Bytes = IO.File.ReadAllBytes(Oldpath(OpIndex))

ReDim Preserve BytesLunch(Oldpath.Length - 1, BytesLen)

For i As Integer = 0 To BytesLen

BytesLunch(OpIndex, i) = Bytes(i)
Next
Next

Return BytesLunch
End Function


خوب حالا بر فرض ان که کار میکنه چطور میتونم از این آریه یک خروجی داشته باشم که خودش یک آریه تک بعدی از بایت های یک فایل باشه؟

Saman_12
سه شنبه 21 دی 1389, 11:43 صبح
یک موضوع جالب هست اونم اینه که من خودم در بیشتر مواقع باید جواب خودم بدم!:متفکر:

اون فانکشن رو اصلاح کردم و کار هم میکنه کار با هش هم آسونه :

Private Function MixBytes(ByVal Oldpath() As String) As Byte()()

Dim Bytes() As Byte
Dim BytesLunch(Oldpath.Length - 1)() As Byte
Dim BytesLen As Integer = Nothing

For OpIndex As Integer = 0 To Oldpath.Length - 1

BytesLen = IO.File.ReadAllBytes(Oldpath(OpIndex)).Length - 1
ReDim Bytes(BytesLen)

Bytes = IO.File.ReadAllBytes(Oldpath(OpIndex))

ReDim Preserve BytesLunch(Oldpath.Length - 1)(BytesLen)

BytesLunch(OpIndex) = Bytes
Next

Return BytesLunch
End Function

اما مشکل جدید چطور بعد از ریختن بایت ها از هم جدا شون کنم و دوباره به مثلا دو فایل با اسم هایی که داشتند تبدیل کنم؟:افسرده:

Saman_12
سه شنبه 21 دی 1389, 15:51 عصر
فکر کنم زیادی سخته پس بهتره بریم سراغ راه های آسون تر.(یکیش استفاده از ریجستری هست)

این کد ها (فانکشن ها) رو برای ذخیره و باز یابی نام و بایت های فایل ها نوشتم اما نمیدونم چرا توی ذخیره بایت در ریجستری خطا میده (فکر کنم به خاطر تعداد بایت ها باشه)!:متفکر:

Private Function CryptBytes(ByVal Bytes() As Byte, ByVal Code As String) As Byte()

Try

If Code = "" Then Exit Function

Dim nBytes(Bytes.Length - 1) As Byte
Dim nInt As Byte = StringToBytes(Code)

For i As Integer = 0 To Bytes.Length - 1

nBytes(i) = Bytes(i) Xor nInt
Next

Return nBytes
Catch ex As Exception

Return New Byte() {}
End Try
End Function

Public Function StringToBytes(ByVal Str As String) As Byte

Dim nStr As String = ""
Dim nInt As Integer = 0

For i As Integer = 1 To Str.Length

nStr &= Asc(Mid(Str, i, 1))
Next

For i As Integer = 1 To nStr.Length

nInt += Mid(nStr, i, 1)
Next

Return nInt
End Function

Private Function MixerBytes(ByVal Path() As String) As Byte()()

Dim Bytes() As Byte
Dim BytesLunch(Path.Length - 1)() As Byte
Dim BytesLen As Integer = Nothing

For OpIndex As Integer = 0 To Path.Length - 1

Application.DoEvents()
BytesLen = IO.File.ReadAllBytes(Path(OpIndex)).Length - 1
ReDim Bytes(BytesLen)

Bytes = IO.File.ReadAllBytes(Path(OpIndex))

ReDim Preserve BytesLunch(Path.Length - 1)(BytesLen)

BytesLunch(OpIndex) = Bytes
Next

Return BytesLunch
End Function

Private Function StringToAscBytes(ByVal Str As String) As Byte()

Dim nInt(Str.Length - 1) As Byte

For i As Integer = 1 To Str.Length

Application.DoEvents()
nInt(i - 1) = Asc(Mid(Str, i, 1))
Next

Return nInt
End Function

Private Function BytesToChrString(ByVal Bytes() As Byte) As String

Dim nStr(Bytes.Length - 1) As String
Dim StrBytes As String = ""

For i As Integer = 0 To Bytes.Length - 1

Application.DoEvents()
nStr(i) = Chr(Bytes(i))
Next

StrBytes = Join(nStr, "")

Return StrBytes
End Function

Private Function GetPartOfBytes(ByVal Bytes() As Byte, ByVal Num As Integer, ByVal Co As Integer) As Byte()

Dim nBytes(Co) As Byte

For i As Integer = Num To Co

Application.DoEvents()
nBytes(i) = Bytes(i)
Next

Return nBytes
End Function

Private Sub CreateOneFile(ByVal Path As String, ByVal FileName() As String, ByVal Bytes()() As Byte, ByVal Code As String, ByVal Del As Boolean)

Dim RegKey As RegistryKey = Registry.CurrentUser.OpenSubKey("Software", True)
Dim nBytes() As Byte = Nothing

File.Create(Path).Close()

WriteAllText(Path, "FilePath=" & Path, False)
WriteAllText(Path, vbCrLf & "FileCo=" & FileName.Length - 1, True)

nBytes = File.ReadAllBytes(Path)
File.WriteAllBytes(Path, CryptBytes(nBytes, Code))

RegKey = RegKey.CreateSubKey("Crypto\" & Path.Replace("\", "/"))

For Index As Integer = 0 To FileName.Length - 1

RegKey.SetValue(FileName(Index), CryptBytes(Bytes(Index), Code), RegistryValueKind.Binary)
Next

If Del = True Then

Dim OnePath As String = Directory.GetParent(Path).FullName & "\"

For Index As Integer = 0 To FileName.Length - 1

File.Delete(OnePath & FileName(Index))
Next
End If

RegKey.Close()
End Sub

Private Sub CreateSomeFile(ByVal Path As String, ByVal Code As String, ByVal Del As Boolean)

Dim RegKey As RegistryKey = Registry.CurrentUser.OpenSubKey("Software\Crypto", True)
Dim Bytes() As Byte = File.ReadAllBytes(Path)
Dim FilePath As String = ""
Dim FileCo As Integer = 0
Dim FileName() As String

File.WriteAllBytes(Path, CryptBytes(Bytes, Code))

FilePath = File.ReadAllText(Path).Split(vbCrLf)(0).Replace("FilePath=", "")
FileCo = File.ReadAllText(Path).Split(vbCrLf)(1).Replace("FileCo=", "")

RegKey = RegKey.CreateSubKey(FilePath.Replace("\", "/"))

Dim FileBytes(RegKey.GetValueNames.Length - 1)() As Byte

ReDim FileName(RegKey.GetValueNames.Length - 1)

FileName = RegKey.GetValueNames

For Index As Integer = 0 To FileName.Length - 1

ReDim Preserve FileBytes(Index)(CType(RegKey.GetValue(FileName(In dex)), Byte()).Length - 1)

FileBytes(Index) = CType(RegKey.GetValue(FileName(Index)), Byte())
Next

For Index As Integer = 0 To FileBytes.Length - 1

File.WriteAllBytes(Directory.GetParent(Path).FullN ame & "\" & FileName(Index), CryptBytes(FileBytes(Index), Code))
Next

If Del = True Then File.Delete(Path)

RegKey = Registry.CurrentUser.OpenSubKey("Software\Crypto", True)
RegKey.DeleteSubKey(FilePath.Replace("\", "/"))

RegKey.Close()
End Sub

حداقلا یک نفر مشکل این کد رو بگه!

hero4000
چهارشنبه 22 دی 1389, 10:56 صبح
با عرض خسته نباشد خدمت جنابعالي

من اين جواب رو ميدم که فقط بعدا نتونين بگين که کسي جواب نداده و مطلبم شايد اصلا بار علمي نداشته باشه و تراوشات ذهن خودمه :قهقهه:

يکي اينکه شما نبايد نام فايلها رو توي رجيستري ذخيره کني چون به علل مختلف ممکنه رجيستري تغيير کنه ( توضيح بيشتر نمي دم چون شما خودتون استاديد ) و همچنين فايل ترکيبي شما ممکنه از سيستمي به سيستم ديگه منتقل بشه و مسلما اطلاعات رجيستري منتقل نمي شه

اما در مورد بحث نام فايلها بايد خدمتتون بگم که شما ( به نظر شخصي بنده ) بايد قسمتي از اول فايل رو به هيدر فايل تخصيص بدين که ميتونه مقداري ثابت باشه و يا متغير باشه
حالت اول : اگه بخواين مقداري ثابت باشه خوب مسلما بايد پيش بيني هزارتافايل رو هم بکنين و فضايي براي درج اين هزارتا فايل توي هيدر فايل در نظر بگيري و اطلاعات فايلها رو از اون به بعد درج کنين ( مسلما اين روش اصلا منطقي نيست )
حالت دوم : هيدر فايل شما مقداري متغير باشه که مسلما روش بهتريه . در اينجا شما بايد يک سلسله از کاراکترها رو در نظر بگيري و بهتره اين کاراکترها جزو حروف رزرو شده ويندوز باشه که نتونه توي اسم فايلها نقش داشته باشند مثل ( : و / ) بعدا شما اول اسامي فايلها رو توي فايل بريزي و وقتي تموم شد اين سلسله کاراکتر رو بذاري که مشخص بشه داده هاي داخلي فايلها از اين قسمت به بعده ( راستي يک سلسله کاراکتر هم بايد براي تفکيک مشخصات فايلها در هيدر درنظر بگيرين که اطلاعات هر فايل رو از هم جدا کنه ) اين مال وقتيه که ميخواين ذخيره سازي انجام بدين . وقتي هم که خواستين فايل رو باز کنين اول بايد تا سلسله کاراکتري که تعيين کردين رو بخونين و اسامي فايلها رو از توي هيدر استخراج کنين و بعدش هم فايل ها رو استخراج کنين

شرمندم که خيلي کلي گفتم چون شما رو استاد ميدونم و فکر مي کنم همين مقدار توضيحات کفايت مي کنه :خجالت:
موفق باشين

Saman_12
چهارشنبه 22 دی 1389, 12:30 عصر
علیک سلام استاد بزرگ و بالا مرتبه بنده.(استاد دیگه چیه Hero جان باورت میشه من هنوز 9 ماه نیست که برنامه نویسی رو یاد گرفتم!!).
دقیق زدی وسط هدف.(تصمیم داشتم یه پست با همین مضموم ایجاد کنم!!!)

از توضیح تون خیلی ممنون فهمیدم چطور عمل کنم اما هنوز توی کد نویسیش مشکل دارم؟!(یعنی راست ش رو بخواین من با فایل زیاد کار نکردم نمیدونم چطور میشه این کار ها رو کردو یک کار هایی رو بلدم اما نه همه چیز رو!!!)

omid-vbAuto
چهارشنبه 22 دی 1389, 12:54 عصر
با سلام خدمت دوستان عزیز

بحث خیلی جالبی رو راه انداختین.

یه سوال به ذهنم رسیده که مطرح می کنم:

اگه دیده باشید فایل های اکسس و ... دارای قابلیت رمزنگاری برای فایل خودشون هستن.حالا سوال اینه که این رمز رو کجا ذخیره می کنن؟و یا بهتره اینطوری بپرسم:بهترین جا برای نگارش رمز کجاست؟

چون که اگه ما یه نرم افزاری بنویسیم که میتونه فایل ها را رمز کنه . می بایست با انتقال فایل از یک سیستم به سیستم دیگه که همون نرم افزار ما روش نصبه بتونه رمز فایلمونو باز کنه.خوب پس بای رمز با فایلمون منتقل بشه.

حالا مثلا فکر کنید ما یه فایل TXT داریم و داخلش هم چند سطر اطلاعات هستش.اگه بخواهیم این فایل TXT رو دارای رمز کنیم.خوب رمز رو کجاش بنویسیم؟! البته این کار اصلا اصولی نیست که بیایم و به انتهای متنمون رمز رو اضافه کنیم.

من یه استدلال کردم ببینید درسته:
سامان جان هم میگه میام یه فایل بخصوص رو با یه رمز خراب می کنم .قبول حالا وقتی این فایل خرابو که به من میدی فکر کنم نیازی به گذاشتن رمز روی فایل خراب نیستش.فقط باید رمز رو بلد باشی تا با نرم افزارمون بتونیم دوباره درستش کنه؟؟؟

حالا اینجا یه سوال دیگه پیش می آد:
آیا وقتی فایلی رو خراب می کنیم نام و پسوند و آیکون اون فایل چه بلائی سرش می آد؟ اگه دیده باشید وقتی اکسس رو رمز دار می کنیم مثل فایل های بدون رمز دیده میشه.و دقیقا خواسته من هم همینه.(حالا صرف نظر از این که رمز های افیس قابل هک شدنه)

ولی صرف نظر از روش بالا یه نرم افزار هست به نام Steganos Safe Professional 2007که فکر کنم دیده باشید .روش این برنامه چیه؟راستی این برنامه روی 7 بخوبی کار نمیکنه ولی رو XP عالیه.

Saman_12
چهارشنبه 22 دی 1389, 14:16 عصر
یک روشه (به نظر من روش خوبیه) ,برعکس نظر شما به نظر من کار خوبی هست که رمز رو به آخرین سطر فایل اظافه کنیم بعد فایل رو Encrypt کنیم و برای خوند فایل هم فایل رو توی حافظه Decrypt کنیم بعد چک کنیم آیا پسور در انتهای فایل هست یا نه اگر بود چک کنیم ببینیم با پسور دریافتی از کاربر یکیه یا نه اگه بود بایت های Decrypt شده در حافظه رو توی فایل بریزیم(البته باید قبلش بایت های قبلی حذف بشن که VB خودش این کار رو میکنه) و اگر نه بایت های دیکریپت شده رو نابود کنیم و یک اخطار که پسور اشتباه رو هم نشون بدیم!

البته این روش رو میشه به طروق مختلف پیچوند که سخت تر بشه و نشه به راحتی رمز رو در آورد.

اسم که دست خودمونه اسمش رو هر چی دوست داتیم میزاریم اما آیکون رو تاحا توجه نکردم.

خوب از اینا بگذریم من یکم از FileStream سر در میارم نه زیاد دوستان اگر مقاله ای نمونه کدی دارید که در ارتباط با این کار هست رو لطف کنید بزارید تا یک مطلب به مطالب دوستان اظافه بشه!(Hero جان لطفا کمک.)

hero4000
پنج شنبه 23 دی 1389, 08:49 صبح
دوست عزيز من خيلي توي اين قضيه وارد نيستم البته خودم يک برنامه رمز گذار نوشتم ( اينم بگم من بيشتر دنبال روشهاي خلاقانه هستم و روشهاي خودم رو دارم )

برنامه رمزگذار من يکم استثنائيه مثلا يک فايل 4 گيگابايتي رو توي 1 ثانيه رمزگذاري ميکنه ( خيلي تعجب نکنين آخه گفتم که روشهاي خاص خودم رو دارم )

چون روشم خاسه نمي خوام عمومي بشه و برنامه رمزگذارم رو کسي طريقه عملش رو بدونه وگرنه حتما بهتون ميگفتم .شزمنده ديگه :خجالت:

ولي بازم اگه در حيطه اطلاعاتم سوالي داشتيد مطمئن باشيد کمکتون ميکنم :قلب:

Saman_12
جمعه 24 دی 1389, 13:24 عصر
نه مثل اینکه منظور من رو متوجه نشدید!!(من که نگفتم بلد نیستم فایل رو رمز گذاری کنم گفتم نمتونم چند تا فایل رو توی یک فایل بریزم.)

در کل برای رمز گذاری میشه از روش های ساده مثل Xor و از روش های پیچیده تر استفاده کرد که من توی هیچ کدوم مشکل ندارم!.اما موندم چطوری بایت های همه فایل ها رو توی یک فایل + اسم بریزم اصلا توی ریختنش هم مشکل ندارم مشکل من توی جدا رکدن شون هست!

hero4000
شنبه 25 دی 1389, 08:18 صبح
خوب دوست عزيز من که گفتم خدمتتون توي هيدر فايل شما اطلاعات زيادي ميتونين بريزين . مثلا به ترتيب : اسم فايل - خاصيتهاي فايل - طول فايل و ...

بعدش موقع بازکردن فايل به همون ترتيبي که ذخيره کردي باز ميکني و به همون ظرفيتي که توي هيدر فايل ريختي جدا مي کني

بازم اگه متوجه نشدين بفرمائيد کدوم قسمتش رو متوجه نمشين تا باز ترش کنم