PDA

View Full Version : اشکال در encryption



veria
چهارشنبه 19 مرداد 1384, 19:55 عصر
لطفا به من بگید که چه اشکالی در کد زیر وجود داره که در بعضی شرایط (که ویژگی اون شرایط برای من قابل تشخیص نیست) در encrypt کردن داده ها بر به این مشکل می خوره که فقط بخشی از داده ها (از ابتدای اونها) را encrypt میکنه. این مساله در نظر اول به نظر می رسه که مربوط به حجم داده ها نباشه چون با تغییر کاراکتری از کاراکترهای ورودی که encryption از اونجا به بعد قطع میشه بعضا تا 20-30 کاراکتر به تعداد کاراکترهای encrypt شده اضافه می شه.
پارامتر اول کلید عمومی- پارامتر دوم رشته کاراکترها که به عنوان ورودی و خروجی استفاده میشه - پارامتر سوم 0 برای hashing و 1 برای encryption و 2 برای decryption

CryptMe proc uses esi edi lpstring1: DWORD,lpstring2: DWORD,flag: DWORD
LOCAL hCryptProv:HCRYPTPROV
LOCAL hHash :HCRYPTHASH
LOCAL hCryptKey :HCRYPTKEY
LOCAL dwLength : DWORD
LOCAL sHash[512]:BYTE

invoke CryptAcquireContext,ADDR hCryptProv,NULL,NULL,PROV_RSA_FULL,CRYPT_VERIFYCON TEXT
.IF eax!=0
invoke CryptCreateHash,hCryptProv,CALG_MD5,0,0,ADDR hHash
.IF eax!=0
invoke lstrlen,lpstring1
mov dwLength,eax
invoke CryptHashData,hHash,lpstring1,dwLength,0
.IF eax!=0
.IF flag==0
mov dwLength,SIZEOF sHash
invoke CryptGetHashParam,hHash,HP_HASHVAL,ADDR sHash,ADDR dwLength,0
.IF eax!=0
invoke ByteToStr,dwLength,ADDR sHash,lpstring2
invoke CryptDestroyHash,hHash
.ENDIF
.ELSE
invoke CryptDeriveKey,hCryptProv, CALG_RC4, hHash, CRYPT_EXPORTABLE, ADDR hCryptKey
.IF eax!=0
invoke CryptDestroyHash,hHash
invoke lstrlen,lpstring2
mov dwLength,eax
.IF flag==1
invoke CryptEncrypt,hCryptKey,0,TRUE,0,lpstring2,ADDR dwLength, dwLength
.ELSE
invoke CryptDecrypt,hCryptKey,0,TRUE,0,lpstring2,ADDR dwLength
.ENDIF
invoke CryptDestroyKey,hCryptKey
.ENDIF
.ENDIF
invoke CryptReleaseContext,hCryptProv,0
.ENDIF
.ENDIF
.ENDIF
ret
CryptMe endp

Inprise
دوشنبه 24 مرداد 1384, 13:00 عصر
lpstring هات رو از نوع DWORD معرفی کردی که سایزش طبیعتا" مشخص و ثابته ، اما تو متن برنامه مانند استرینگ باهاش برخورد کردی ( lstrlen ? WTF ) تابع مذکور سایز رشته رو بدون در نظر گرفتن خاتمه برمیگردونه و تو مبتنی بر این محاسبه که منطقش غلطه کار رو ادامه میدی ، در حالیکه DWORD های تو رشته نیستند که انتهاشون خاتمه داشته باشه و بشه ازشون چشمپوشی کرد . امیدوارم روشن باشه...

veria
سه شنبه 25 مرداد 1384, 09:56 صبح
Inprise
پارامترها از نوع pointer به string هستند نه string ، و از این نظر مشکلی وجود نداره. موقع فراخوانی تابع آدرس buffer ها به عنوان پارامتر فرستاده میشه.
موقع استفاده از پارامترها هم در تابعی مثل lstrlen اگه دقت کنی به جای addr پارامتر خود پارامتر فرستاده می شه. مشکل چیز دیگه اس که من ازش سر در نمی آرم.