צופן גריין הבסיסי כולל מצב פנימי (state) בגודל 160 סיביות המחולק בין שני אוגרים. אוגר ה-LFSR המיוצג על ידי מערך בגודל 80 סיביות; formula_2 ואוגר NFSR שהוא המערך formula_3. הפולינום המשמש להיזון (feedback) הוא פולינום פרימיטיבי ממעלה 80 המוגדר כ:
פונקציית העדכון של אוגר LFSR היא: formula_5. פולינום ההיזון של NFSR הוא:
מתוך תכולת האוגרים חמישה משתנים מהווים קלט לפונקציה בוליאנית formula_9 שהיא פונקציה מאוזנת בעלת אי-ליניאריות גבוהה ועמידה בפני התנגשויות (correlation) המוגדרת:
כאשר המשתנים formula_11 נלקחים מפוזיציות formula_12, formula_13, formula_14, formula_15 ו-formula_16 לפי סדר זה. המשתנה האחרון נלקח מהאוגר NFSR. פלט הפונקציה הבוליאנית אז עובר מיסוך עם הסיבית formula_17 של אוגר NFSR והתוצאה מהווה חלק מזרם המפתח. בניסוח פורמלי הפונקציה הבוליאנית לעדכון הסיבית הבאה formula_18 כאשר formula_19 הוא הפעימה הנוכחית ניראית כך:
formula_20
הצפנה ופענוח.
כמו בכל צופן זרם, ההצפנה מתבצעת על ידי XOR של המסר עם זרם המפתח סיבית אחר סיבית. לדוגמה:
שלב אתחול.
המפתח המסופק על ידי המשתמש שהוא מחרוזת של 80 סיביות formula_23 נטען לתוך אוגר NFSR. וקטור האתחול formula_24 נטען לתוך 60 הסיביות הראשונות של LFSR וביתר מציבים אחדים. בשלב זה הצופן מופעל 160 פעימות בהן לא משתמשים בפלט כמפתח הצפנה אלא תחת זאת מזינים את הפלט בחזרה על ידי XOR עם הקלט של שני האוגרים (כמתואר בתרשים). לאחר 160 הפעלות (clocking) הצופן מוכן לשימוש.
תפוקה.
בשל העובדה ששני האוגרים מפיקים פלט בכל פעימה, קצב העבודה של הצופן הוא סיבית אחת לכל פעימת שעון. אפשר להגביר את מהירות הצופן עד כדי פקטור של 16 על חשבון תוספת חומרה. השיפור נעשה פשוט על ידי יישום הפונקציות formula_25 פעמים מרובות בכל פעימה. הפונקציות עוצבו כך שניתן יהיה לבצע מספר הזזות ברצף, כך מופקות יותר סיביות בו זמנית.
Grain v1.
לאחר שהתגלו ליקויים בגרסה הראשונה של גריין פותחה הגרסה המעודכנת v1 בשינויים קלים לעומת הקודמת. הפונקציה formula_26 נותרת ללא שינוי. הפונקציה formula_27 שונה והיא מוגדרת כך:
הפונקציה formula_9 נותרת ללא שינוי אך פלט הצופן שהוא הסיבית הפסאודו-רנדומלית הבאה מתעדכנת לפי פרוצדורה שונה:
כאשר: formula_34
Grain 128.
לאחר שהתגלו התקפות כנגד הגרסה המשופרת Grain v1 פותחה בשנת 2006 הגרסה Grain 128 על ידי מרטין הל, תומאס ג'ונסון, אלכסנדר מקסימוב ווילי מאייר. ההתקפות הסתמכו על קירוב ליניארי ולכן בשינויים קלים, בין היתר למשל הוספת משתנים לפונקציית הפלט formula_9 ההתקפות הללו כבר אינן ישימות. הגרסה Grain-128 תומכת במפתח הצפנה בגודל 128 סיביות ווקטור אתחול בגודל 96 סיביות. האוגרים הוגדלו ל-128 מצבים כל אחד כדלהלן:formula_36.
הפונקציות התשנו גם הן כדלהלן:
פונקציית העדכון המתאימה של LFSR היא:
formula_38
פונקציית ההיזון (feedback) האי-ליניארית של NFSR היא:
העדכון של NFSR מתבצע לפי פוזיציות:
מצב (state) הצופן מיוצג על ידי שני האוגרים, בסך הכול 256 סיביות של זיכרון. מתוכם תשע סיביות מפוזיציות שונות מהוות קלט לפונקציית הסינון הבוליאנית כדי להפיק את סיבית הפלט הפסאודו-אקראית כדלהלן:
הפוזיציות המשמשות למשתנים הם: formula_44 לפי סדר זה.
פונקציית הפלט הסופית מוגדרת כדלהלן:
כאשר formula_46.
Grain-128a.
גרסת גריין 128a מורכבת ממחולל זרם המפתח (key stream generator) ומנגנון אימות (authentication) אופציונלי. המחולל מורכב משלושה רכיבים עיקריים, אוגר זיזה ממושב ליניארי (LFSR), אוגר זיזה ממושב לא ליניארי NFSR ופונקציית סינון בוליאנית. שני האוגרים בנויים מ-128 מצבים ומסומנים בקיצור formula_47 וכן formula_48 בהתאמה. ביחד הם מהווים זיכרון של 256 סיביות המייצגות את המצב הפנימי (internal state) של המחולל בכל פעימה. הפולינום הפרימיטיבי המשמש להזנה (feedback) של האוגר LFSR הנקרא formula_26 מוגדר כדלהלן:
פונקציית עדכון המצב (בניגוד לפונקציית ההזנה) של ה-LFSR היא:
פולינום ההזנה האי-ליניארי של האוגר NFSR הנקרא formula_27 הוא:
פונקציית העדכון של ה-NFSR היא:
בניגוד לפולינום ההזנה לעיל, כלל העדכון כולל את הסיבית formula_62 שהיא פלט האוגר LFSR.
פונקציית הסינון הבוליאנית formula_9 מקבלת תשעה מצבים קודמים כפרמטרים, שנים מהם נלקחים מאוגר ה-NFSR והיתר מ-LFSR. הפונקציה מוגדרת כדלהלן:
כאשר המשתנים formula_65 מקבילים לפי הסדר למצבים formula_66. פלט הפונקציה הוא:
כאשר formula_46.
אתחול.
לפני שמייצרים זרם מפתח בר שימוש תחילה יש לאתחל את הצופן באמצעות וקטור האתחול ומפתח ההצפנה הסודי המסופקים על ידי המשתמש. טוענים את סיביות המפתח 128 בסך הכול לאוגר NFSR ווקטור האתחול נטען ל-96 הסיביות הראשונות של אוגר LFSR, וביתר הסיביות שלו למעט האחרונה מציבים '1' והסיבית האחרונה מאופסת. בשלב זה מריצים את הצופן (clocking) בסך הכול 256 פעימות, כאשר במקום להשתמש בזרם המפתח מזינים אותו בחזרה באמצעות XOR עם קלט שני האוגרים בהתאמה.
אופני הפעלה.
צופן Grain-128a ניתן להפעלה בשני אופנים, עם או בלי אימות. אימות מחייב ש-formula_69, אחרת אסור להשתמש בתג האימות. קיום התנאי האמור באחריות היישום המשתמש ועליו לממש מערכת התראה כלשהי במקרה שהתנאי מופר. כאשר formula_69 פלט המחולל נוצר על ידי formula_71. דהיינו רק כל סיבית שנייה נכללת בפלט, למעט 64 הסיביות הראשונות (במקרה זה תפוקת המחולל יורדת בחצי). כאשר 64 הסיביות הראשונות משמשות למנגנון האימות להלן. אם formula_72 פלט המחולל מתקבל פשוט על ידי formula_73. כלומר כל הסיביות נכללות בפלט המחולל. במקרה זה הצופן דומה לגרסה Grain-128.
אימות.
מנגנון האימות של Grain משתמש בחלק מסיביות הפלט כקלט לאוגרים נפרדים בגודל 32 סיביות כל אחד הנקראים 'אוגר הזזה' ו'אקומולטור' (אגרן) והפלט הסופי של האקומולטור משמש כתג אימות. על מנת שתג האימות יהיה בטוח יש לרפד את המסר. אם המסר הוא מחרוזת של formula_74 סיביות, formula_75, מוסיפים את הסיבית '1' בסוף המסר: formula_76. ריפוד זה חיוני להבטחת האימות כך שלמסרים formula_77 ו-formula_78 יהיה תג שונה. כדי לייצר תג אימות מתאים למסר formula_77 מפעילים את שני האוגרים במהלך ההצפנה שלו. תכולת אוגר ההזזה בזמן formula_80 מיוצגת על ידי formula_81. תכולת האקומולטור בזמן formula_80 מיוצגת על ידי formula_83. אוגר ההזזה מאותחל על ידי 32 הסיביות הראשונות formula_84 והאקומולטור על ידי 32 הסיביות הבאות אחריהן formula_85 עבור formula_86. עדכון אוגר ההזזה מתבצע על ידי formula_87. האקומולטור מתעדכן על ידי formula_88. כאשר formula_89. התכולה הסופית של האקומולטור היא תג האימות בגודל 32 סיביות.
תפוקה.
שני האוגרים LFSR ו-NFSR של המחולל מעודכנים באופן קבוע בכל שתי פעימות. היתרון בזה הוא בביצועים ובעמידות כנגד התקפת ערוץ צדדי. היתרון של צופן גריין באופן כללי ישים גם כאן, במחיר של תוספת חומרה אפשר להכפיל ביצועים בהתאם. את השיפור משיגים בעיקר על ידי שמקודדים עותקים של שלוש הפונקציות formula_25 מספר פעמים במעגלים נוספים, כמידת הצורך. מסיבה זו הצופן עוצב כך ש-32 הסיביות האחרונות של האוגרים אינן בשימוש בפונקציות ההזנה או העדכון. בדרך זו ניתן להגיע להאצה בפקטור של עד 32, אם החומרה זמינה. התפוקה במקרה זה תהיה לכל היותר 16 סיביות לפעימת שעון אחת.
ביטחון גריין 128a.
Grain128a הוא התפתחות שלישית בסדרה בעקבות חולשות שהתגלו באלגוריתמים הקודמים. ובגרסה זו ניתן מענה לכל הבעיות שהתגלו בקודמות. קריפטואנליזה של הגרסאות הקודמות כוללת מספר התקפות חלקן מוצלחות יותר חלקן פחות:
ביטחון וביצועים.
Grain הוא למעשה פשרה שנועדה לאפשר יישום מוגבל משאבים ובשל כך ביטחונו וביצועיו מוגבלים בהתאם. ידוע ש-LFSR עם פולינום פרימיטיבי ממעלה formula_93 בעל מחזוריות של לפחות formula_98 סיביות. לטענת המפתחים הצופן עוצב כך שהפעלת כוח גס בניסיון לנחש את המצב הפנימי לא יפחת מ-formula_1 או formula_100 בגרסת 128 ביט, שזה מספק ברמה של חומרה מסוג זה. היות שהצופן פועל ברמת סיביות ולא מילים תפוקתו במצב אופטימלי אינה עולה על 16 סיביות לפעימת שעון אחת שזה נמוך בהשוואה לצפנים שפועלים ברמה של מילים בגודל 32 סיביות למשל שאז בפעימת שעון אחת מופקים לפחות 32 סיביות. לעומת זאת צופן Grain ניתן ליישום במעגל משולב FPGA למשל מסוג אלטרה באמצעות שפת VHDL ביישום רגיל בלא יותר מ-300 שורות קוד כאשר רק 1435 שערים מנוצלים. כמובן שמספר השערים עולה בהתאמה ככל שמאיצים את הצופן כי יישום הזזות מרובות דורש יותר שערים. לטענת המפתחים הצופן עמיד כנגד התקפת קורלציה וכן התקפות אלגבריות על פונקציית הסינון או התקפות קלאסיות אחרות נגד צפני זרם.