
حان الوقت لشرح كيفية عمل محطة التشفير على أساس
معايير المفتاح العام ، يعمل
cryptoarmpkcs على أحد المنصات المحمولة ، وهي Android.
يتمثل المفهوم الذي تم وضعه أثناء تطوير الأداة المساعدة cryptoarmpkcs في أنه يجب على المستخدم تجربة الحد الأدنى من الإزعاج عند إنشاء توقيع إلكتروني والتحقق منه. هذا هو السبب في أننا نقترح استخدام الرموز المشفرة
PKCS # 11 و / أو
PKCS # 12 حاويات آمنة كوسيلة رئيسية لشهادة شخصية. يجب أن أقول إن استخدام PKCS # 12 في كثير من الحالات هو الوحيد الممكن تقريبًا ، على سبيل المثال ، عندما تكون الرموز PKCS # 11 غير مدعومة لأنظمة تشغيل معينة.
لذلك قررنا بدء نقل أداة cryptoarmpkcs إلى نظام Android بدعم من الحاويات PKCS # 12 الآمنة.
على الفور ، نلاحظ أنه نظرًا لأن المشروع قد تم على منصات C و Tcl / Tk ، فإن النقل لم يسبب أي صعوبات أساسية. تم تحقيق ذلك بفضل تقنية
Androwish . لم تكن هناك مشكلات في نشر البيئة وإعدادها (بيئة العمل الخاصة بي هي Linux - Mageia-7.0). سأعطيك نصًا واحدًا فقط لنشر أدوات سطر أوامر Android (sdk-tools-linux-xxxx.zip):
#!/bin/sh if [ $# -ne 1 ] then echo "./InstallAndroidSDK.sh <sdk-tools-linux-xxxxxxxx.zip>" echo " 1" exit 1 fi if [ ! -f $1 ] then echo "./InstallAndroidSDK.sh <sdk-tools-linux-xxxxxxxx.zip>" echo " $1 " exit 1 fi # SDK-TOOLS tools #unzip sdk-tools-linux-4333796.zip unzip $1 # android-sdk-linux mkdir android-sdk-linux # tools android-sdk-linux mv tools android-sdk-linux cd android-sdk-linux/tools/bin ./sdkmanager "platform-tools" "platforms;android-29"
الشيء الأكثر بروزًا هو أن بيئة Androwish تشتمل على مترجمين فوريين ، وهما undrowish-xxx و vanillawish-xxx ، وهما متطابقان تمامًا في التكوين لـ "balalaika" (الحزم) التي تعد في الواقع جزءًا من Androwish. الفرق بين undrowish و vanillawish هو أنه في vanillawish تعتمد الواجهة الخلفية على SDL / AGG / freetype:

يسمح لك وجود هاتين الأدوات المساعدة بتطوير تطبيق دون استخدام Android نفسه ومحاكيه مع أقصى قدر من التقريب للجهاز الحقيقي. بادئ ذي بدء ، بالطبع ، undroidwish-xxx.
تم تصميم حزمة Android المخصصة نفسها في بيئة AWSDK. يجب نقل شجرة المشروع الخاص بك والمجلد ~ / AWSDK / الأصول / التطبيق. في هذه الحالة ، يجب إعادة تسمية الوحدة الرئيسية لمشروعك إلى main.tcl. إذا كنت تستخدم balalaikas إضافية مع مكتبات ديناميكية ، فيجب وضع المكتبات في المجلدات ~ / AWSDK / libs / x86 للمضاهاة و ~ / AWSDK / libs / armeabi للجهاز الحقيقي.
بعد ذلك ، فقط قم بتشغيل الأمر:
$wish ~/AWSDK/tools/bones
واتبع توجيهاتها:

ستكون حزمة apk المجمعة في مجلد ~ / AWSDK / build / outputs / apk.
إذا كان لديك جهاز حقيقي أو محاكي متصل ، فيمكنك تثبيت الحزمة على الفور.
في هذه الحالة ، يجب أن يكون الجهاز الحقيقي في وضع التصحيح.
لكن العودة إلى التطبيق نفسه. ما كان يجب تغييره في ذلك.
بطبيعة الحال ، أولاً وقبل كل شيء ، ترتبط التغييرات بحجم الشاشة. اضطررت إلى إعادة تصميم الرئيسي (نافذة البداية). نتيجة لذلك ، بدلاً من نافذة واحدة على جهاز كمبيوتر عادي:

ظهرت ثلاث نوافذ على نظام Android:

النافذة الأولى إعلامية. تقليديا ، يتم تقسيمها إلى عدة أجزاء. الجزء الأول ، الموجود في الأعلى ، يحتوي على اسم الأداة المساعدة وشعارها.
بعد ذلك يأتي شعار الشركة المصنعة ومساعدة المعلومات وثلاثة أزرار تكمل الصفحة.
تتم كتابة الصفحة باستخدام مكون قماش. يوجد نوعان من الأزرار على الصفحة: أحدهما على شكل مستطيل شفاف (وسط) ، والآخران على شكل مستطيل دائري. لإنشاء أزرار بزوايا مستديرة ،
تم استخدام tkpath "
balalaika ". شخصيا ، جعلت هذا balalaika انطباعا جيدا للغاية بالنسبة لي. بطبيعة الحال ، عند العمل مع قماش ، فإن نصيب الأسد من الكود هو هندسة. التالي هو البرنامج النصي create_titul_page.tcl لإنشاء الصفحة الأولى من التطبيق. يمكن للجميع تعديله ليناسب رؤيتهم.
البرنامج النصي create_titul_page.tcl package require Tk package require tkpath 0.3.0 global mydir set mydir [file dirname [info script]]
لتنفيذ هذا البرنامج النصي ، استخدم إحدى الأدوات المساعدة undroidwish أو vanillawish:
$ /usr/local/bin64/undroidwish-e5dc71ed9d-linux64 create_titul_page.tcl
أو
$/usr/local/bin64/vanillawish-e5dc71ed9d-linux64 create_titul_page.tcl
تظهر النتيجة في لقطة الشاشة الأولى.
تسرد الصفحة الثانية الوظائف التي تدعمها الأداة المساعدة cryptoarmpkcs-A. كل سطر زر ، عند النقر عليه ، سيتم عرض صفحة وظيفية. يتم تحديد هندسة الأزرار في هذه الصفحة حسب الخط المستخدم. فيما يلي البرنامج النصي create_page_functions.tcl لإنشاء الصفحة الثانية / الوظيفية للتطبيق. يمكن للجميع أيضًا تعديله لوظائفهم.
البرنامج النصي create_page_functions.tcl package require Tk package require tkpath 0.3.0 global mydir set mydir [file dirname [info script]] #/ ( - ) proc scaleImage {im xfactor {yfactor 0}} { set mode -subsample if {$xfactor>=0 && $yfactor>=0} { set mode -zoom } else { set xfactor [expr $xfactor * -1] } if {$yfactor == 0} {set yfactor $xfactor} set t [image create photo] $t copy $im $im blank $im copy $t -shrink $mode $xfactor $yfactor image delete $t } proc createtile {w backg} { image create photo tiled tiled copy $backg -to 0 0 $::scrwidth $::scrheight -shrink $backg copy tiled image delete tiled # $w create image 0 0 \ -image $backg \ -anchor nw } proc butCliked {num fr} { pack forget .fr1 set ::tekFrfunc $fr pack $fr -side top -anchor center -expand 1 -fill both -side top -padx 0 -pady 0 tk_dialog .dialog1 "Dear user:" "Button $num was clicked\nFr=$fr" info 0 OK } proc butImg {img} { tk_messageBox -title "" -icon info -message " =$img" -detail "::screenwidth=$::scrwidth\n::screenheight=$::scrheight" -parent . if {$img == "exit"} { set answer [tk_dialog .dialog2 " " " \n ?" question 0 "" "" ] if {$answer == 0} { exit } } } proc butReturn {} { pack forget $::tekFrfunc pack .fr1 -side top -anchor center -expand 1 -fill both -side top -padx 0 -pady 0 # tk_dialog .dialog1 "Dear user:" "Button $num was clicked\nFr=$fr" info 0 OK } proc page_func {fr tile titul functions} { # upvar $functions but # if {$::typetlf} { set feFONT_button "-family {Roboto} -size 9 -weight bold -slant roman" set widl 10 } else { set feFONT_button "-family {Arial} -size 12 -weight bold -slant roman" set widl 5 } catch {font delete fontTEMP_drawer} eval font create fontTEMP_drawer $feFONT_button # set drawerCNT 0 set strMaxWidthPx 15 set Ndrawers [expr {[array size but] - 1}] while { $drawerCNT <= $Ndrawers } { set strWidthPx [font measure fontTEMP_drawer "$but($drawerCNT)"] if { $strWidthPx > $strMaxWidthPx } { set strMaxWidthPx $strWidthPx } incr drawerCNT } set drawerWidthPx [expr $strMaxWidthPx + 10] set xxx [expr {($::::scrwidth - $drawerWidthPx) / 2}] if {$fr != ".fr1"} { set hret [expr $::scrheight / 4] } else { set hret $::scrheight } set hret [expr $::scrheight / 4] tkp::canvas $fr.can -borderwidth 0 -height $hret -width $::scrwidth -relief flat # createtile "$fr.can" $tile pack $fr.can -anchor center -expand 1 -fill both -side top -padx 0 -pady 0 if {$titul != "" } { set allfunc $titul catch {font delete fontTEMP_titul} set font_titul "-family {Roboto Condensed Medium} -size 15" eval font create fontTEMP_titul $font_titul set funcWidthPx [font measure fontTEMP_titul "$allfunc"] set dlx [expr {($::::scrwidth - $funcWidthPx) / 2}] $fr.can create text [expr $dlx + 6] [expr {6 + 6}] -anchor nw -text "$allfunc" -fill black -font fontTEMP_titul $fr.can create text $dlx 6 -anchor nw -text "$allfunc" -fill white -font fontTEMP_titul -tag id_text0 set blogo [$fr.can bbox id_text0] set boxbut [expr ([lindex $blogo 3] + 6 + 6)] } else { set boxbut [expr 6 + 6] } # #. # set BDwidth_canvas 0 set maxTextHeightPx [font metrics fontTEMP_drawer -linespace] set maxTextHeightPx [expr {$maxTextHeightPx + ( $maxTextHeightPx / 2)}] set drawerHeightPx $maxTextHeightPx set xLocTextPx [expr {($::::scrwidth - $drawerWidthPx) / 2}] set yLocTextPx [expr $BDwidth_canvas + ($drawerHeightPx / 2) + $boxbut] set canvasHeightPx [expr $Ndrawers * $drawerHeightPx] set drawerCNT 0 set Ndrawers [expr {[array size but] - 1}] while { $drawerCNT <= $Ndrawers } { set yLineLocPx [ expr (( $drawerCNT ) * $drawerHeightPx + $boxbut)] # $fr.can create line \ $xLocTextPx $yLineLocPx \ [expr $drawerWidthPx + $xLocTextPx] $yLineLocPx \ -fill "#a0a0a0" -width $widl $fr.can create text [expr $xLocTextPx + 5] $yLocTextPx \ -anchor w \ -font fontTEMP_drawer \ -text "$but($drawerCNT)" \ -tag textlineTag($drawerCNT) if {$drawerCNT == 0} { if {$fr == ".fr1"} { $fr.can bind textlineTag($drawerCNT) <ButtonRelease-1> {butImg "but1"} } else { $fr.can bind textlineTag($drawerCNT) <ButtonRelease-1> {butReturn} } } else { frame .fn$drawerCNT -background white -relief flat -pady 0 -padx 0 set titul $but($drawerCNT) set cmd "$fr.can bind textlineTag($drawerCNT) <ButtonRelease-1> {butCliked $drawerCNT .fn$drawerCNT}" set cmd [subst "$cmd"] eval $cmd set but1(0) " " page_func ".fn$drawerCNT" voda "$titul" "but1" } incr drawerCNT set yLocTextPx [ expr $yLocTextPx + $drawerHeightPx] # if { $drawerCNT > $Ndrawers } { set yLineLocPx [ expr (( $drawerCNT ) * $drawerHeightPx + $boxbut)] $fr.can create line $xLocTextPx $yLineLocPx \ [expr $drawerWidthPx + $xLocTextPx] $yLineLocPx \ -fill "#a0a0a0" -width $widl } } } # # set ::scrwidth [winfo screenwidth .] set ::scrheight [winfo screenheight .] set ::typetlf 0 #, if {$::scrwidth < $::scrheight} { set ::typetlf 1 } set ::padls 20 set ::padlx 15 set ::padly 15 if {$::typetlf} { wm attributes . -fullscreen 1 # scaleImage logo_product 2 set ::padls 50 set ::padlx 75 set ::padly 50 } else { # set ::scrwidth 370 set ::scrheight 700 wm minsize . $::scrwidth $::scrheight set geometr $::scrwidth append geometr "x" append geometr $::scrheight append geometr "+0+0" wm geometry . $geometr } # image create photo voda -file [file join $mydir "imageme" "voda_400x800.png"] # image create photo logo_product -file [file join $mydir "imageme" "validcertkey_51x24.png"] # set name_product "CryptoArmPKCS-A" label .labtitul -image logo_product -compound left -fg snow -text $name_product -font {Arial 10 bold} -anchor w -width [winfo screenwidth .] -pady $::padls -padx 10 -bg #222222 pack .labtitul -anchor nw -expand 0 -fill x -side top -padx 1 -pady 0 # set i 1 ttk::frame .fr$i -pad 0 -padding 0 # set but(0) " " set but(1) " " set but(2) " (PKCS7)" set but(3) " " set but(4) " /" set but(5) " " set but(6) " ASN1-" set but(7) " " set but(8) " PKCS12/PFX" set but(9) " " set but(10) " /" set but(11) " " set but(12) " " if {$::typetlf} { scaleImage voda 3 2 } # page_func ".fr$i" voda "" "but" # pack .fr$i -side top -anchor center -expand 1 -fill both -side top -padx 0 -pady 0
يعد هذا البرنامج النصي أيضًا فراغات لكل زر وظيفة:

تمتلئ الفراغات مع الحاجيات الكلاسيكية والموضوعية (labelframe ، زر ، وما إلى ذلك). يمكن رؤية إحدى هذه اللوحات المملوءة في أول لقطة شاشة على اليمين. نظرًا لأننا ركزنا في المرحلة الأولى على العمل مع حاوية PKCS # 12 ، فقد تم استخدام الكود تقريبًا بدون تغييرات cryptoarmpkcs-A. في هذه المرحلة ، يتم تنفيذ الوظائف التالية:
- توقيع المستند (Cades-BES ، CAdes-T ، CAdes-XLT1) ؛
- نحن نعمل مع ES (PKCS7) ، بما في ذلك إضافة علامة ؛
- عرض الشهادات / طلبات الشهادة:

- نحن نعمل مع PKCS12 / PFX ؛
- حول المنفعة / التوزيعات:

ترتبط الوظائف الأخرى بدرجة أكبر بـ PKCS # 11. يتم تأجيل نقلها إلى السنة الجديدة. من المخطط توصيل رمز مميز للبرنامج والاتصال
بسحابة من الرموز المميزة .
من وجهة نظر الوظيفة ، يشبه كل شيء تقريبًا الأداة المساعدة cryptoarmpkcs. ولكن هناك بعض الاختلافات. على سبيل المثال ، بعد التوقيع على وثيقة ، تسأل الأداة عما إذا كان سيتم التحقق من التوقيع على الموقع الإلكتروني لخدمات الدولة:
عند النقر فوق "نعم" ، سيتم تحميل متصفح بصفحة للتحقق من توقيع المستندات والشهادات. قم بإجراء حجز على الفور بأن هذه الصفحة ليست مصممة جدًا لشاشة الهاتف الذكي. سيكون هذا ملحوظًا عند اختيار التوقيع ، وإذا كان التوقيع غير مفصول ، يكون الملف مع المستند. ولكن إذا كان كل شيء على ما يرام ، فسنحصل على نتيجة إيجابية:

يجب أن يؤخذ في الاعتبار أن التحقق من كل من التوقيع والشهادة على موقع خدمة الدولة يتم غسله فقط إذا تم الحصول على الشهادة في أحد مراكز الشهادات المعتمدة (
CA ). وإلا ، فإن التوقيع سيكون دائمًا غير صالح.
للاتصال بالمتصفح ، اضطررت إلى إضافة سطرين إلى إجراء openUrl:
proc openURL {url} { global typesys global macos # global windowsOS #, Android if {$::typetlf} { # borg activity android.intent.action.VIEW $url text/html return } . . . }
يتم استدعاء متصفح Android على النحو التالي:
borg activity android.intent.action.VIEW <URL> text/html
ميزة صغيرة هي عند إضافة موقع جديد على وثيقة موقعة سابقا. يجب تحديد شهادة الموقِّع الجديد (أو بالأحرى ، حتى حاوية PKCS # 12 مع الشهادة والمفتاح الخاص) مسبقًا في صفحة "توقيع مستند" أو "العمل مع PKCS12 / PFX" ، التي ستذكرك الأداة المساعدة بها:
مع العمليات الطويلة الأجل ، ستستمر الساعة كما كان من قبل:
يبقى أن نقول أين يمكن تنزيل التوزيعات والتهاني في العام الجديد القادم ونتمنى للجميع كل التوفيق لعام 2020!

لذلك ، توزيعات Linux و OS X و Windows و Android: