PDA

View Full Version : سوال: ذخیره اطلاعات در Database به صورت رمز



Javad-2010
سه شنبه 18 آبان 1389, 09:21 صبح
دوستان من یک برنامه دارم که به Database آن هم دسترسی دارم؛
این برنامه وقتی اطلاعات را در Database ذخیره میکند، اطلاعات به صورت عدد ذخیره می‌شود،
حالا سؤال من اینه که، میتونید بگید از چه فرمولی استفاده شده در این برنامه که اطلاعات را به این صورت ذخیره میکنه؟
بعنوان مثال:

0 = 34811
1 = 34911
2 = 35011
3 = 35111
4 = 35211
5 = 35311
10 = 44494821
a = 421211
b = 420811
c = 421011
d = 423711
خیلی ممنون

mansour01
سه شنبه 18 آبان 1389, 20:43 عصر
دوست عزیز اطلاعات شما کامل نیست ، ضمن اینکه در صورت کد شدن توسط یک کلید پیدا کردن شیوه رمزنگاری بنظر مشکل و غیر قابل کشف میاد ، چراکه ما نه شیوه رو می دونیم و نه کلید رو .
اما با دیباگ کردن فایل اجرایی مسلما میشه شیوه رمزنگاری رو بدست آورد ، در غیر اینصورت شما باید تمام شیوه های متداول بدون کلید رو تست کنید تا ببینید با کدوم مورد مطابقت داره .
موفق باشید

Javad-2010
چهارشنبه 19 آبان 1389, 07:23 صبح
اما با دیباگ کردن فایل اجرایی مسلما میشه شیوه رمزنگاری رو بدست آورد
چطوری باید این کار را کرد؟

ایمان مدائنی
چهارشنبه 19 آبان 1389, 09:04 صبح
دوست عزيز معمولا براي رمز نگاري مقدار در ديتا بيس در زبان برنامه نويسي ما كه سي شارپ هست ميگن Hash كردن
اين كار به ما كمك ميكنه تا اطلاعات را از دسترس كاربر محفوط نگه داريم

Javad-2010
چهارشنبه 19 آبان 1389, 10:12 صبح
دوست عزيز معمولا براي رمز نگاري مقدار در ديتا بيس در زبان برنامه نويسي ما كه سي شارپ هست ميگن Hash كردن اين كار به ما كمك ميكنه تا اطلاعات را از دسترس كاربر محفوط نگه داريم
حالا اگه من بخوام برعکس این را انجام بدم (یعنی اطلاعات Hash شده را بخونم) باید چه کاری انجام بدهم.

mansour01
چهارشنبه 19 آبان 1389, 11:40 صبح
چطوری باید این کار را کرد؟

برای اینکار نیاز به یک دیباگر و یا Disassembler دارید و البته کمی دانش مهندسی معکوس .


حالا اگه من بخوام برعکس این را انجام بدم (یعنی اطلاعات Hash شده را بخونم) باید چه کاری انجام بدهم.

نگاه کنید دوست عزیز ، این بسته به نوع رمزنگاری ای داره که برنامه از اون استفاده می کنه ، که می تونه با یک کلید رمزنگاری شده باشه و یا بدون کلید و بصورت روتین و مشکل اینجاست که شما نمی دونید برنامه از چه الگوریتمی برای رمزنگاری استفاده می کنه .
اما چیزی که شما مطمئن هستید اینه که برنامه داده ها رو بصورت رمز ذخیره می کنه و برای بازیافت اونها هم اونرو باید رمزگشایی کنه . شما می تونید با دیباگر به درون برنامه برید و به توابع رمزنگاری دست پیدا کنید و با خوندن کدها متوجه بشید که برنامه برای رمزنگاری از چه روشی استفاده می کنه . اگه این روش معروف باشه که برنامه برای Decrypt زیاد هست و اگر بصورت تلفیقی و یا ابداعی باشه که با کمی جستجو در توابع میشه اونرو بدست آورد . کاری که برای هر کسی راحت نیست و تخصص و تجربه زیادی رو در این ضمینه میطلبه .


-------------------------

0 = 34811
1 = 34911
2 = 35011
3 = 35111
4 = 35211
5 = 35311
10 = 44494821
a = 421211
b = 420811
c = 421011
d = 423711
خب من یه نگاه هم به جدول شما انداختم ، یه چیزایی به چشمم اومد . در جدول بالا چیزی که واضح هست اینه که حروف با 42 شروع میشن و به 11 ختم میشن . و اما اعداد هم به همین ترتیب با 34 شروع میشن و به 11 ختم میشن ، عدد وسط برای 0 عدد 8 هست و برای 1 عدد 9 و برای 2 عدد 0 هست که نشون میده یک شماره به عدد قبلی اضافه شده و مقدار اضافی خودش رو به هزارگان بغلی داده و از اونجا به بعد اعداد با 35 شروع میشن و عدد وسط اونها 1 شماره افزایش پیدا می کنه ، پس من می تونم حدس بزنم عدد 6 در دیتابیس شما 35411 ذخیره میشه ! درسته !؟
و همینطور می تونم حدس بزنم عدد 24 در دیتابیس شما 44505221 هست ، آیا این حدس من هم درسته !؟

خب شما زحمت بکشید تا 2 جایگاه همه و چند مثال از 3جایگاه ، یه جدول از ترکیب این اعداد و کد شده اونهارو قرار بدید ، چه حرف بزرگ و کوچیک و چه اعداد و کارکترهای دیگه . اگر بتونم رمزگشایی می کنم ، البته احتمال داره بتونم ، گرچه اونجور که من می بینم به نظر ساده و ابتکاری هست .

موفق باشید

Javad-2010
چهارشنبه 19 آبان 1389, 13:27 عصر
دوستان، خیلی ممنون که به من کمک می‌کنید.

حدس بزنم عدد 6 در دیتابیس شما 35411 ذخیره میشه ! درسته !؟

حدس بزنم عدد 24 در دیتابیس شما 44505221 هست ، آیا این حدس من هم درسته !؟

بله، در هر دو مورد، حدس شما درسته.

Javad-2010
چهارشنبه 19 آبان 1389, 13:59 عصر
چه حرف بزرگ و کوچیک و چه اعداد و کارکترهای دیگه
چند نمونه:

javad = 3333320221220921223751
JAVAD = 3333320221220921223751
00000 = 22222484848484851
12345 = 22222495051525351
ali110 = 33344421222722949494861
110ali = 44433349494821222722961

Javad-2010
چهارشنبه 19 آبان 1389, 18:36 عصر
عدد 24 در دیتابیس شما 44505221 هست
همین مورد را چطوری حدس زدید؟

mansour01
چهارشنبه 19 آبان 1389, 20:55 عصر
همین مورد را چطوری حدس زدید؟

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

قبل از اینکه بخوام مورد دوم رو حدس بزنم ، دیدم نسبت به اعداد ناگهان عوض شد . نگاهی به این کد بیاندازید :

10 = 44494821

خب در لابه لای اعداد چه چیزی می بینید ؟!
اگر شما یک برنامه نویس باشید ، مسلما عدد 49 و 48 در میان اعداد برای شما آشنا خواهند بود . اولی مبنای 10 کد اسکی 1 و دومی برای 0 است . خب کافیه این دو رقم رو با مبنای 10 کدهای اسکی 2 و 4 جایگزین کنید تا به راحتی رقم کد شده به دست بیاید .

اما در مورد جدول جدیدی به قرار دادید . راستش من منظورم ترکیب های مختلف بود ، شاید دیتابیسی از 100 ها کلمه یا جمله با حالتهای مختلف و طول کلمه های مختلف مثل : aaa1b2A09 / f ( فاصله بین سه کاراکتر عمدی هست ) .
اما خب همین جدول هم اطلاعات مفیدی میده :
من موارد رو بصورت کلی عرض می کنم ، ایشالله که راه گشا باشه :

a = 421211
ali110 = 33344421222722949494861
خب از سمت چپ شروع می کنیم برای ali110 :
عدد 333 در حقیقت معرف این هست که سه کاراکتر اول که به ازای هر یک در رشته کد شده ( یک 3 ) قرار داده شده ، حروف هستند و عدد 444 بعدی که به ازای هر عدد ( یک 4 ) قرار داده معرف رقم بودن اعداد هست ، که تعداد کل این اعداد 6 است که مطابق با تعداد کاراکترهای رشته اصلی ما هست .
اما عدد 212 بعدی با توجه به همین فرمول در مورد حرف a همون معادل حرف a ما هست و برای l عدد 227 و برای i عدد 229 و برای 1 اول 49 و برای 1 دوم هم 49 و برای 0 عدد 48 قرار داده شده . عدد 6 که یکی مونده با آخر هست اشاره به طول رشته ما داره که در اینجا 6 هست و برای خود حرف a که بالاتر نوشتم 1 ( چون یک حرفه ) .
عدد 1 آخری رو برام مشخص نشدهخ ، اما میتونم حدس بزنم که چون در تمام رشته های شما 1 بوده ، پس با دو رشته ای شدن مثل : Ali Baba این عدد انتهایی به 2 و با جدا شدن رشته های توسط Space یا Enter به تعداد رشته های به وجود آمده تغییر پیدا میکنه و شاید در بالاتر از 10 رشته دو رقمی بشه !
ظاهرا الگوریتم به بزرگی و کوچکی حرفو حساس نیست که این موضوع در مورد مثالی که زدید صدق می کنه :


javad = 3333320221220921223751
JAVAD = 3333320221220921223751

اما در مورد


00000 = 22222484848484851

که چرا 5 کاراکتر اول 2 هستند و نه 4 ، یا در مورد خود حرف a که کاراکتر اول 3 هست و نه 4 چیزی هست که حدس هایی میشه در موردش زد ، اما نمیشه بطور قطع گفت . برای رمزگشایی بیشتر به اطلاعات بیشتر نیاز هست .
موفق باشید

Javad-2010
چهارشنبه 19 آبان 1389, 22:00 عصر
mansour01 (http://www.barnamenevis.org/forum/member.php?u=45744) عزیز، خیلی ممنون از توضیحات خوبتون.
اینم چند مثال دیگه:

aaa1b2A09 / f = 6555555555555979797499850654857324732102132
reza ali hassan = 32332323322233311410112297329710810532104971151159 7110152
123$ = 66664950513641
بازم خیلی ممنون

Javad-2010
پنج شنبه 20 آبان 1389, 07:39 صبح
جناب mansour01 (http://www.barnamenevis.org/forum/member.php?u=45744) من یک اشتباهی انجام دادم، به این صورت که:
برنامه‌ای که خدمتتان عرض کردم وقتی اجرا می‌شود زبان پیش‌فرض آن فارسی می‌باشد و وقتی که اطلاعات را وارد می‌کنیم به صورت * نشان می‌دهد، به همین علت یک اشتباه از طرف من پیش آمده بود.
کدهای صحیح عبارت‌های javad و JAVAD به این صورت می‌باشد:

javad = 32323106971189710051
JAVAD = 22222746586656851که طبق توضیحات شما و کدهای اسکی که چک کردم درست می‌باشد.
قبلاً به دلیل همین اشتباه من بود که شما فرمودید:

ظاهرا الگوریتم به بزرگی و کوچکی حروف حساس نیستکه در واقع میبینیم که الگوریتم به بزرگی و کوچکی حروف حساس می‌باشد.
باز هم از راهنمایی‌های خوبتون کمال تشکر را دارم.
"منتظر توضیحات خوبتون هستم"

mansour01
پنج شنبه 20 آبان 1389, 08:49 صبح
جناب mansour01 (http://www.barnamenevis.org/forum/member.php?u=45744) من یک اشتباهی انجام دادم، به این صورت که:
برنامه‌ای که خدمتتان عرض کردم وقتی اجرا می‌شود زبان پیش‌فرض آن فارسی می‌باشد و وقتی که اطلاعات را وارد می‌کنیم به صورت * نشان می‌دهد، به همین علت یک اشتباه از طرف من پیش آمده بود.
کدهای صحیح عبارت‌های javad و JAVAD به این صورت می‌باشد:

javad = 32323106971189710051
JAVAD = 22222746586656851که طبق توضیحات شما و کدهای اسکی که چک کردم درست می‌باشد.
قبلاً به دلیل همین اشتباه من بود که شما فرمودید:
که در واقع میبینیم که الگوریتم به بزرگی و کوچکی حروف حساس می‌باشد.
باز هم از راهنمایی‌های خوبتون کمال تشکر را دارم.
"منتظر توضیحات خوبتون هستم"



من موارد رو بصورت کلی عرض می کنم ، ایشالله که راه گشا باشه :

a = 421211
ali110 = 33344421222722949494861...

خواهش می کنم دوست عزیز ، اینجا ما همه به هم کمک می کنیم . خوشحالم که مفید واقع بودم .

خب راستش من خودم هم شک کرده بودم ، چون الگوریتم به غیر از اعداد دچار اشکال میشد ، مثل همین قسمتی که از خودم نقل قول کردم . که شما به جای a دکمه معادل فارسی اونرو زدید که میشه "ش" که مبنای 10 کد اسکی اون همون 212 هست . و جدول های اول و دوم شما کاملا دچار اشکاله ، چون تمام حرف هاشون معادل فارسیشون هست ، واسه همین هم من خودم یکم دچار مشکل شده بودم و داشتم به این فکر می کردم شاید الگوریتم با طول رشته سنگین تر میشه !
اما با این گفته شما آخرین مقدار این معادله هم بدست اومد . به این رشته نگاه کنید :


javad = 32323106971189710051

از سمت چپ 5 رقم جدا می کنیم . 32323 که حالا متوجه میشیم این برای اینه که به برنامه بفهمونه چندتا چندتا از سمت چپ جدا کنه ( تو الگوریتمی که براتون می نوسم کاملا متوجه میشید ) . مبنای 10 کد اسکی j عدد 106 هست که سه کاراکتره ولی برای a عدد 97 هست که دو کاراکتره و ...

خب من الگوریتم دیکود رو برای شما می نویسم :

- از انتها سمت راست اولین عدد رو بگیر و در intPos قرار بده ( ضمن اینکه من دو رقمی شدن خود همین عدد رو ندیدم ، شاید هم برنامه خودش از یک مقدار طول رشته بیشتر جلوگیری کنه ، چون احتمالا این بخش پسورده شماست { اشاره شما به * شدن کاراکترها} و احتمالا با ویبی این برنامه نوشته شده )

- رقم آخر سمت راست رو از رشته جدا کن

- به تعداد intPos از سمت راست کاراکتر جدا کن و در intLen قرار بده ( مثلا برای 29711 ، intPos ما 1 هست که بعد از حذف شدنش یک رقم جدا میکنه که میشه 1 و اونرو در intLen قرار میده )

- intLen رو از انتهای رشته حذف کن ( 2971 میدهد 297 )

- به ارزش intLen از سمت چپ کاراکتر حذف کن و در intScheme قرار بده ( که چون 1 هست فقط 2 رو از سمت چپ کم می کنیم که میمونه 97 )

- یک حلقه تشکیل بده و به ازای طول intScheme T از intScheme و از سمت چپ یک کاراکتر حذف کن و به مقدار اون (2) از سمت چپ intLen کاراکتر بگیر (97) و مقدار اونرو به کد اسکی برگردون و در رشته strDecode قرار بده (a) .

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

نتیجه گیری : الگوریتم کد کردن بسیار ضعیف بود ، حتی اگر قرار بود از روش جایگزینی استفاده بشه باید این در دو مرحله انجام میشد و یا حتی میشد عدد به دست اومده تقسیم بر 2 و بعد منهای یه عدد بزرگ میشد و میان هر کاراکتر یک 0 قرار داده میشد و برای بازگشت تمام این مراحل برعکس میشد . ( برای اعداد فرد بعد از تقسیم میشد به عدد بالاتر گرد بشه و +1 و یا هر چیز دیگه ای در آخر کلمه قرار بگیره )

امیدوارم تونسته باشم کمکی کرده باشم
موفق باشید

Javad-2010
پنج شنبه 20 آبان 1389, 09:27 صبح
امیدوارم تونسته باشم کمکی کرده باشمخیلی خوب بود و چیزهای جدیدی یاد گرفتم. (از جمله کد اسکی)

موفق باشیدشما هم همینطور "دوست عزیز".

- از انتها سمت راست اولین عدد رو بگیر و در intPos قرار بده ( ضمن اینکه من دو رقمی شدن خود همین عدد رو ندیدم ، شاید هم برنامه خودش از یک مقدار طول رشته بیشتر جلوگیری کنه ، چون احتمالا این بخش پسورده شماست { اشاره شما به * شدن کاراکترها} و احتمالا با ویبی این برنامه نوشته شده )

- رقم آخر سمت راست رو از رشته جدا کن

- به تعداد intPos از سمت راست کاراکتر جدا کن و در intLen قرار بده ( مثلا برای 29711 ، intPos ما 1 هست که بعد از حذف شدنش یک رقم جدا میکنه که میشه 1 و اونرو در intLen قرار میده )

- intLen رو از انتهای رشته حذف کن ( 2971 میدهد 297 )

- به ارزش intLen از سمت چپ کاراکتر حذف کن و در intScheme قرار بده ( که چون 1 هست فقط 2 رو از سمت چپ کم می کنیم که میمونه 97 )

- یک حلقه تشکیل بده و به ازای طول intScheme T از intScheme و از سمت چپ یک کاراکتر حذف کن و به مقدار اون (2) از سمت چپ intLen کاراکتر بگیر (97) و مقدار اونرو به کد اسکی برگردون و در رشته strDecode قرار بده (a) .میشه لطف کنید و این الگوریتم را به صورت کدهای VB6 برام بنویسید.
خیلی ممنون از لطف و زمانی که برای من گذاشتید.

stahad1
پنج شنبه 20 آبان 1389, 10:20 صبح
لطفا کدشو بزارید من که نفهمیدم چی می گید اگه میشه چطوری در sqlاین رمز نگاری را انجام داد

Javad-2010
پنج شنبه 20 آبان 1389, 11:39 صبح
آخرین مقدار این معادله هم بدست اومد . به این رشته نگاه کنید :
کد:
javad = 32323106971189710051
از سمت چپ 5 رقم جدا می کنیم . 32323 که حالا متوجه میشیم این برای اینه که به برنامه بفهمونه چندتا چندتا از سمت چپ جدا کنهجناب mansour01 (http://www.barnamenevis.org/forum/member.php?u=45744) طی گفته بالا عدد 110 باید به صورت 22249494831 در دیتابیس ذخیره شود، درصورتی که به صورت 55549494831 در دیتابیس ذخیره می‌شود، میشه درمورد این مورد هم توضیحی بدهید.
خیلی ممنون "دوست عزیز"

Javad-2010
پنج شنبه 20 آبان 1389, 11:44 صبح
لطفا کدشو بزارید من که نفهمیدم چی می گید اگه میشه چطوری در sqlاین رمز نگاری را انجام داد
هنوز خودمون هم به صورت کامل الگوریتم این رمزکردن را متوجه نشده‌ایم؛:متفکر:
ولی چشم، حتماً وقتی که به صورت کامل الگوریتم این رمزکردن را با کمک دوستان متوجه شدیم، یک سورس کامل همینجا میذاریم تا شما و بقیه از اون استفاده کنند.:چشمک:

Javad-2010
پنج شنبه 20 آبان 1389, 16:09 عصر
جناب mansour01 (http://www.barnamenevis.org/forum/member.php?u=45744) ، من الگوریتمی را که توضیح داده بودید با VB6 به این صورت نوشتم:

Private Sub Text3_Change()
If Text3.Text = "" Then Text4.Text = "": Exit Sub

intPos = Right(Text3.Text, 1)
n = Mid(Text3.Text, 1, Len(Text3.Text) - 1)
intLen = Right(n, intPos)
n = Mid(n, 1, Len(n) - Len(intLen))
intScheme = Mid(n, intLen + 1, Len(n) - intLen)

t1 = Mid(Text3.Text, 1, intLen)
For i = 1 To Len(t1)
t2 = Mid(t1, i, 1)
strDecode = strDecode & Chr(Mid(intScheme, 1, t2))
intScheme = Mid(intScheme, t2 + 1, Len(intScheme) - t2)
Next

Text4.Text = strDecode
End Subاگه میشه لطف کنید و یه بررسی انجام بدهید و نظرتون را بگید.
خیلی ممنون

Javad-2010
پنج شنبه 20 آبان 1389, 21:09 عصر
جناب mansour01 (http://www.barnamenevis.org/forum/member.php?u=45744) :
الگوریتمی که توضیح داده‌اید فقط در صورتی جواب می‌دهد که در متن "عدد" استفاده نشده باشد، چون:
مثلاً عدد صفر که کد اسکی آن 48 است، طبق الگوریم شما باید به صورت 24811 ذخیره شود، در صورتی که به صورت 34811 ذخیره می‌شود.
من متوجه شدم که:
اگر عدد یک رقمی باشد، اول رشته کد شده به اندازه طول متن 3 می‌گذارد؛
اگر عدد دو رقمی باشد، اول رشته کد شده به اندازه طول متن 4 می‌گذارد؛
اگر عدد سه رقمی باشد، اول رشته کد شده به اندازه طول متن 5 می‌گذارد؛
اگر عدد چهار رقمی باشد، اول رشته کد شده به اندازه طول متن 6 می‌گذارد؛
اگر عدد پنج رقمی باشد، اول رشته کد شده به اندازه طول متن 2 می‌گذارد؛
اگر عدد شش رقمی باشد، اول رشته کد شده به اندازه طول متن 3 می‌گذارد؛
اگر عدد هفت رقمی باشد، اول رشته کد شده به اندازه طول متن 4 می‌گذارد؛
اگر عدد هشت رقمی باشد، اول رشته کد شده به اندازه طول متن 5 می‌گذارد؛
اگر عدد نه رقمی باشد، اول رشته کد شده به اندازه طول متن 6 می‌گذارد؛
اگر عدد ده رقمی باشد، اول رشته کد شده به اندازه طول متن 2 می‌گذارد؛
اگر ...
با توجه به این موارد، لطفاً نظر خود را بگوئید.
جناب mansour01 (http://www.barnamenevis.org/forum/member.php?u=45744) ، از توجه شما کمال تشکر را دارم.

mansour01
پنج شنبه 20 آبان 1389, 21:41 عصر
جناب mansour01 (http://www.barnamenevis.org/forum/member.php?u=45744) ، من الگوریتمی را که توضیح داده بودید با VB6 به این صورت نوشتم:

Private Sub Text3_Change()
If Text3.Text = "" Then Text4.Text = "": Exit Sub

intPos = Right(Text3.Text, 1)
n = Mid(Text3.Text, 1, Len(Text3.Text) - 1)
intLen = Right(n, intPos)
n = Mid(n, 1, Len(n) - Len(intLen))
intScheme = Mid(n, intLen + 1, Len(n) - intLen)

t1 = Mid(Text3.Text, 1, intLen)
For i = 1 To Len(t1)
t2 = Mid(t1, i, 1)
strDecode = strDecode & Chr(Mid(intScheme, 1, t2))
intScheme = Mid(intScheme, t2 + 1, Len(intScheme) - t2)
Next

Text4.Text = strDecode
End Subاگه میشه لطف کنید و یه بررسی انجام بدهید و نظرتون را بگید.
خیلی ممنون


جناب mansour01 (http://www.barnamenevis.org/forum/member.php?u=45744) :
الگوریتمی که توضیح داده‌اید فقط در صورتی جواب می‌دهد که در متن "عدد" استفاده نشده باشد، چون:
مثلاً عدد صفر که کد اسکی آن 48 است، طبق الگوریم شما باید به صورت 24811 ذخیره شود، در صورتی که به صورت 34811 ذخیره می‌شود.
من متوجه شدم که:
اگر عدد یک رقمی باشد، اول رشته کد شده به اندازه طول متن 3 می‌گذارد؛
اگر عدد دو رقمی باشد، اول رشته کد شده به اندازه طول متن 4 می‌گذارد؛
اگر عدد سه رقمی باشد، اول رشته کد شده به اندازه طول متن 5 می‌گذارد؛
اگر عدد چهار رقمی باشد، اول رشته کد شده به اندازه طول متن 6 می‌گذارد؛
اگر عدد پنج رقمی باشد، اول رشته کد شده به اندازه طول متن 2 می‌گذارد؛
اگر عدد شش رقمی باشد، اول رشته کد شده به اندازه طول متن 3 می‌گذارد؛
اگر عدد هفت رقمی باشد، اول رشته کد شده به اندازه طول متن 4 می‌گذارد؛
اگر عدد هشت رقمی باشد، اول رشته کد شده به اندازه طول متن 5 می‌گذارد؛
اگر عدد نه رقمی باشد، اول رشته کد شده به اندازه طول متن 6 می‌گذارد؛
اگر عدد ده رقمی باشد، اول رشته کد شده به اندازه طول متن 2 می‌گذارد؛
اگر ...
با توجه به این موارد، لطفاً نظر خود را بگوئید.
جناب mansour01 (http://www.barnamenevis.org/forum/member.php?u=45744) ، از توجه شما کمال تشکر را دارم.

سلام خدمت شما دوست عزیز
خواهش می کنم دوست من ، خودم هم استفاده میبرم . راستش من میخواستم با ++C کد رو براتون بنویسم که هم تمرین برای خودم شده باشه و هم برای شما . که وسطای کار برق رفت و منم رفتم بیرون تا الآن .
انشالله تا چند ساعت دیگه هم کد شمارو بررسی میکنم و هم الگوریتم رو و در همین پست یا پست دیگه خدمتتون عرض می کنم ، الان که یکم نگاه کردم یه چیزایی به ذهنم اومد . ضمن اینکه حتی در صورتی که این قسمت از الگوریتم هم اشتباه باشه می تونیم با روش دیگه ای جواب رو بدست بیاریم که از نظر محاسباتی کمی طولانی تر هست .
فقط شما یه لطف کنید و مثالهایی که عرض می کنم رو از دیتابیس استخراج کنید . ممنونم


جواد
جواد110
جواد 110 تست
j1a0v1a9d
javad 18 javad
JaVz 0-01//m
1234567898765443454673747
aaaaaaaaaaaaaaaaaaaaaaaaa
...............a
javad جواد

mansour01
جمعه 21 آبان 1389, 02:06 صبح
خب من کد دیکود کردن بر اساس محاسبه طولانی تر رو نوشتم که از ضعف محدودیت کاراکترهای اسکی استفاده میکنه . بدین صورت که فرض می کنیم که کاربر تا مبنای 10 کاراکترهای اسکی تا 31 تای اول رو استفاده نمیکنه و از 32 که همون Space باشه به بعد رو استفاده میکنه .
تابع در صورتی که در ابتدای رشته 1 و 2 رو ببینه 3 رقم از سمت چپ جدا میکنه و چون تمام کاراکترهای دو رقمی ما با اعدادی مساوی و بالای 3 شروع میشن تابع بقیه رو دوتایی جدا میکنه .

از اونجا که شما خودتون ویبی کار می کنید پس مسلما نباید خوندن کد براتون دشوار باشه .
به هر حال من همچنان علاقه دارم که رمز کاراکترهای شناساننده رو کشف کنم ، اما این الگوریتم کار میکنه و مارو به جواب میرسونه ( در 99% موارد ، مگر استفاده کاربر از کدهای خاص ) .

تابع بصورت عمومی در یک ماژول تعریف میشه :


Public Function Decode(intText As String) As String

Dim intPos, intScheme, intLen, intSubLen As Integer
Dim strString As String
If Len(Trim(intText)) < 5 Then GoTo Hell
If Trim(intText) = "" Then GoTo Hell
intPos = Right(intText, 1)
intText = Left(intText, Len(intText) - 1)
intLen = Right(intText, intPos)
intText = Left(intText, Len(intText) - Len(intLen))
intScheme = Left(intText, intLen)
intText = Mid(intText, intLen + 1, Len(intText) - intLen)

For i = 0 To intLen - 1
intPos = 1
Select Case Left(intText, 1)

Case 1 To 2
strString = strString & Chr(Left(intText, 3))
intText = Mid(intText, 4, Len(intText) - 3)
Case Else
strString = strString & Chr(Left(intText, 2))
intText = Mid(intText, 3, Len(intText) - 2)
End Select
Next
Decode = strString
Exit Function
Hell:
MsgBox ("Some Error Happened")
End Function

و توسط کامند ما یا در هر جای برنامه فراخونی میشه :


If IsNumeric(Text1) = False Then MsgBox "Only Numbers Are Acceptable !!!": Exit Sub
Text2 = Decode(Text1.Text)

من تابع رو واسه مطالعه بیشتر برای شما نوشتم و از خطاهای احتمالی و تزئین کردن و چیدمان برنامه نویسیش زیاد بهش اضافه نکردم .

امیدوارم موفق باشید

Javad-2010
جمعه 21 آبان 1389, 09:27 صبح
این الگوریتم کار میکنه و مارو به جواب میرسونه ( در 99% موارد ، مگر استفاده کاربر از کدهای خاص ) .
خیلی ممنون، از تابع استفاده کردم و چندین مورد را تست کردم و جواب داد.

Javad-2010
جمعه 21 آبان 1389, 09:31 صبح
فقط شما یه لطف کنید و مثالهایی که عرض می کنم رو از دیتابیس استخراج کنید .

جواد = 777720423019920741
جواد110 = 444555520423019920749494871
جواد 110 تست = 5554444455552042301992073249494832202211202122
j1a0v1a9d = 76667666710649974811849975710091
javad 18 javad = 76767666676767106971189710032495632106971189710014 2
JaVz 0-01//m = 54444444544474978612232484548494747109122
1234567898765443454673747 = 22222222222222222222222224950515253545556575655545 3525251525352545551555255252
aaaaaaaaaaaaaaaaaaaaaaaaa = 22222222222222222222222229797979797979797979797979 7979797979797979797979797252
...............a = 33333333333333334646464646464646464646464646469716 2
javad جواد = 3333232323106971189710032204230199207102

Javad-2010
شنبه 22 آبان 1389, 06:53 صبح
جناب mansour01 (http://www.barnamenevis.org/forum/member.php?u=45744) ، به نتیجه جدیدی نرسیده‌اید، من بی‌صبرانه منتظر توضیحات خوبتون هستم.

mansour01
شنبه 22 آبان 1389, 22:15 عصر
جناب mansour01 (http://www.barnamenevis.org/forum/member.php?u=45744) ، به نتیجه جدیدی نرسیده‌اید، من بی‌صبرانه منتظر توضیحات خوبتون هستم.

ممنونم دوست عزیز ، شما لطف دارید
خب من سعی کردم الگوریتم این مورد آخر رو هم بدست بیارم ، اما هر فرمولی که بدست میارم باز توسط یه مثال دیگه نقض میشه و از اونجا که مثالها هم بصورت پراکنده بوده و دسترسی به خود برنامه ندارم کمی قضیه گیج کننده میشه .

خب ما دو فرضیه داریم :

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

1_الف. تمام آنچه در مورد فرضیه اول گفته شد ، اما با ذکر این نکته که برنامه بعد از دریافت پسورد اونرو کد میکنه و اونرو صرفا با مقدار کد شده کاربر مقایسه می کنه . به اینصورت که وقتی شما کلمه "جواد" رو به عنوان پسورد وارد میک نید ، برنامه ابتدا این کلمه رو کد میکنه به "777720423019920741" و اونرو با مقداری که در دیتابیسش وجود داره مقایسه می کنه و نه اینکه مقدار موجود در دیتابیس رو برگردونه و اونرو با خود کلمه مقایسه کنه ( این در صورتی درست هست که برنامه ما صرفا از الگوریتم برای چک کردن پسورد استفاده کنه و نه برای رمزنگاری متن ) .

2. اعداد شناساننده ما با قاعده تولید میشن و مورد استفاده برنامه برای رمزگشایی هستند .

* ذکر این نکته هم خالی از لطف نیست که در صورت دیباگ کردن فایل اجرایی برنامه مسلما ما بسیار راحتتر و زودتر از اینها به الگوریتم میرسیدیم ، ولی بشخصه این مبحث رو هم جذاب می دونم .
--------------------
خب فرضیه اول ما در صورتی رد میشه که کاربر قادر باشه تا کدهای مبنای 10 برای 29 تای اول جدول اسکی رو وارد کنه که تا اونجایی که من می دونم اینکار امکان پذیر نیست . اما محض احتیاط شما موردی که خدمتتون عرض می کنم رو تست کنید در ویبی Chr(1) رو شما وارد کنید و مقدار بازگشتیش رو در تکست مربوطه به عنوان ورودی به برنامه بدید ، در صورت ایجاد خطا فرضیه اول قبول میشه ، در صورت رد شدن فرضیه 1_الف و شماره 2 قوت میگیره .

اما برای اینکه فرضیه دوم رو تست کنیم به چند مورد باید توجه داشته باشیم :

ابتدا :

- آیا کاراکترهای شناساننده برای تمام حروف کوچک یکی هستند ؟! ( با توجه به اینکه فقط تا کاراکتر d کد اسکی دو رقمی است )
* تست دو مورد javad و zamyad

- آیا کاراکترهای شناساننده برای تمام حروف بزرگ یکی هستند ؟!
* تست دو مورد JAVAD و ZAMYAD

-آیا کاراکترهای شناساننده برای ترکیبی از حروف کوچک و بزرگ یکی هستند ؟!
* تست دو مورد jAVaD و zAmYad

- آیا کاراکترهای شناساننده برای تمام اعداد یکی هستند ؟!
* تست موارد 1 و 22 و 90 و 0000009

- آیا کاراکترهای شناساننده برای تمام ترکیب های حروف بزرگ و کوچک و اعداد یکی هستند ؟!
* تست دو مورد 100jAvAd و Ja1000DDDDa

- آیا کاراکترهای شناساننده برای تمام حروف فارسی یکی هستند ؟!
* تست دو مورد سامان و ظظمممظظم

- آیا کاراکترهای شناساننده برای ترکیبی از حروف بزرگ و کوچک و اعداد و فارسی یکی هستند ؟!
* تست دو مورد Aش2df و ZنAMYAe34بrD

- آیا کاراکترهای شناساننده با طول رشته پسورد ، تغییر پیدا می کنند ؟!
* تست موارد 123Javad و 123Javadd و 1222Javad444444098899990987978973457438534

-
تست موارد زیر هم کمک میکنه :
جواد
جواد1
1جواد
1جوادA
1جوادBB
1جوادaa
1جوادab
abجواد1

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

Javad-2010
یک شنبه 23 آبان 1389, 11:59 صبح
ذکر این نکته هم خالی از لطف نیست که در صورت دیباگ کردن فایل اجرایی برنامه مسلما ما بسیار راحتتر و زودتر از اینها به الگوریتم میرسیدیم
دوست عزیز؛
من فایل برنامه را توسط یه برنامه Decompile کردم و در رویداد CmdOk_Click فرم ورود یکسری اطلاعات بدست آوردم، ولی راستش ازش سردرنیاوردم، فایلش را میذارم تا شما هم یه بررسی بکنید.
انشاءا... که راهگشا باشه

Javad-2010
یک شنبه 23 آبان 1389, 13:46 عصر
اما محض احتیاط شما موردی که خدمتتون عرض می کنم رو تست کنید در ویبی Chr(1) رو شما وارد کنید و مقدار بازگشتیش رو در تکست مربوطه به عنوان ورودی به برنامه بدید ، در صورت ایجاد خطا فرضیه اول قبول میشه ، در صورت رد شدن فرضیه 1_الف و شماره 2 قوت میگیره
دوست عزیز؛
مقدار بازگشتی Chr(1) را قبول کرد و در دیتابیس به صورت 2111 ذخیره کرد.
بقیه موارد را هم که فرموده‌اید، تست میکنم.

mansour01
یک شنبه 23 آبان 1389, 23:11 عصر
دوست عزیز؛
من فایل برنامه را توسط یه برنامه Decompile کردم و در رویداد CmdOk_Click فرم ورود یکسری اطلاعات بدست آوردم، ولی راستش ازش سردرنیاوردم، فایلش را میذارم تا شما هم یه بررسی بکنید.
انشاءا... که راهگشا باشه
سلام دوست عزیز
من فایل دیکامپایل شده شما ( که فکر می کنم توسط VB Decompiler شده ) رو بررسی می کنم ، فقط متاسفانه عدم دسترسی به Call های داخل کد کمی آزار دهنده هست . امیدوارم بشه با همین قسمت هم به نتیجه رسید .


دوست عزیز؛
مقدار بازگشتی Chr(1) را قبول کرد و در دیتابیس به صورت 2111 ذخیره کرد.
بقیه موارد را هم که فرموده‌اید، تست میکنم.
خب این نشان دهنده این هست که فرضیه شماره 1 ما باطل هست ، در مورد 1_الف که با بررسی کد برنامه میشه مطمئن شد و در مورد فرضیه 2 هم منتظر نتایج شما هستم .
با تشکر

Javad-2010
دوشنبه 24 آبان 1389, 09:45 صبح
فکر می کنم توسط VB Decompiler شده
سلام دوست عزیز؛
بله، درست می‌فرمایید، من با VB Decompiler Pro دیکامپایل کردم. شما اگر برنامه بهتری برای این کار سراغ دارید، لطف کنید و به من معرفی کنید.
خیلی ممنون

Javad-2010
دوشنبه 24 آبان 1389, 09:47 صبح
در مورد فرضیه 2 هم منتظر نتایج شما هستم
دوست عزیز؛
این هم نتایج مواردی که گفته بودید:

Javad-2010
سه شنبه 25 آبان 1389, 12:49 عصر
جناب mansour01 (http://www.barnamenevis.org/forum/member.php?u=45744) ، به نتیجه جدیدی نرسیده‌اید، من بی‌صبرانه منتظر توضیحات خوبتون هستم.
چه خبر جناب mansour01 (http://www.barnamenevis.org/forum/member.php?u=45744) ؟
مارو بی‌خبر نذارید.

mansour01
سه شنبه 25 آبان 1389, 13:02 عصر
چه خبر جناب mansour01 (http://www.barnamenevis.org/forum/member.php?u=45744) ؟
مارو بی‌خبر نذارید.

سلام دوست عزیز
راستش من فکر کردم یک مطلبی رو پست دادم ( و منتظر پاسخ بودم ) که الآن دیدم ندادم ، میخواستم بدونم آیا برنامه همراه با Password نام کاربری هم دریافت میکنه ؟!
آیا اونرو در Table دیگه ای ذخیره میکنه ؟!
آیا با تغییر نام کاربری ، رشته کد شده پسورد ما هم تغییر میکنه !؟
فکر می کنم اگر این موضوع هم حل بشه یک گام دیگه تا بدست آوردن الگوریتم اولیه نزدیکتر شدیم .

Javad-2010
سه شنبه 25 آبان 1389, 13:42 عصر
دوست عزیز سلام؛

میخواستم بدونم آیا برنامه همراه با Password نام کاربری هم دریافت میکنه ؟
بله

آیا اونرو در Table دیگه ای ذخیره میکنه ؟
در دیتابیس سه فیلد برای این کار اختصاص داده شده است، به صورت زیر:
60380

آیا با تغییر نام کاربری ، رشته کد شده پسورد ما هم تغییر میکنه ؟
جواب این مورد را تست میکنم و خدمتتون عرض میکنم.
باز هم از توجه شما کمال تشکر را دارم.

Javad-2010
سه شنبه 25 آبان 1389, 13:55 عصر
آیا با تغییر نام کاربری ، رشته کد شده پسورد ما هم تغییر میکنه ؟
خیر؛

موفق باشید

mansour01
پنج شنبه 27 آبان 1389, 04:41 صبح
خب من دیتابیس رو دوباره کامل بررسی کردم ، و متاسفانه باید بگم هنوز نتونستم الگوریتم اصلی که برنامه نویس از اون استفاده میکنه رو کامل حدس بزنم ، در حقیقت کاراکترهای شناساننده تنها قفلی هست که هنوز برای من باز نشده . البته الگوریتم قبلی رو میشه طوری دستکاری کرد که 100% هم عمل کنه ، حالت کلیش تو ذهنم هست ، فقط وقت و تمرکز کافی میخواد تا بشه پیادش کرد ( بیشتر قسمت تمرکزش مهمه ).

خب تا اینجا من فقط به یه مورد کلی رسیدم و البته تمام حدس های مرتبط با این مورد کلی با مثال های گفته شده نقض میشن :
1. کاراکتر های شناساننده در آخرین مرحله از کد شدن معکوس میشن .
2. کاراکترهای شناساننده برای اعداد 3 رقمی و دو رقمی در دو حالت هستند و حالت سومی وجود نداره .
3. اختلاف بین کاراکترهای شناساننده برای اعداد دو رقمی و سه رقمی همیشه 1 است .
مثال :

{23333} {204 230 199 207 49} {51}در اینجا 51 از آخر سمت راست که مشخصا قبلا توضیح داده شده و اونرو کنار میذاریم .
اما کاراکترهای شناساننده 23333 رو کمی بررسی می کنیم .
خب از اونجایی که ما برای کدهای دسیمال یا مبنای 10 کاراکترهای اسکی خودمون داریم :

204 230 199 207 49برای اعداد 3 رقمی A و برای دو رقمی ها B رو قرار میدیم که نتیجه میدهد :

AAAABاز اونجا که ما 4 عدد A داریم و یک B ، در کاراکترهای شناساننده برای 3 که چهاربار تکرار شده A رو در نظر میگیرم و برای 2 حرف B رو . که نتیجه میدهد :

BAAAAخب نتیجه ها رو که بررسی می کنیم میبینیم که کاراکترهای شناساننده ما در آخرین مرحله از کدینگ معکوس می شوند ( در سایر موارد هم بررسی شده و جواب مثال ما رو تائید میکنه ) .

اما حالا با همین دید که به تمام کد شده ها نگاه می کنیم میبینیم هر جا که اعداد دو رقمی و سه رقمی کنار هم قرار می گیرند برای هر کدام از این دو نوع اعداد صرفا یک رقم شناساننده انتخاب میشه که همیشه عدد بیشتر برای 3 رقمی ها و با یک مقدار کمتر عدد بعدی برای دو رقمی ها بکار میره ( n-1 ) .
مثال :


اگر 3 برای سه رقمی ها پس 2 برای دو رقمی ها
اگر 4 برای سه رقمی ها پس 3 برای دو رقمی ها
و ...
پس وقتی ما رقمی مانند 222332 به عنوان کاراکترهای شناساننده داریم ، نتیجه این میشود که :

XX YYY YYY XX XX XXخب با توجه به نتایج فوق میشه و همانطور که عرض کردم میشه الگوریتمی نوشت که جواب 100% رو به ما برگردونه ، اما برای کد کردن هنوز الگوریتم اصلی بطور کامل به ذهن من خطور نکرده . البته زوج و فرد بودن اعداد رو کمی بررسی کردم ، ولی باز هم نتیجه نگرفتم . شاید از عدم تمرکز باشه ، شما هم بررسی کنید و اگر به نتیجه ای رسیدید که بسیار عالی میشه ، من هم باز بررسی میکنم انشالله به نتیجه برسیم .

موفق باشید

Javad-2010
جمعه 28 آبان 1389, 00:18 صبح
سلام دوست عزیز؛
خیلی ممنون که روی این الگوریتم وقت میذاری تا به نتیجه برسونیش.

شما هم بررسی کنید و اگر به نتیجه ای رسیدید که بسیار عالی میشه
حتماً دوست عزیز

من هم باز بررسی میکنم انشالله به نتیجه برسیم
"دست گلتون درد نکنه"
موفق و پیروز باشید

robat7
شنبه 13 آذر 1389, 16:29 عصر
جواد = 777720423019920741
جواد110 = 444555520423019920749494871
جواد 110 تست = 5554444455552042301992073249494832202211202122
j1a0v1a9d = 76667666710649974811849975710091
javad 18 javad = 76767666676767106971189710032495632106971189710014 2
JaVz 0-01//m = 54444444544474978612232484548494747109122
1234567898765443454673747 = 22222222222222222222222224950515253545556575655545 3525251525352545551555255252
aaaaaaaaaaaaaaaaaaaaaaaaa = 22222222222222222222222229797979797979797979797979 7979797979797979797979797252
...............a = 33333333333333334646464646464646464646464646469716 2
javad جواد = 3333232323106971189710032204230199207102
سلام
راستش من هم یک روش ابداعی برای کد کردن دارم که از آن برای کلمات عبور استفاده می کنم فکر می کردم پیچیده است ولی با خواندن راهنمایی های شما فهمیدم چقدر ساده می شود آن را رمز گشایی نمود. ممنون باید بیشتر روی آن کار کنم