php / המדריך לקידוד מידע / הקריאה למקודד המפתח הציבורי.

שיעור 1


הקריאה למקודד המפתח הציבורי.


לפני שנוכל להפעיל את PHP לקידוד המידע, המידע אמור להגיע מאיפה שהו.
בדוגמא שלנו, נבנה טופס HTML לקבל מידע וסקריפט PHP שיקודד את המדע וישלח את התוצאות לנמען מסוים. המפתח הציבורי של הנמען חייב להיות על מחזיק המפתחות של משתמש PHP בשרת, וחייב להיות מוגדר ברמת trust

כדי להתחיל, פתח את מעבד התמלילים החביב עליך, צור קובץ בשם secret_form.html,והתחל עם תגי HTML הבסיסיים ביותר. אחר כך הגדר כותרת:

<h1>Form to Send Secret Stuff</h1>


כדי ליצור את הטופס, עליך להניח שהחלק השני בתהליך שלו יהיה סקריפט PHP בשם do_sendsecret.php ושהטופס שלך ישתמש בשיטת POST

<FORM method="POST" action="do_sendsecret.php">


שלב הבא צור שתי תיבות טקסט אחד,שיכלו את המידע למשתמש

<p>Your Name:<br>
<INPUT type="text" name="sender_name" size=25></p>
<p>Your E-Mail Address:<br>
<INPUT type="text" name="sender_email" size=25></p>
<p>The Secret Message:<br>
<TEXTAREA name="secret_msg" cols=35 rows =5>
</TEXTAREA></p>rows=5>


לסיום, הוסף את כפתור "שלח הודעה סודית"

<p><INPUT type="submit" value="Send Secret Message"></p>


ובבקשה זכור לסגור את כל התגים! הקוד המלא אמור להראות כך:

<HTML>
<HEAD>
<TITLE>Secret Form</TITLE>
</HEAD>
<BODY>
<h1>Form to Send Secret Stuff</h1>
<FORM method="POST" action="do_sendsecret.php">
<p>Your Name:<br>
<INPUT type="text" name="sender_name" size=25></p>
<p>Your E-Mail Address:<br>
<INPUT type="text" name="sender_email" size=25></p>
<p>The Secret Message:<br>
<TEXTAREA name="secret_msg" cols=35 rows=5>

<p><INPUT type="submit" value="Send Secret Message"></p>
</FORM>
</BODY>
</HTML>


אכסן את דף ה-HTML בשרת מאובטח (SSL). שרת מאובטח מקודד את המידע שעובר בין דפדפן המשתמש והשרת. אם תשתמש באותו קוד בדיוק על שרת לא מאובטח הקוד יעבוד, אבל תפספס את כל הקידוד שלא יעשה. כי אם תשתמש בקוד על שרת לא מאובטח הקידוד יתחיל רק כשקוד הPHP יתחיל לרוץ ולא ברגע שליחת המידע. לעוד מידע הסתכל על הצפנת FAQ : בנושא SSL

אם הטופס יושב על שרת מאובטח, אתה יכול להתקדם בשקט לשלב הבא: יצירת קוד PHP שקורא למקודד. שים לב: הדוגמא כאן נעזרת ב-PGP אבל התהליכים ב-GnuPG זהים כמעט לחלוטין והבדלים יובהרו בסוף הפרק.

פתח את מעבד התמלילים וצור קובץ בשם "do_sendsecret.php".
הדבר הראשון שצריך לעשות הוא להכניס את המידע שהתקבל מהטופס אל תוך משתנה שנקרא msg$.

$msg = "Sender's Full Name:\t$sender_name\n";
$msg .= "Sender's E-Mail:\t$sender_email\n";
$msg .= "Secret Message?\t$secret_msg\n\n";


אחר כך הגדר את משתנה הסביבה PGPPATH, כך שהטופס ידע להשתמש במחזיק המפתחות הנכון. PGPPATH הוא בעצם התיקייה שבתוכה נמצא מחזיק המפתחות של משתמש .PHP

putenv("PGPPATH=/homedir/of/PHP/user/.pgp");


הצעד הבא יוצר קובץ זמני על השרת וכותב בו את כל המידע שנשלח מהטופס. אני משתמשת בשם קובץ שנוצר אוטומטית כדי להימנע מבעיות של כניסות רבות שימחקו את הקובץ. למרות שבמערכת ההפעלה שלי לוקח רק 0.875633 שניות להריץ את הקוד (ולי יש מערכת דפוקה), עדיין עדיף להימנע מבעיות בריצה.

כדי ליצור שם קובץ רנדומלי, אני משתמשת בקוד הזה:

$ tmpToken = md5(uniqid(rand()))


הערך של $tmpToken הופך להיות משהו חסר משמעות כגון: 430eb4c228983845043530c192bd9a4f
צור מספר משתנים שיכילו את הנתיב לקובצי המידע. משתמש הPHP חייב להיות בעל הרשאות כתיבה בספרייה הזו, כך שההמלצה שלי היא להשתמש בספריית הבית של משתמש הPHP- לצורך העניין:

$ plainTxt = "/home/www/" . "$tmpToken" . "data";
$ crypted = "/home/www/" . "/tmpToken" . "pgpdata";


בשלב הבא, פתח קובץ חדש וכתוב אליו את ה cleartext של $msg. לאחר מכן, סגור אותו.

$fp = fopen($plainTxt, "w+");
fputs($fp, $msg);
fclose($fp);


כרגע יש לך קובץ טקסט מוכן לקידוד. הדוגמא שלי משתמשת בפונקצית ()system כדי להפעיל את תוכנית PGP על השרת (אם אינך בטוח היכן ממוקמת התוכנית בשרת, שאל את מנהל הרשת שלך). כדי לקודד את התוכן, PGP צריכה שם משתמש (מקביל למפתח הציבורי במחזיק המפתחות), קובץ קלט, ונתיב ושם קובץ לקובץ הפלט. הדוגמא הזאת מצפינה את הקובץ, תוך שימוש במפתח הציבורי של ג'ולי מלוני: Julie Meloni , שנמצא במחזיק המפתחות על השרת שלי מי שרוצה להצפין לי הודעות כדי לבחון אותי מוזמן: http://www.thickbook.com/comments/tb_pubkey.txt

החלף את שם המשתמש שנמצא על השרת:


system("/usr/local/bin/pgpe -r 'Julie Meloni ' -o $crypted -a $plainTxt");


הפקודה הזו אמורה לפלוט קובץ המכיל את הגרסא המקודדת של המידע שנשלח מהטופס הסודי. השלב הבא הוא לכלול את תוכן הקובץ המקודד בתוך משתנה.
בעוד זמן קצר נשתמש במשתנה הזה כדי לשלוח הודעה לנמען. פתח את המסמך המקודד והעבר את תוכנו אל משתנה שנקרא mail_cont$ וסגור את הקובץ:

$fd = fopen($crypted, "r");
$mail_cont = fread($fd, filesize($crypted));
fclose($fd);


השתמש בפונקצית ()unlik כדי להיפטר מ datafiles

unlink($plainTxt);
unlink($crypted);


לסיום, שלח את ההודעה לנמען המבוקש:

$recipient = "julie@thickbook.com";
$ subject = "Secret Message";
$ mailheaders = "From: My Web Site\n";
$mailheaders .= "Reply-To: $sender_email\n\n";
mail("$recipient", "$subject", $mail_cont, $mailheaders);


לאחר שההודעה נשלחה, שלח אישור למשתמש ע"י הודעת הד. אתה אפילו יכול לכלול את שם השולח, מכיוון שיש לך גישה למשתנה- sender_name$. שליחת הודעת אישור לשולח היא חיונית, מכיוון שישנם בעולם משתמשים רבים שימשיכו ללחוץ על כפתור ה"שלח" פעמים אין ספור ויפוצצו את תא הדואר שלך.

echo "
<H1 align=center>Thank You, $sender_name</h1>
<p align=center>Your secret message has been sent.</p>
";


הסקריפט המלא, בשפת PHP תקינה, שישמש אותך לעלות את PGP, לקידוד ההודעה ושליחתה, יראה כך:

<?
//build the message string
$msg = "Sender's Full Name:\t$sender_name\n";
$msg .= "Sender's E-Mail:\t$sender_email\n";
$msg .= "Secret Message?\t$secret_msg\n\n";
//set the environment variable for PGPPATH
putenv("PGPPATH=/home/www/.pgp");
//generate token for unique filenames
$tmpToken = md5(uniqid(rand()));
//create vars to hold paths and filenames
$plainTxt = "/home/www/" . "$tmpToken" . "data";
$crypted = "/home/www/" . "$tmpToken" . "pgpdata";
//open file and dump in plaintext contents
$fp = fopen($plainTxt, "w+");
fputs($fp, $msg);
fclose($fp);
//invoke PGP to encrypt file contents
system("/usr/local/bin/pgpe -r 'Julie Meloni
' -o $crypted -a $plainTxt"); //open file and read encrypted contents into var
$fd = fopen($crypted, "r");
$mail_cont = fread($fd, filesize($crypted));
fclose($fd);
//delete files!
unlink($plainTxt);
unlink($crypted);
// Build mail message and send it to target recipient.
$recipient = "julie@thickbook.com";
$subject = "Secret Message";
$mailheaders = "From: My Web Site\n";
$mailheaders .= "Reply-To: $sender_email\n\n";
mail("$recipient", "$subject", $mail_cont, $mailheaders);
// Print confirmation to screen.
echo "
<H1 align=center>Thank You, $sender_name</h1>
<p align=center>Your secret message has been sent.</p>
";
?>


הנמען המיועד יקבל הודעה שנראית בערך ככה:

-----BEGIN PGP MESSAGE-----

Version: PGP for Personal Privacy 5.0
MessageID: ruVxzGiwNH9hJMbhAt5mEfUmWtozI3/4

qANQR1DBwk4DJoa8eforpr0QDAC2QHWlBYRTGKepMDcFXqyO1v rXlTh1p7yB0Wo4lqYoZ9FippFCJddmLbZkvBRpEBceODLg+gEf5hrtX l3b5NO7Q6xUyMiPnF/71M9vhdUvhJD/2gPnVZmq5qm0HhrjYLwQv9 +z3sRN70NqohaWMjMR7kTcCAus/eZGS07ZWbyWc8x1c6qWU8Ey /2 5C7D DIw1nqfF62s4WTixx6BCve5m0A4xUXHncWZhDLvC/a47x5C6o v+KpyROl++1aPOfFfZ+38fEZC5+E4IgPVYvxyLRVgDoeJbZ7QlDyxkV Xh6Qe/bTI9CpP5kAb6uxCywgpaecj6P8ABg4ONR6xu0uYC1lG9UhNg KzNyJNpTe5a/SYPx+1jS1q5285v3kF4ptDFQdLML/i4LTx9oE68WksAz VaqBE/zVRmGQaaczf+gxfWjQZGbU4l11TImfpO16vZ21CkbobD6AZO aG0B3a1df4GqQwIK3Jf+hWWnXNQ514DUWzW5puY6VHiEb60cztvds 0/KsHNVZUAQ4VYm4R+Ahyb0M44MS4UpzILbH3HbV9GpvfxeIZ/a UNOOSpJjhn8hzjEALZP1habVZKFJV6sVRtnCadoSV2gSQNQg0kfEY1 vxmbvxBAQRDga6CS8oHaFb45LJo2gVlLhiShDdp2eDR8X4KtUA6M dtO66w56qAy0UWNKKwsqv0UP3jMHvQl1eb0rHWayxMmSfYw69zo 56CjnUWNJN6Rh0y1g54Bl0afAbt2D7FkQwGNPSm7e5HGcMVLocQ/X V5NTUOmX+s2DqvFT4h9/bAoBkxmR8hf2C7elv8AJ4Ya/6D139cogzfD QtCy4Bo07vqz79lXfQYSGmk5f2c4LqvtKPhmDAWmSgUsW

-----END PGP MESSAGE-----


הנמען יוכל אז לפענח את ההודעה בעזרת תוכנת ה-PGP המותקנת אצלו.


למשתמשי GnuPG


אם אתה לא רוצה להשתמש ב-PGP, או נמצא במדינה בה PGP לא עובד, אתה תמיד יכול להשתמש בתוכנת החינם GnuPG, השינויים שעליך לעשות בקוד הם:

הגדרת משתנה הסביבה:


putenv("GNUPGHOME=/home/www/.gnupg");
Substitute the system() call:
system("/path/to/gpg --encrypt -ao $crypted -r 'Julie Meloni ' $plainTxt");


ההודעה המקודדת תיראה כך:

-----BEGIN PGP MESSAGE---------

Version: GnuPG v1.0.1a (MingW32)
Comment: For info see http://www.gnupg.org

hQIOA7hAqKZWjd30EAf8D4xjHG+QUt9RIbE1VEKCyl6iNm hoh7laR2HkFWitRWnZMPwyZ6AqJKXLqzorKcRaA8TEifRC/Ec 7ZmPqShByH0KBrsUGc95dX6YVLikJ70fS81bwwjvbd4273u9M WVK8NvaJuEFvdEob4vBzkkh8Dsbw4s03jKdpAaBTC9gPyycf hBypw/blnkHJOeNE1n+caW1itY385PsR9HmmzlY8kCK4LC+dZ EgxwdlCwqROLB4Fzm8RSKmC4gxL5Dd3UiuJFwjWjO+gH3dAu EXsbI5k70c29v/P8+vyoeV51jmJTDHoloBGV42bJBnELBwTmaeD fC9RM32LrPOnd/R8XfQtX52rOnnTFw2uIuMZzXDmjmWVc0UI 3/Xul8k6nB+i6kIfHYtT+gJPTEEz53y/f1YZ7yN9l969np1z8Z6TqL wruI3FGx33u/gZhCy/iPTMVpDKfjNPTA9mGTabnl2YkifPjPcpCaU D86UBRh19VjXP4+5W

-----END PGP MESSAGE-----


זהו זה.
זה היה עולם שלם של קידוד מקופל לתוך קליפת אגוז.
בשיעור הבא נתקדם אל דוגמאות אמיתיות של קידוד חד צדדי.



עמוד הבא: שעור 2 - קידוד חד צדדי ו HASH >>




הקדמה
שעור 1
הקדמה
צופן המבוסס על מפתחות
פרטיים וציבוריים

מתחילים עם PGP
מתחילים עם GnuPG
הקריאה למקודד המפתח
הציבורי >
שעור 2
קידוד חד צדדי ו HASH
השמוש בפונקצית ()crypt
שמוש בספרית mcrypt