# مهندسی نرم افزار > مباحث مرتبط با مهندسی نرم‌افزار > امنیت در نرم افزار و برنامه نویسی >  Hash - Code - Encryption

## Inprise

سلام؛

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

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

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


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

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


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

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

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

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

ایام به کام  :)

----------


## vbapr2005

دستت درد نکنه nprise جان. برای من که تا حالا هیچی نمی دونیستم خیلی عالی بود.
اگه میشه راجع به Encryption یه کمی بیشتر توضیح بده.

----------


## hmm

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

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

----------


## m-heidari

اقای Inprise مقالک جالبی بود .
دستتون درد نکنه.

----------


## vandjalili

جالب بود

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

----------


## ابوالحسن زمانیان

یک فایل آموزش سریع رمز گذاری می خواهم........................................  .......

----------


## bahram_222222

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

----------


## dot_net_lover2

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

----------


## نوید باباخانی

سلام به همگی

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

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

و اما موضوعاتی که توی این کتاب گفته شده:
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 - *** -  Firewall - IDS - SSL - SET و کارت های هوشمند

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

----------


## veria

کد اصلاح شده تابع 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/...e/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

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

Help Me  :ناراحت:

----------


## Mrs.Net

امنترین روش برای کد کردن سریال نامبر برنامه چی هست؟ rsa ؟
من یک سری اطلاعاتو میخوام کد کنم و بدم کاربر و سیستم هم اون متن کد شده میگیره و دیکد کنه و اگر درست بود کار کنه. مهم نیست که این کار امنیتش چقدر هست اما برام مهمه که متن عبارت فهمیده نشه.
خیلی ممنون

----------


## saeedIRHA

امنترين الگوريتم رمزنگاری Vernam یا One-Time Pad
https://barnamenevis.org/showth...ghlight=vernam

----------

