Dizzy Doop
New member
הצפנת TEA - לאלו שמבינים בקריפטוגרפיה:
להלן פונקציות ההצפנה והפענוח של TEA ממומשות בשפת C:
להלן פונקציות ההצפנה והפענוח של TEA ממומשות בשפת C:
void encrypt (unsigned long* v, unsigned long* k) { unsigned long v0=v[0], v1=v[1], sum=0, i; //* set up * unsigned long delta=0x9e3779b9; //* a key schedule constant * unsigned long k0=k[0], k1=k[1], k2=k[2], k3=k[3]; //* cache key * for (i=0; i < 32; i++) { //* basic cycle start * sum += delta; v0 += ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1); v1 += ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3); //* end cycle * } v[0]=v0; v[1]=v1; } void decrypt (unsigned long* v, unsigned long* k) { unsigned long v0=v[0], v1=v[1], sum=0xC6EF3720, i; //* set up * unsigned long delta=0x9e3779b9; //* a key schedule constant * unsigned long k0=k[0], k1=k[1], k2=k[2], k3=k[3]; //* cache key * for (i=0; i<32; i++) { //* basic cycle start * v1 -= ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3); v0 -= ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1); sum -= delta; //* end cycle * } v[0]=v0; v[1]=v1; }
אני כותב תוכנית קצרה מאד בסי שאמורה לקרוא קובץ ולהצפין אותו עם אלגוריתם TEA. העתקתי את פונקציות ההצפנה והפענוח מויקיפדיה, רק אין לי שמץ של מושג איך להשתמש בהן (מעולם לא למדתי מדמ"ח ולכן אני לא בקיא במימושן הלוגי ובשימושן). לאחר שכבר קראתי את הקובץ שאותו אני מעוניין להצפין עם fread(...) באופן בינארי, על כל תוכנו, אל תוך משתנה char* בזיכרון ולקחתי מהמשתמש מפתח - מה בעצם אמור להיות השלב הבא? האם אני פשוט אמור לשלוח את המשתנה שמכיל את כל תוכן הקובץ כפרמטר לפונקציה יחד עם המפתח? או שצריך לחלק אותו לבלוקים? העניין של הבלוקים לא כל כך מובן לי: מהו בעצם בלוק? האם מדובר בחלק קטן מהתוכן של המידע שעליו מעוניינים לבצע את ההצפנה? האם התוכנית אמורה בעצם לחלק את תוכן המידע שאותו שאני מעוניין להצפין לחלקים קטנים, ולאחר מכן היא אמורה לעבור חלק-חלק (בלוק-בלוק) ולהפעיל עליו את הפונקציה encrypt? זה נראה קצת מסורבל ולא יעיל מבחינת ביצועים. כאן אני אדגים את השימוש בפונקציות, כפי שניסיתי לעשות.. כאשר v הוא משתנה מסוג char* שמכיל את כל תוכן המידע הבינארי שאותו אני להצפין, ו- k הוא char* שמכיל את תוכן המפתח שהיוזר הקליד בזמן ריצה... זו בכלל הצפנה תקינה כפי שנהוג לעשות בד"כ?for(i = 0; i < size; i+=8) encrypt((unsigned long*) (v+i), (unsigned long*) key);
ועבור הפענוח:for(i = 0; i < size; i+=8) decrypt((unsigned long*) (v+i), (unsigned long*) key);
במידה ולא, אשמח אם מישהו יוכל לשפוך מעט אור על איך אמורה להתבצע החלוקה של המידע לבלוקים בצורה מאורגנת ויעילה יותר... כאשר יש לי קבצים גדולים מדי של כמעל 10 MB, האם כדאי לבצע את החלוקה באמצעות Threadים? כך שכל ההצפנה תתבצע "במכה אחת" במקום לעבור חלק-חלק?