PDA

View Full Version : Hash - Code - Encryption



Inprise
چهارشنبه 23 دی 1383, 01:43 صبح
سلام؛

بررسی سوالات و ابهامات متداول نشون میده عامه توسعه گران تفاوت Hash و Code و Encryption رو نمیدونن و اغلب این سه عنوان که مطلقا" به هم ربطی ندارن بجای دیگری بکار میرن ! سعی میکنم بدون وارد شدن به جزئیات بیش از حد فنی ، این سه عنوان رو کمی توضیح بدم .

Hash : هش یا چکیدهء پیام یا هر اسم دیگه ای که روش میگذارن ، روشی برای تولید چکیده و خلاصه از یک پیام ، فایل و ... است . هش با استفاده از قواعد و الگوریتمهای مخصوص به خودش تلاش میکنه ، از هر چیزی که بهش داده میشه ، یک چکیده با طولی همیشه ثابت تولید کنه . به عنوان مثال الگوریتم MD5 که یکی از روشهای متداول تولید هش است ، به ازای هر نوع ورودی که دریافت کنه ( چه یک حرف باشه چه یک فایل ده گیگا بایتی ) همیشه ، فقط و فقط 128 بیت خروجی تولید میکنه . این خروجی 128 بیتی ، تا وقتی فایل یا پیام تغییر نکرده باشه ، همیشه ثابت خواهد بود . نتیجه : استفاده از هش برای تولید چکیده میتونه روش خوبی برای بررسی تغییر یا عدم تغییر در یک پیام یا فایل باشه . نتیجه بعد : خروجی تولید شده توسط یک الگوریتم هش هرگز به موجودیت اولیه قابل بازگردانی نیست . کاربرد : تولید امضای دیجیتال . حوزه کاربرد : عموما" سیستمهای مبتنی بر PKI .

Code : کد یا درهم ریزی یا هر اسم دیگه ای که روش میگذارن ، از یک جفت الگوریتم تشکیل میشه . اولی پیام یا فایل رو encode میکنه ( مثلا" : غیر قابل خواندن ) و دومی اون رو decode میکنه ( مثلا" : قابل خواندن ) . یعنی یک روش تولید و استفاده از Code همیشه از دو جزء متقارن تشکیل میشه که با داشتن یکی ، تولید اون یکی کار دشواری نخواهد بود . اگر شما یک فایل رو بگیرین و به هر کاراکتر 12 تا اضافه کنین و خروجی رو برای فرد دیگری بفرستین که او با خوندن هر کاراکتر و کسر 12 تا از هر کدوم ، بتونه به فایل اصلی دست پیدا کنه ، شما coding انجام دادین . نتیجه : کد صرفا" شکل پیام یا فایل رو بصورتی متقارن تغییر میده . نتیجه بعدی : کد لزوما از دو قسمت قرینه هم تشکیل میشه . کاربرد : انتقال پیام یا فایل روی محیطهائی که برای پردازش حروف و علائم از کدپیجهای متفاوت استفاده میکنن ، یا انتقال وصله های ایمیلها و ... . حوزه کاربرد : انتقال اطلاعات .


نتیجه اول : هش و کد ارتباط مستقیمی با رمزنگاری ندارند . هیچکدام یک روش رمزنگاری محسوب نمیشن و وجودشون در یک سیستم رمزنگاری الزامی نیست .

نتیجه دوم : هش به موجودیت اولیه قابل بازگردانی نیست . به هیچ وجه . کد به حالت اولیه قابل بازگردانی است . به سادگی .


Encryption : رمزنگاری ، به معنای تغییر شکل و محتوای یک پیام یا فایل با استفاده از حداقل یک الگوریتم و حداقل یک کلید است . نتیجه اولیه : تا وقتی حداقل یک کلید نداریم ، یعنی رمزنگاری نداریم . روشهای رمزنگاری بصورت عمده به دو دسته تقسیم میشن . روشهای متقارن و روشهای غیر متقارن .

روشهای متقارن رمزنگاری : این روشهای از لزوما" یک الگوریتم و حداقل یک کلید استفاده میکنن . مثال : DES

روشهای غیر متقارن : این روشها از حداقل یک الگوریتم و حداقل دو کلید استفاده میکنن . مثال : RSA .

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

ایام به کام :)

vbapr2005
جمعه 22 مهر 1384, 22:36 عصر
دستت درد نکنه nprise جان. برای من که تا حالا هیچی نمی دونیستم خیلی عالی بود.
اگه میشه راجع به Encryption یه کمی بیشتر توضیح بده.

hmm
شنبه 23 مهر 1384, 07:43 صبح
ببخشید وسط بحث علمی دنبال دمپایی میگردم!!!
یه سوال:
اگه رمزگذاری متقارن که به گفته جناب inprise "از لزوما" یک الگوریتم و حداقل یک کلید استفاده میکنن"
برای الگوریتم اضافه/کم کردن حروف در نظر بگیریم و عدد 12 همون کلیدمون باشه آیا از کد استفاده شده یا از رمزگذاری؟

کسی دمپایی منو ندیده!!!

m-heidari
جمعه 18 فروردین 1385, 02:52 صبح
اقای Inprise مقالک جالبی بود .
دستتون درد نکنه.

vandjalili
چهارشنبه 23 فروردین 1385, 01:40 صبح
جالب بود

خوب حالا روش های برنامه نویسی رمزنگاری رو اگه میشه توضیح بدین مخصوصا وی بی و سی پلاس پلاس

ابوالحسن زمانیان
یک شنبه 03 اردیبهشت 1385, 22:58 عصر
یک فایل آموزش سریع رمز گذاری می خواهم........................................ .......

bahram_222222
یک شنبه 03 اردیبهشت 1385, 23:41 عصر
سلام inprise
همیشه مقاله ها ت رو می خونم خیلی جالبند بعضی هاشو اصلا نمی فهمم :گیج: ممنون از اینکه زحمت می کشی
------------
موفق باشی
------------------------------------
وقتی گریم می گیره هنوز امیدوار می شم که جون دارم

dot_net_lover2
دوشنبه 01 خرداد 1385, 00:12 صبح
1.میشه در مورد استفاده Encryption در SSL هم توضیحاتی بدین.
2.در مورد HASH و استفاده آن در امضای دیجیتال ، اگر بصورت Plain text از سمت Client به Server ارسال شود و حال در این نقل و انتقال یک اسنیفر یا چیزی شبیه اینجور برنامه های هک وجود داشته باشد که تمامه Plain text ها را در DB خود Save کند و سپس از این DB میتواند جهت کارهای خود بهره ببرد مثلا به Account یک User وارد شود.
البته باید بگویم که جناب Inprise بیان کردند که کاربرد : تولید امضای دیجیتال.
پس به همین دلیل پیشنهاد میشود در همچنین سیستم هایی حتما از SSL جهت Encrypt شدن Plain Text ها هنگام نقل و انتقال استفاده نمایید.

نوید باباخانی
چهارشنبه 23 اسفند 1385, 11:12 صبح
سلام به همگی

می خوام یه کتاب معرفی کنم که پاسخ پرسش های خیلی ها رو توی زمینه امنیت می تونه بده.

کتاب "امنیت داده ها"
تألیف مهندس احسان ملکیان (البته ایشون به زودی دکتراشون تموم می شه)
انتشارات نص

و اما موضوعاتی که توی این کتاب گفته شده:
1- مبانی و چارچوب امنیت اطلاعات
2- روشهای رمزنگاری پیشرفته (متقارن و کلید عمومی)
متقارن شامل: DES و AES (که هم اکنون استاندارد جهانی است) IDEA و Serpent و RC6
کلید عمومی شامل: RSA و ElGamal (بخوانید الجمال-به نام ابداع کننده آن، دکتر طاهر الجمال)
3- اصول تحلیل رمز و رمزشکنی
(تا اینجا 10 فصل - کل کتاب 16 فصله)
4- روش های تولید چکیده پیام ((MD5- SHA(1)-SHA(2) و الگوهای امضای دیجیتال
5- گواهینامه های دیجیتالی و ساختار Public Key Infrastructure - PKI
6- مکانیزم های احراز هویت و Kerberos
7- امنیت در لایه های شبکه و مفاهیم IPSec - VPN - Firewall - IDS - SSL - SET و کارت های هوشمند

این کتاب تازه به چاپ رسیده و توصیه می کنم علاقمندان به این موضوعات حتماً اونو بخونن.

veria
پنج شنبه 01 شهریور 1386, 09:43 صبح
کد اصلاح شده تابع HashCrypt که می تونه برای هش، encrypt و decrypt کردن یک رشته کاراکتر به کار بره رو اینجا میگذارم. کد به زبان اسمبلی 32 بیتی و با کامپایلر Masm32 نوشته شده. فایل dll شامل تابع hashcrypt، و نمونه کدی برای استفاده از اون در محیط دلفی رو هم اضافه کردم که نشون میده چطور میشه یه رشته رو هش کرد.
پارامتر اول lpstring1:
برای مد encryption/decryption کلید عمومی و برای مد hash رشته کاراکتری که باید هش شود (مثل پارامتر دوم)
پارامتر دوم lpstring2:
برای مد encryption/decryption رشته کاراکترهایی که باید encrypt/decrypt شوند که به عنوان پارامتر ورودی و خروجی استفاده میشه و برای مد hash رشته کاراکتری که باید هش شود (مثل پارامتر اول)
پارامتر سوم dwLength:
طول رشته ارسالی(پارامتر دوم)
پارامتر چهارم flag:
0 برای hashing و 1 برای encryption و 2 برای decryption


.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\advapi32.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\advapi32.lib

StrM MACRO data:VARARG
LOCAL Buff
.data
Buff db data, 0h
.code
exitm <addr Buff>
ENDM

ByteToStr PROTO :DWORD, :DWORD, :DWORD

.const
PKCS_7_ASN_ENCODING equ 00010000h
X509_ASN_ENCODING equ 00000001h

ALG_SID_MD5 equ 00000003h
ALG_SID_RC4 equ 00000001h
ALG_SID_RC2 equ 00000002h

PROV_RSA_FULL equ 00000001h
HP_HASHVAL equ 00000002h

ALG_CLASS_ANY equ 00000000h
ALG_CLASS_SIGNATURE equ 00002000h
ALG_CLASS_MSG_ENCRYPT equ 00004000h
ALG_CLASS_DATA_ENCRYPT equ 00006000h
ALG_CLASS_HASH equ 00008000h
ALG_CLASS_KEY_EXCHANGE equ 0000A000h

ALG_TYPE_ANY equ 00000000h
ALG_TYPE_DSS equ 00000200h
ALG_TYPE_RSA equ 00000400h
ALG_TYPE_BLOCK equ 00000600h
ALG_TYPE_STREAM equ 00000800h
ALG_TYPE_DH equ 00000A00h
ALG_TYPE_SECURECHANNEL equ 00000C00h

CRYPT_VERIFYCONTEXT equ 0F0000000h
CRYPT_EXPORTABLE equ 00000001h

CALG_MD5 equ ALG_CLASS_HASH OR ALG_TYPE_ANY OR ALG_SID_MD5
CALG_RC4 equ ALG_CLASS_DATA_ENCRYPT OR ALG_TYPE_STREAM OR ALG_SID_RC4
CALG_RC2 equ ALG_CLASS_DATA_ENCRYPT OR ALG_TYPE_BLOCK OR ALG_SID_RC2

HCRYPTPROV TYPEDEF DWORD
HCRYPTKEY TYPEDEF DWORD
HCRYPTHASH TYPEDEF DWORD

NTE_BAD_LEN equ 80090004h
NTE_BAD_DATA equ 80090005h


.data
LibName db "IoECrypt.dll", 0


.code

DllEntry proc hInstDLL:HINSTANCE, reason:DWORD, reserved1:DWORD
mov eax, TRUE
ret
DllEntry Endp

ShowMessage PROC uses eax ebx ecx edx esi edi lpMessage:DWORD
invoke MessageBox, 0, lpMessage, addr LibName, MB_OK
ret
ShowMessage endp


HashCrypt proc uses esi edi ebx ecx edx lpstring1:DWORD, lpstring2:DWORD, dwLength:DWORD, flag:DWORD
LOCAL hCryptProv: HCRYPTPROV
LOCAL hHash : HCRYPTHASH
LOCAL hCryptKey : HCRYPTKEY
LOCAL dwi : DWORD
LOCAL sHash[512]: BYTE

invoke CryptAcquireContext, ADDR hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT
.IF eax != 0
invoke CryptCreateHash, hCryptProv, CALG_MD5, 0, 0, ADDR hHash
.IF eax != 0
invoke lstrlen, lpstring1
mov dwi, eax
invoke CryptHashData, hHash, lpstring1, dwi, 0
.IF eax != 0
.IF flag == 0
mov dwi, SIZEOF sHash
invoke CryptGetHashParam, hHash, HP_HASHVAL, ADDR sHash, ADDR dwi, 0
.IF eax != 0
invoke ByteToStr, dwi, ADDR sHash, lpstring2
invoke CryptDestroyHash, hHash
.ENDIF
.ELSE
push dwLength
pop dwi
invoke CryptDeriveKey, hCryptProv, CALG_RC4, hHash, CRYPT_EXPORTABLE, ADDR hCryptKey
.IF eax != 0
invoke CryptDestroyHash, hHash
.IF flag==1
invoke CryptEncrypt, hCryptKey, 0, TRUE, 0, lpstring2, ADDR dwi, dwi
.if eax == 0
invoke GetLastError
.if eax == NTE_BAD_DATA
invoke ShowMessage, StrM("Error NTE_BAD_DATA")
.elseif eax == NTE_BAD_LEN
invoke ShowMessage, StrM("Error NTE_BAD_LEN")

.endif
.endif
.ELSE
invoke CryptDecrypt, hCryptKey, 0, TRUE, 0, lpstring2, ADDR dwi
.if eax == 0
invoke GetLastError
.if eax == NTE_BAD_DATA
invoke ShowMessage, StrM("Error NTE_BAD_DATA")
.elseif eax == NTE_BAD_LEN
invoke ShowMessage, StrM("Error NTE_BAD_LEN")

.endif
.endif
.ENDIF
invoke CryptDestroyKey, hCryptKey
.ENDIF
.ENDIF
invoke CryptReleaseContext, hCryptProv, 0
.ENDIF
.ENDIF
.ENDIF
mov eax, dwi
ret
HashCrypt endp


ByteToStr PROC Len:DWORD, pArray:DWORD, pStr:DWORD
mov ecx, Len
mov esi, pArray
mov edi, pStr
@@:
mov al, byte ptr [esi]
and al, 0F0h
shr al, 4
.IF al <= 9
add al, "0"
mov byte ptr [edi], al
.ELSE
sub al, 10
add al, "A"
mov byte ptr [edi], al
.ENDIF
inc edi
mov al, byte ptr [esi]
and al, 0Fh
.IF al <= 9
add al,"0"
mov byte ptr [edi], al
.ELSE
sub al, 10
add al, "A"
mov byte ptr [edi], al
.ENDIF
inc edi
inc esi
dec ecx
cmp ecx, 0
jnz @B
mov byte ptr [edi], 0
xor eax, eax
ret
ByteToStr ENDP

End DllEntry


لینک دریافت dll:
http://www.ideasofeast.com/Download/Software/IoECrypt.zip

طرز استفاده در دلفی:


unit Unit_Main;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Edit2: TEdit;
Button1: TButton;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

THashCrypt = function(lpszString1, lpszString2: LPCSTR; dwLength, flag :DWORD):DWORD; stdcall;

var
Form1: TForm1;
hCryptDll: THandle;
HashCrypt: THashCrypt;


implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
hCryptDll := LoadLibrary('IoECrypt.dll');
if hCryptDll <> 0 then
@HashCrypt := GetProcAddress(hCryptDll, 'HashCrypt');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
EncryptedSN : array [0..32] of char;
begin
StrCopy(EncryptedSN, PChar(Memo1.Text));
HashCrypt(EncryptedSN, EncryptedSN, StrLen(EncryptedSN), 0);
Edit2.Text := EncryptedSN;
end;

end.

amirhoo
چهارشنبه 28 فروردین 1387, 17:42 عصر
با عرض سلام و خسته نباشید به تمام برو بچ انجمن
من یک مشکلی در باره رمز نگاری پیدا کردم
مشکل من اینکه نمیتونم با کلید خصوصی (Privet key) رمز گذاری (Encrypt) کنم
من این مطلب رو تو ساید ویکی پدیا برسی کردم که میگه میشه و برای امضای دیجیتال استفاده می کنند.
این هم لینکش
http://en.wikipedia.org/wiki/Public-key_cryptography
http://en.wikipedia.org/wiki/Image:Public_key_signing.svg

Help Me :ناراحت:

Mrs.Net
دوشنبه 17 تیر 1387, 21:11 عصر
امنترین روش برای کد کردن سریال نامبر برنامه چی هست؟ rsa ؟
من یک سری اطلاعاتو میخوام کد کنم و بدم کاربر و سیستم هم اون متن کد شده میگیره و دیکد کنه و اگر درست بود کار کنه. مهم نیست که این کار امنیتش چقدر هست اما برام مهمه که متن عبارت فهمیده نشه.
خیلی ممنون

saeedIRHA
سه شنبه 18 تیر 1387, 19:46 عصر
امنترين الگوريتم رمزنگاری Vernam یا One-Time Pad
http://barnamenevis.org/forum/showthread.php?t=98036&highlight=vernam