בהצעה המקורית נקרא האלגוריתם Poly1305-AES כשהוא פועל בשילוב עם AES. הוא מפיק תג אימות באורך 16 בתים ממסר בכל אורך רצוי, תוך שימוש בשני מפתחות אחד עבור AES ואחד נוסף שניהם באורך 16 בתים (128 סיביות) וכן וקטור אתחול באורך 16 בתים. ביטחון האלגוריתם קרוב מאוד לביטחון צופן AES כאשר ההפרש הוא לכל היותר formula_1 עם מסר באורך של עד formula_2 בתים, בהנחה שהמתקיף רואה לא יותר מ-formula_3 בלוקים מאומתים עם תגי האימות שלהם ורשאי לבצע לכל היותר formula_4 ניסיונות זיוף. במילים אחרות אם AES קשה לשבירה אז Poly1305 בטוח. האלגוריתם מאוד יעיל ונחשב ל'סטייט אוף דה ארט' במונחים של מהירות חישוב. פחות מ-formula_5 מחזורי שעון עבור מסר באורך formula_6 בתים על מחשב אתלון. המפתח פרסם קוד מקור ממוטב לשימוש חופשי ב-C ו-C++. היות שהאלגוריתם מופרד מהצופן ניתן להחליף את AES בצופן אחר מהיר יותר או במידה שיתגלו בעיות אבטחה עם AES. מאוחר יותר בשל שיקולי יעילות נבחר ChaCha כצופן הבסיסי עליו קוד האימות פועל.
ב-2014 בחרה גוגל ב-Poly1305 יחד עם צופן ChaCha כתחליף ל-RC4 ב-TLS/SSL לאבטחת רשת האינטרנט. היישום הראשוני נועד לשיפור אבטחת תקשורת HTTPS בין דפדפני גוגל כרום על מערכות ההפעלה אנדרואיד לבין אתרי גוגל והוא החליף את AES-GCM. לטענת גוגל השילוב החדש מניב שיפור של פי שלושה במהירות לעומת הקודם. ב-2015 קוד אימות Poly1305 יחד עם ChaCha הפכו לתקן רשמי של IETF לאבטחת פרוטוקול TLS בטיוטה . כמו כן שולב גם ב-OpenSSH כאלטרנטיבה להצפנה מאומתת.
היתרונות של קוד אימות המסרים Poly1305 הם:
תיאור.
נוסחת קוד האימות היא בעצם חישוב ישיר של פולינומים מודולו המספר הראשוני formula_7 (מכאן נובע השם), כאשר בתי המסר משמשים כמקדמים. עיקר התיאור מתייחס לריפוד והמרת הקלט ממחרוזת בתים למספרים שלמים באורך הרצוי והכנת המפתחות.
הכנת המסר.
נתון המסר formula_8 באורך formula_6 בתים המיוצג על ידי formula_10 אותו מחלקים לבלוקים בגודל formula_11. אל formula_12 הבלוקים הראשונים (השלמים) של המסר כאשר formula_13 מתייחסים כאל המערך formula_14 המכיל שלמים כך שכל formula_15 מיוצג על ידי הפולינום הבא:
אם formula_6 אינו כפולה של 16 אזי קיימים מספר בתים נוספים שיש להביא בחשבון לכן כוללים פולינום נוסף:
במילים אחרות מרפדים כל בלוק של 16 בתים ל-17 בתים על ידי הוספת בית אחד המכיל '1' בראש הבלוק. אם המסר אינו כפולה של 16 משלימים באפסים נוספים כמידת הצורך כדי לקבל 17 בתים. בכל מקרה מתייחסים לכל בלוק של 17 בתים כאל מספר שלם חיובי לפי סדר בתים קטן.
הכנת מפתחות.
Poly1305 משתמש בשני מפתחות סודיים שצריכים להיות משותפים לשולח והמקבל. המפתח הראשון formula_19 משמש להצפנה עם AES ואילו השני formula_20 מייצג מספר באורך 128 סיביות לפי סדר בתים קטן דהיינו: formula_21. כל formula_22 בגודל בית אחד. וכן חלק מסיביות formula_20 צריכות להיות מאופסות. ארבע הסיביות העליונות (המשמעותיות ביותר) של הבתים formula_24 של formula_20 צריכות להיות מאופסות (כלומר מתקבל בכל אחד מהם בנפרד מספר בטווח formula_26). שתי הסיביות הנמוכות (הכי פחות משמעותיות) של הבתים formula_27 צריכות להיות אפס (כלומר מספר בטווח formula_28). לסיכום ישנם formula_29 אפשרויות עבור formula_20. במילים אחרות formula_20 מורכב מארבעה חלקים באורך 32 סיביות כל אחד:
כאשר
וקטור אתחול.
כל מסר חייב להיות מלווה בוקטור אתחול או ערך חד פעמי כלשהו כמו נומרטור. וקטור האתחול formula_37 הופך קלט לצופן הסימטרי כדי לקבל מחרוזת אקראית באורך 16 בתים.
אימות.
פונקציית האימות היא:
ביתר פירוט, קוד האימות של המסר formula_8 עם הערך החד פעמי formula_37 ועם מפתחות ההצפנה formula_19 ו-formula_20 הוא מחרוזת של 16 בתים לפי סדר בתים קטן המחושבת על ידי:
האסטרטגיה להשגת ביצועים גבוהים כמובטח היא ניצול יכולות המעבד כמו ניצול יחידת הנקודה צפה המאפשר שימוש באוגרים גדולים במיוחד לביצוע פעולות אריתמטיות בסיסיות במהירות גבוהה בנוסף למספר אופטימיזציות הקשורות למעבד ספציפי. מסיבה זו הוצעו מספר גרסאות של קוד המקור המותאמות במיוחד לחומרות נפוצות כמו פנטיום, אתלון, SPARC פאואר פיסי וכדומה. באופן כללי, תחילה מגדירים משתנה מקומי formula_44 ומחשבים עבור כל formula_12 המתאים לבלוק אחד (כאמור לאחר הוספת 1 בראש וריפוד באפסים אם נדרש) את formula_46 ואז מחשבים את formula_47 ומצמצמים מודולו formula_7, חוזרים על תהליך זה עד לחישוב כל הבלוקים של המסר אותו מאמתים, לבסוף מחברים ל-formula_49 שהוא כאמור תוצאה של הצפנת הבלוק formula_37 עם המפתח הסודי formula_19 והתוצאה האחרונה מודולו formula_52 היא תג האימות.
כמובן שהצופן AES כאן אינו מנדטורי וניתן להחליפו בכל צופן אחר כל עוד מתייחסים לפלט הצופן כאל מספר שלם באורך 128 סיביות. השולח והמקבל משתמשים באותה פונקציה הן כדי לחשב את תג האימות והן כדי לוודא שהתג אותנטי. כאשר תג האימות formula_53 מגיע למקבל יחד עם המסר, הוא מחשב בעצמו את הפונקציה האמורה על המסר ומשווה את התוצאות.
ביטחון.
באחריות המשתמש לוודא שהמפתחות formula_19 ו-formula_20 סודיים ואקראיים. ההנחה היא שהם נבחרו באופן בלתי תלוי בהתפלגות אחידה בטווח של formula_52 ו-formula_29 בהתאמה כך שההסתברות הכוללת לכל זוג כזה היא formula_58 מתוך formula_59 אפשרויות.
באחריות המשתמש לוודא שאינו משתמש באותו וקטור אתחול עבור שני מסרים שונים. הדרך הכי קלה ליישם זאת היא על ידי הפעלת מונה כלשהו שמקודם באחד עבור כל מסר. כדי למנוע כשל במקרה של נפילת המחשב ואובדן וקטור האתחול רצוי לאחסן בדיסק יחד עם המפתחות הסודיים וקטור אתחול חדש שטרם השתמשו בו.
קיימת הוכחה ש-Poly1305 מבטיח שהדרך היחידה שמתקיף יוכל לנחש ערכים formula_60 כך שמתקיים formula_61 שונים מאלו שנשלחו על ידי המקור כלומר זיוף תג האימות, היא לשבור את הצופן formula_62. אם המתקיף לא מסוגל לשבור את formula_62 והמקבל מקפיד להיפטר מכל הערכים formula_60 שאינם אותנטיים כלומר formula_65 אז המקבל יכול להיות סמוך ובטוח שקיבל רק מסרים אותנטיים ולא מזויפים. כדי להעריך בכמות את הביטחון האמור, נניח שהמתקיף יכול להשיג עד formula_66 מסרים מאומתים (אותנטיים) ותגי האימות שלהם יחד איתם, וכן נניח שהמתקיף רשאי לבצע לכל היותר formula_4 ניסיונות זיוף של תגי האימות אותם הוא רשאי לשלוח ליעדם ולקבל בחזרה את התגובה האם התג התקבל כאותנטי או נדחה. נניח עוד שההסתברות להצלחת המתקיף בשבירת הצופן formula_62 היא formula_69 כלומר אחרי formula_70 שאילתות בסיכויים של חצי ועוד formula_69 הוא מסוגל להבחין בין פלט הצופן לבין מחרוזת אקראית אמיתית. אם למען הפשטות כל המסרים הם באורך formula_2 הרי שבהסתברות של לפחות
כל ניסיונות הזיוף של המתקיף יתגלו ויידחו על ידי המקבל. ביתר פירוט אם formula_74 הרי שסיכויי המתקיף הם לכל היותר formula_75. אף על פי שאין דרך להוכיח עבור צופן כמו AES למשל ש-formula_69 קטן אולם ברור שהשאיפה העיקרית בכל צופן סימטרי היא להגיע ל-formula_69 נמוך ככל האפשר, כי אחרת המשמעות היא שהמתקיף יוכל לשבור את הצופן. ההוכחה לנכונות הצהרת הביטחון שהובאה מופיעה במאמר של דניאל ברנשטיין.
הסיבה לבחירת המספר הראשוני formula_7 היא בשל המבנה הדליל שלו שמאפשר ביצוע מודולו מהיר גם בתוכנה וגם בחומרה. יש כמה סיבות להוספת formula_20 שנקרא Nonce (ערך חד-פעמי). ראשית ביטחון גבוה יותר, לשם השוואה ביטחון פרוטוקול אימות מסרים ללא תוספת formula_20 הוא מסדר גודל formula_81 במקום formula_82. כאן formula_66 הוא מספר תגי האימות האותנטיים שהמתקיף השיג ו-formula_4 מספר המסרים המזויפים שהמתקיף שלח לבדיקה. הביטחון הולך ונחלש ככל שנוספים מסרים ולכן אינו מומלץ לשימוש ממושך. שנית, באופן זה הפעלת AES נעשית במקביל ולא גורמת לעיכובים. שלישית, מרבית היישומים כוללים Nonce בכל מקרה, מסיבות שונות כמו מניעת שידור חוזר של מסרים. הסיבה למבנה המיוחד של formula_20 נובעת מרצון לפשט ולהאיץ את יישום הפרוטוקול בקוד. אף על פי שתאורטית עדיף לא הגביל את formula_20 ולאפשר ערכים מקסימליים. מצד שני ביטחון הפרוטוקול אינו נחלש במידה ניכרת כתוצאה מהמגבלה, כך שאפשר ליהנות מביצועים טובים יותר.
פסידו קוד.
הפסידו קוד הבא אינו מייצג קוד שימושי ואינו ממוטב אלא נועד לצורך המחשה בלבד. הפונקציה מקבלת את הפרמטרים הבאים: המסר formula_8, מפתח סודי formula_20, הערך formula_49 שהוא תוצאת ההצפנה של formula_37 עם המפתח formula_19 באמצעות האלגוריתם הסימטרי המועדף; formula_92 וכן formula_93 אורך המסר בבתים ומחזירה את תג האימות formula_53. כל הפרמטרים למעט האחרון מתקבלים כמערך בתים אולם עוברים המרה למספר שלם לפי סדר בתים קטן לדוגמה עבור המערך formula_20 הביטוי formula_96 ממיר את הבית ה-formula_97 למספר שלם ומציב אותו במקום המתאים בתוך משתנה באורך 129 סיביות על ידי הזזה לשמאל (shift) שהיא כמו העלאה בחזקת formula_98. יש לזכור שביישום מעשי חייבים להשתמש בספרייה אריתמטית למספרים ארוכים בשפת התכנות המועדפת כמו הספרייה GNU MP ל-C++ כי כאן כל המספרים השלמים גדולים מאוד.
Poly1305(out, r, s, m, l)
j = 0
rbar = h = 0; // big numbers
p = (1 « 130) - 5; // big prime number
// convert the input byte array 'r' into a big number 'rbar'
for j = 0 to 15 do
rbar = rbar + (r[j] « (8 * j));
while(l &gt; 0)
c = 0; // big temporary numbers