PDA

View Full Version : چنین استفاده ای از rijendael صحیحه؟



m.h.movahedi
پنج شنبه 20 اسفند 1394, 05:22 صبح
سلام
من به مباحث رمز نگاری آشنا نیستم و حالا باید یک فایل رو کد و دیکد کنم. با جستجو در این سایت و سایر سایت ها تصمیم گرفتم از rijendael استفاده کنم.
قراره یک آرایه از بایت ها در یک فایل به صورت کد نوشته بشه و سپس قابل بازیابی باشه. مشکل اصلی اینه که این آرایه ممکنه خیلی بزرگ باشه و ایجاد یک آرایه متناظر کد شده باعث خطا بشه( حافظه کافی نباشه) برای همین تصمیم دارم به جای کد و دیکد کردن کل آرایه، به صورت بلوک، بلوک آرایه رو بخونم و کد یا دیکد کنم و در محل قبلی بنویسم.
برای همین از حالت ECB استفاده می کنم. در این حالت به IV نیاز نیست. از اونجایی که فقط یک دسترسی مجاز(رمز عبور) وجود خواهد داشت فکر نمی کنم این مشکل ساز باشه(درسته؟ آیا میشه برای این کاربرد از این الگوریتم با این شرایط استفاده کرد)

مشکل بعدی اینه که در این حالت padding عمل نمی کنه و کد زیر با حالت های مختلف padding خطا میده


List<byte> result = new List<byte>();

RijndaelManaged rijendael = new RijndaelManaged();
//
//rijendael.BlockSize = 256;
rijendael.Mode = CipherMode.ECB;
rijendael.Key = key;
//rijendael.Padding = PaddingMode.Zeros ;
//
ICryptoTransform crypto = rijendael.CreateEncryptor();
//
byte[] helper;

for (int i = 0; i < data.Length; i += rijendael.BlockSize)
{
helper = crypto.TransformFinalBlock(data, i, rijendael.BlockSize);

result.AddRange(helper);
}
کسی میتونه در مورد صحیح یاغلط بودن اینکار یا اشکال کد توضیحی بده؟
تشکر

maarek
پنج شنبه 20 اسفند 1394, 08:41 صبح
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.IO;


namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string serial_a = "8333";
string serial_b = "1875";
string serial_c = "2467";
string serial_d = "3185";
string fullserial = serial_a + serial_b + serial_c + serial_d;
Console.Write(myfunc(fullserial));
Console.Read();
}
internal static string myfunc(string fullserial)
{
byte[] bytes = Encoding.UTF8.GetBytes(fullserial);
string str = "test string 1";
string str3 = "test string 2";
byte[] rgbKey = Encoding.UTF8.GetBytes(str.Substring(0, 0x20));
byte[] rgbIV = Encoding.UTF8.GetBytes(str3.Substring(0, 0x20));
Console.Write("\n");
RijndaelManaged managed = new RijndaelManaged
{
BlockSize = 0x100,
KeySize = 0x100
};
MemoryStream stream = new MemoryStream();
CryptoStream stream2 = new CryptoStream(stream, managed.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
stream2.Write(bytes, 0, bytes.Length);
stream2.FlushFinalBlock();
return Convert.ToBase64String(stream.ToArray());
}

}
}

m.h.movahedi
چهارشنبه 26 اسفند 1394, 09:16 صبح
سلام
کسی نظری نداره؟
جناب maarek (http://barnamenevis.org/member.php?136166-maarek) من دارم میگم آرایه ممکنه خیلی بزرگ باشه اونوقت شما می فرمایید با memoryStream بخونم؟ لطفاً قبل از جواب سوال رو بخونید.

Securebit
چهارشنبه 26 اسفند 1394, 11:46 صبح
این کد رو تست نکردم ولی فکر نکنم مشکلی داشته باشه، شما تست کنید نتیجه رو بفرمایید.


void EncryptFile(string inFilePath, string outFilePath)
{
PasswordDeriveBytes pass = new PasswordDeriveBytes( /*Password*/"123456789abcdefg", Encoding.ASCII.GetBytes( /*Salt*/"123456789abcd"), "MD5", 2);
byte[] rgbKey = pass.GetBytes(128/8);
using (FileStream fileStreamOut = File.OpenWrite(outFilePath))
{
using (FileStream fileStreamIn = File.OpenRead(inFilePath))
{
byte[] rgbIv = new byte[] {43, 35, 74, 25, 74, 24, 76, 34, 85, 34, 23, 64, 83, 37, 26, 75};
fileStreamOut.Write(BitConverter.GetBytes(fileStre amIn.Length),0,8);
fileStreamOut.Write(rgbIv, 0, 16);
RijndaelManaged rijndaelManaged = new RijndaelManaged() { Mode = CipherMode.CBC, Padding = PaddingMode.ANSIX923 };
ICryptoTransform cryptoTransform = rijndaelManaged.CreateEncryptor(rgbKey, rgbIv);
using (CryptoStream cryptoStream = new CryptoStream(fileStreamOut, cryptoTransform, CryptoStreamMode.Write))
{
int blockSize = rijndaelManaged.BlockSize;
for (long i = 0; i < fileStreamIn.Length; i += blockSize)
{
byte[] chunkData = new byte[blockSize];
while (fileStreamIn.Read(chunkData, 0, blockSize) > 0)
{
cryptoStream.Write(chunkData, 0, blockSize);
}
}
cryptoStream.FlushFinalBlock();
}
}
}
Console.WriteLine("Encrypt File Done");
Console.ReadKey();
}