2013-10-31 7 views
12

मैं पूरी डिस्क एन्क्रिप्शन के साथ एक हेडलेस लिनक्स (डेबियन व्हीजी) पीसी स्थापित करना चाहता हूं, डिस्क को अनलॉक करने की क्षमता या तो यूएसबी ड्राइव के साथ, या कीबोर्ड द्वारा पासफ्रेज दर्ज करके। मेरा प्रारंभिक बिंदु डेबियन इंस्टालर में मूल पूर्ण डिस्क एन्क्रिप्शन विकल्प का उपयोग करके एक ताजा इंस्टॉल है, जो LUKS-एन्क्रिप्टेड लॉजिकल वॉल्यूम समूह के रूप में/boot के अलावा सबकुछ प्रबंधित करता है और मुझे कीबोर्ड विकल्प देता है। मैं अपने वर्तमान समाधान का उत्तर में जवाब दूंगा, उम्मीद है कि यह उपयोगी होगा और अन्य इसमें सुधार कर सकते हैं।यूएसबी से LUKS पासफ्रेज कैसे लोड करें, कीबोर्ड पर वापस गिरना?

  • किसी पासफ़्रेज़ की स्थापना और यूएसबी ड्राइव पर डालने:

    यहाँ मुद्दों मैं था से कुछ हैं।

  • समय में यूएसबी मॉड्यूल लोड हो रहा है।

  • यूएसबी ड्राइव को पढ़ने से पहले लिनक्स द्वारा मान्यता प्राप्त करने की प्रतीक्षा कर रहा है।

  • सही यूएसबी ड्राइव की पहचान करना (कुछ अन्य ड्राइव जो सम्मिलित नहीं होते हैं)।

  • यूएसबी ड्राइव से पासफ्रेज खींचने के लिए "कीस्क्रिप्ट" लिखना।

  • यह सुनिश्चित करना कि सभी यूएसबी विफलता मामलों में कीबोर्ड के पतन-बैक में शामिल हो।

मैं योगदान प्रदान करने वाले महत्वपूर्ण सुधारों और अपवित्र उत्तरों के साथ एक उत्तर स्वीकार करूंगा।

उत्तर

17

मेरा बहुत सारे समाधान पोस्ट से लिया गया है, Using A USB Key For The LUKS Passphrase

dd if=/dev/urandom bs=1 count=256 > passphrase 
  • एक यूएसबी ड्राइव सम्मिलित करें:

    1. एक यादृच्छिक पासफ्रेज़ बनाएं। dmesg आउटपुट डिवाइस का नाम दिखाएगा; /dev/sdd मान लें।

      blockdev --getsize64 /dev/sdd 
      
    2. मैं इसे यूएसबी ड्राइव के किसी भी आकस्मिक उपयोग जीवित रह सकता है लगाना कच्चे डिवाइस के अंत में पदबंध स्थापित करने का फैसला किया,: इसके आकार यह पता लगाने।

      dd if=passphrase of=/dev/sdd bs=1 seek=<size-256> 
      
    3. LUKS मात्रा करने के लिए पासफ़्रेज़ जोड़ें:

      cryptsetup luksAddKey /dev/sda5 passphrase 
      

      यह इंस्टॉलर से मौजूदा हाथ से प्रवेश किया पदबंध को प्रभावित नहीं करता। पदबंध फ़ाइल हटा जा सकता है:

      rm passphrase 
      
    4. यूएसबी स्टिक लिए एक अनूठा नाम का पता लगाएं, इसलिए जब वर्तमान हम इसे पहचान कर सकते हैं:

      ls -l /dev/disk/by-id | grep -w sdd 
      

      आप एक सिमलिंक देखना चाहिए। मैं इसे /dev/disk/by-id/<ID> कहूंगा।

    5. /etc/crypttab संपादित करें।करने के लिए इसे संशोधित

      sdc5_crypt UUID=b9570e0f-3bd3-40b0-801f-ee20ac460207 none luks 
      

      :: आप की तरह एक लाइन देखना चाहिए

      sdc5_crypt UUID=b9570e0f-3bd3-40b0-801f-ee20ac460207 /dev/disk/by-id/<ID> luks,keyscript=/bin/passphrase-from-usb 
      
    6. keyscript ऊपर यूएसबी डिवाइस से पदबंध को पढ़ने के लिए की आवश्यकता होगी करने के लिए भेजा। हालांकि, इसे उससे अधिक करने की जरूरत है। यह समझने के लिए कि इसका उपयोग कैसे किया जाता है, रूट डिवाइस को अनलॉक करने के लिए बूट समय पर चलने वाली स्क्रिप्ट /usr/share/initramfs-tools/scripts/local-top/cryptroot देखें। ध्यान दें कि keyscript सेट होने पर, यह बस चलाया जाता है और आउटपुट को luksOpen पर कोई अन्य जांच के साथ पाइप किया जाता है। त्रुटि को इंगित करने का कोई तरीका नहीं है (यूएसबी ड्राइव मौजूद नहीं है) या कीबोर्ड इनपुट पर वापस आना। यदि पासफ्रेज विफल हो जाता है, तो कुंजीपटल को लूप में फिर से चलाया जाता है, कुछ बार तक; हालांकि हमें नहीं बताया जाता है कि हम किस पुनरावृत्ति पर हैं। इसके अलावा, जब कुंजीपटल चलाया जाता है, तो हमारे पास कोई नियंत्रण नहीं होता है, इसलिए हम यह सुनिश्चित नहीं कर सकते कि लिनक्स ने यूएसबी ड्राइव को पहचाना है। यूएसबी ड्राइव पर

      1. पोल और 3 सेकंड प्रतीक्षा यह प्रकट करने के लिए के लिए:

        मैं कुछ हैक्स के साथ इस को संबोधित किया। यह मेरे लिए काम करता है, लेकिन मुझे एक बेहतर तरीका जानना अच्छा लगेगा।

      2. पहली बार चलाने के लिए एक डमी फ़ाइल /passphrase-from-usb-tried बनाएं ताकि यह इंगित किया जा सके कि हम कम से कम एक बार चल रहे हैं।

      3. यदि हम कम से कम एक बार चलाए जाते हैं, या यूएसबी ड्राइव नहीं मिल पाती है, तो askpass प्रोग्राम को cryptroot द्वारा कीबोर्ड इनपुट के लिए उपयोग किया जाता है।

      अंतिम स्क्रिप्ट:

      #!/bin/sh 
      
      set -e 
      
      if ! [ -e /passphrase-from-usb-tried ]; then 
          touch /passphrase-from-usb-tried 
          if ! [ -e "$CRYPTTAB_KEY" ]; then 
           echo "Waiting for USB stick to be recognized..." >&2 
           sleep 3 
          fi 
          if [ -e "$CRYPTTAB_KEY" ]; then 
           echo "Unlocking the disk $CRYPTTAB_SOURCE ($CRYPTTAB_NAME) from USB key" >&2 
           dd if="$CRYPTTAB_KEY" bs=1 skip=129498880 count=256 2>/dev/null 
           exit 
          else 
           echo "Can't find $CRYPTTAB_KEY; USB stick not present?" >&2 
          fi 
      fi 
      
      /lib/cryptsetup/askpass "Unlocking the disk $CRYPTTAB_SOURCE ($CRYPTTAB_NAME)\nEnter passphrase: " 
      

      अंत में, हम यह सुनिश्चित करें कि इस स्क्रिप्ट initramfs में उपलब्ध है की जरूरत है। बनाएं /etc/initramfs-tools/hooks/passphrase-from-usb युक्त

      #!/bin/sh 
      
      PREREQ="" 
      
      prereqs() { 
           echo "$PREREQ" 
      } 
      
      case "$1" in 
           prereqs) 
             prereqs 
             exit 0 
           ;; 
      esac 
      
      . "${CONFDIR}/initramfs.conf" 
      . /usr/share/initramfs-tools/hook-functions 
      
      copy_exec /bin/passphrase-from-usb /bin 
      
    7. USB ड्राइवरों मेरी initramfs में मौजूद नहीं थे। (ऐसा लगता है कि वे डेबियन के बाद के संस्करणों में डिफ़ॉल्ट रूप से कर रहे हैं।) मैं उन्हें /etc/initramfs-tools/modules को जोड़कर जोड़ने के लिए किया था: जब सब किया जाता है

      uhci_hcd 
      ehci_hcd 
      usb_storage 
      
    8. , अद्यतन initramfs:

      update-initramfs -u 
      
  • +3

    धन्यवाद यह शायद कुछ समय में से एक है यह यू के लायक है '/ dev/random random 'पर'/dev/random' गाएं। –

    +0

    @ सैमुएल एडविनवार्ड - क्रिप्टैब मैन पेज से: '... /dev/random का उपयोग कर बूट पूर्ण होने से रोका जा सकता है अगर सिस्टम में वास्तव में यादृच्छिक एन्क्रिप्शन कुंजी उत्पन्न करने के लिए पर्याप्त एन्ट्रॉपी नहीं है।' हालांकि/dev/random का उपयोग करना अतिरिक्त सुरक्षा के लिए उस समस्या के लायक हो सकता है। – Rondo

    +1

    @Rondo, मुझे लगता है कि वाक्य प्रत्येक बूट समय में एक नई यादृच्छिक कुंजी उत्पन्न करने के बारे में बात कर रहा है। इस मामले में बूट समय से पहले एक बार उत्पन्न किया जा रहा है ताकि यह कोई समस्या न हो। सबसे खराब स्थिति जब तक कुंजी पूरी नहीं हो जाती है तब तक उपयोगकर्ता अधिक एन्ट्रॉपी उत्पन्न कर सकता है। –

    3

    यह मेरे लिए आदर्श होगा यदि मेरे पास बस एक छोटी यूएसबी स्टिक हो सकती है जिसमें पासफ्रेज होता है जो डिस्क अनलॉक करेगा। न केवल सर्वरों के लिए आसान होगा (जहां आप सर्वर में यूएसबी स्टिक छोड़ सकते हैं - लक्ष्य गोपनीय डेटा के बारे में चिंता किए बिना टूटे हार्डडिस्क को वापस करने में सक्षम होना है), यह मेरे लैपटॉप के लिए भी अच्छा होगा: सम्मिलित करें क्रिप्टोडिस्क को अनलॉक करते हुए के बाद बूटिंग और इसे हटाते समय यूएसबी स्टिक।

    मैंने अब एक पैच लिखा है जो फ़ाइल 'cryptkey.txt' के लिए सभी उपकरणों की रूट डीआईआर खोजेगा और प्रत्येक पंक्ति के साथ प्रत्येक पंक्ति के साथ को डिक्रिप्ट करने का प्रयास करेगा। यदि यह विफल रहता है: पास वाक्यांश में टाइप करने के लिए वापस लौटें।

    इसका मतलब यह है कि कुंजी में \ n शामिल नहीं हो सकता है, लेकिन यह किसी भी टाइप की गई कुंजी पर भी लागू होगा।अच्छा हिस्सा यह है कि आप एकाधिक मशीनों के लिए कुंजी स्टोर करने के लिए एक ही यूएसबी डिस्क का उपयोग कर सकते हैं: आपको प्रत्येक के लिए एक अलग यूएसबी डिस्क की आवश्यकता नहीं है। तो यदि आपके पास अपनी भौतिक कुंजी अंगूठी में एक यूएसबी ड्राइव है, तो आप भौतिक रूप से बंद होने पर बूट की जाने वाली सभी मशीनों के लिए उसी ड्राइव का उपयोग कर सकते हैं।

    आप के साथ कुंजी जोड़ें:

    cryptsetup luksAddKey /dev/sda5 
    

    और फिर यूएसबी/एमएमसी डिस्क 'cryptkey.txt' कहा जाता है पर एक फ़ाइल में एक पंक्ति के रूप में ही कुंजी डाल दिया। पैच यहाँ है:

    https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=864647

    तो USB ड्राइवरों, एमएमसी चालकों या फ़ाइल सिस्टम अपने initramfs में मौजूद नहीं हैं, तो आप उन्हें/etc/initramfs उपकरण/मॉड्यूल को जोड़कर जोड़ने की जरूरत:

    uhci_hcd 
    ehci_hcd 
    usb_storage 
    nls_utf8 
    nls_cp437 
    vfat 
    fat 
    sd_mod 
    mmc_block 
    tifm_sd 
    tifm_core 
    mmc_core 
    tifm_7xx1 
    sdhci 
    sdhci_pci 
    

    जब सब किया जाता है, अद्यतन initramfs:

    update-initramfs -u 
    

    यह कम से पैच और फ़ाइल के रूप में पाया जा सकता है: https://gitlab.com/ole.tange/tangetools/tree/master/decrypt-root-with-usb

    +0

    पर सेट किया है, यह सीधे' .sh' फ़ाइल को लिंक देने के लिए बेहतर होना चाहिए। – kyb

    1

    ऊपर दिए गए उत्कृष्ट उत्तरों के साथ कृपया सी रूटीन देखें जो आप कच्चे ब्लॉक डिवाइस कुंजी को लिखने/उत्पन्न करने और पढ़ने के लिए उपयोग कर सकते हैं। "Readkey.c" ब्लॉक डिवाइस से दिए गए आकार की कुंजी निकालता है और "writekey.c" कच्चे डिवाइस को मौजूदा कुंजी उत्पन्न या लिख ​​सकता है। "Readkey.c" एक बार संकलित कस्टम स्क्रिप्ट में इस्तेमाल किया जा सकता इसलिए जैसे कच्चे ब्लॉक डिवाइस से ज्ञात आकार के प्रमुख को निकालने के लिए:

    readkey </path/to/device> <keysize> 
    

    "writekey" के लिए उपयोग देखने के लिए, के बाद कोई झंडे के साथ संकलित रन यह।
    सिर्फ संकलन करने के लिए उपयोग करें:

    gcc readkey.c -o readkey 
    
    gcc writekey.c -o writekey 
    

    मैं भी नीचे प्रकाशित कस्टम के साथ शब्दशः 16GB यूएसबी 2.0 USB फ्लैश ड्राइव "keyscript =" crypttab में दोनों पर परीक्षण किया गया। "Crypto-usb.sh" के लिए विचार "डेबियन etch" cryptsetup गाइड से है।

    crypto-usb.sh:

    #!/bin/sh 
    echo ">>> Trying to get the key from agreed space <<<" >&2 
    modprobe usb-storage >/dev/null 2>&1 
    sleep 4 
    OPENED=0 
    disk="/sys/block/sdb" 
    boot_dir="/boot" 
    readkey="/boot/key/readkey" 
    echo ">>> Trying device: $disk <<<" >&2 
    F=$disk/dev 
    if [ 0`cat $disk/removable` -eq 1 -a -f $F ]; then 
        mkdir -p $boot_dir 
        mount /dev/sda1 $boot_dir -t ext2 >&2 
        echo ">>> Attempting key extraction <<<" >&2 
        if [ -f $readkey ]; then 
         # prints key array to the caller 
         $readkey /dev/sdb 4096 
         OPENED=1 
        fi 
        umount $boot_dir >&2 
    fi 
    
    
    if [ $OPENED -eq 0 ]; then 
        echo "!!! FAILED to find suitable key !!!" >&2 
        echo -n ">>> Try to enter your password: " >&2 
        read -s -r A 
        echo -n "$A" 
    else 
        echo ">>> Success loading key <<<" >&2 
    fi 
    

    जब पैदा कुंजी की कुंजी आकार प्रदान किया जाना, जनरेट की गई कुंजी बाद में उपयोग के लिए फाइल अनुमति 0600 के साथ करने के लिए ".tmpckey" फाइल सेव कर रहा है। मौजूदा कुंजी लिखते समय, आकार को मौजूदा कुंजी आकार को मापकर निर्धारित किया जाता है। यह जटिल दृष्टिकोण की तरह दिखता है हालांकि एक बार "जीसीसी" के साथ संकलित एक बार यह कच्ची कुंजी सामग्री में हेरफेर करने का आसान तरीका प्रदान कर सकता है।

    readkey.c:

    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
    
    void main(int argc, char *argv[]) 
    { 
        int blockSize = 512; 
        int keySize = 2048; 
    
        FILE *device;  
    
        if ( argc == 3 
          && (sizeof(argv[1])/sizeof(char)) > 1 
          && (sizeof(argv[2])/sizeof(char)) > 1 
         && (atoi(argv[2]) % 512) == 0 
         ) { 
         device = fopen(argv[1], "r"); 
         if(device == NULL) { 
          printf("\nI got trouble opening the device %s\n", argv[1]); 
          exit(EXIT_FAILURE); 
         } 
         keySize = atoi(argv[2]);   
        } 
        else if ( argc == 2 
          && (sizeof(argv[1])/sizeof(char)) > 1 
         ) { 
         device = fopen(argv[1], "r"); 
         if(device == NULL) { 
          printf("\nI got trouble opening the device %s\n", argv[1]); 
          exit(EXIT_FAILURE); 
         } 
    
        } 
        else { 
    
         printf("\nUsage: \n"); 
         printf("\nKey Size Provided: \n"); 
         printf("\n\t\treadkey </path/to/device> <keysize> \n"); 
         printf("\nDefault key size: %d\n", keySize); 
         printf("\n\t\treadkey </path/to/device>\n"); 
         exit(1); 
        } 
    
        int count; 
    
        char *block; 
    
        /* Verify if key is multiple of blocks */ 
        int numBlocks = 0; 
        if (keySize % 512 != 0) { 
         printf("\nSory but key size is not multiple of block size, try again. TA.\n"); 
         exit(1); 
        } 
    
        /* Seek till the end to get disk size and position to start */ 
        fseek(device, 0, SEEK_END); 
    
        /* Determine where is the end */ 
        long endOfDisk = ftell(device); 
    
        /* Make sure we start again */ 
        rewind(device); // Do I need it ??? 
    
        /* Get the required amount minus block size */ 
        long startFrom = endOfDisk - blockSize - keySize; 
    
        /* Allocate space for bloc */ 
        block = calloc(keySize, sizeof(char)); 
    
        /* Start reading from specified block */ 
        fseek(device, startFrom, SEEK_SET); 
        fread(block, 1, keySize, device); 
    
        /* Do something with the data */ 
        for(count = 0; count < keySize/*sizeof(block)*/; count++){ 
         printf("%c", block[count]); 
        } 
    
        /* Close file */ 
        fclose(device); 
    
        /* Make sure freed array is zeroed */ 
        memset(block, 0, keySize); 
        free(block); 
    } 
    

    writekey।ग: (यदि कुंजी समान हैं नीचे इच्छा उत्पादन कुछ भी नहीं)

    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
    
    int main(int argc, char *argv[]) 
    { 
        int blockSize = 512; 
        int keySize = 2048; 
    
        int count; 
    
        unsigned char *block; 
    
        /* 
         Thing to always remember that argv starts from 0 - the name of the program, and argc starts from 1 i.e. 1 is the name of the program. 
        */ 
        if (argc == 3 
         && strcmp(argv[1], "genwrite") != 0 
         && (sizeof(argv[2])/sizeof(char)) > 2 
         ) { 
         char ch; 
         FILE *keyF; 
         keyF = fopen(argv[1], "r"); 
         if (keyF == NULL) exit(EXIT_FAILURE); 
    
         /* Tell key Size */ 
         fseek(keyF, 0, SEEK_END); 
         keySize = ftell(keyF); 
         rewind(keyF); 
         printf("\nKey Size: %d\n", keySize); 
    
         block = calloc(keySize, sizeof(char)); 
         printf("\n-- Start Key --:\n"); 
           for(count = 0; count < keySize/*sizeof(block)*/; count++){ 
          char ch = fgetc(keyF); 
             block[count] = ch; 
          /* 
           Uncomment below to see your key on screen 
          */ 
          // printf("%c",ch); 
    
           } 
         printf("\n-- End Key --:\n"); 
         fclose(keyF); 
        } 
        else if ( argc == 3 
         && strcmp(argv[1], "genwrite") == 0 
         && (sizeof(argv[2])/sizeof(char)) > 2 
         ) 
         { 
         printf("\n-- Attempting to create random key(ish --) of size: %d\n", keySize); 
         block = calloc(keySize, sizeof(char)); 
         int count; 
         for(count = 0; count < keySize/*sizeof(block)*/; count++){ 
          block[count] = (char) rand(); 
         } 
         FILE *tmpfile; 
         tmpfile = fopen(".tmpckey", "w"); 
         if(tmpfile == NULL) exit(EXIT_FAILURE); 
         fwrite(block, 1, keySize, tmpfile); 
         fclose(tmpfile); 
         chmod(".tmpckey", 0600); 
        } 
        else if ( argc == 4 
         && strcmp(argv[1], "genwrite") == 0 
         && (sizeof(argv[2])/sizeof(char)) > 2 
         && ((atoi(argv[3]) % 512) == 0) 
         ) 
         { 
         keySize = atoi(argv[3]); 
         printf("\n-- Attempting to create random key(ish --) of size: %d\n", keySize); 
         block = calloc(keySize, sizeof(char)); 
         int count; 
         for(count = 0; count < keySize/*sizeof(block)*/; count++){ 
          block[count] = (char) rand(); 
         } 
         FILE *tmpfile; 
         tmpfile = fopen(".tmpckey", "w"); 
         if(tmpfile == NULL) exit(EXIT_FAILURE); 
         fwrite(block, 1, keySize, tmpfile); 
         fclose(tmpfile); 
         chmod(".tmpckey", 0600); 
        } 
        else { 
         printf("\n"); 
         printf("################################################################################\n"); 
         printf("#                    #\n"); 
         printf("#        Usage:           #\n"); 
         printf("#                    #\n"); 
         printf("################################################################################\n"); 
         printf("#> To write existing key to device:           #\n"); 
         printf("#                    #\n"); 
         printf("#  writekey </path/to/keyfile> </path/to/removable/sd*>      #\n"); 
         printf("#                    #\n"); 
         printf("#> To generate and write pseudo random key,         #\n"); 
         printf("#> key will be saved to temporary file .tmpckey        #\n"); 
         printf("#                    #\n"); 
         printf("#  writekey genwrite </path/to/removable/sd*> <keysize in multiples of 512> #\n"); 
         printf("#                    #\n"); 
         printf("#> When keysize is not provided default size is set to %d.      #\n", keySize); 
         printf("#                    #\n"); 
         printf("################################################################################\n"); 
         exit(1); 
        } 
    
        /* 
         Some printf debugging below, uncomment when needed to see what is going on. 
        */ 
        /* 
        printf("\nNumber of Args: %d\n", argc); 
        printf("\nCurrently block array contains: \n"); 
        for(count = 0; count < keySize; count++){ 
         printf("%c", block[count]); 
        } 
        printf("\n-- End block -- \n"); 
        */ 
        /* Open Device itp... */ 
        FILE *device = fopen(argv[2], "a"); 
        if(device == NULL) exit(EXIT_FAILURE); 
    
        printf("\nDevice to write: %s\n", argv[2]); 
    
        fseek(device, 0, SEEK_END); 
    
        /* Determine where is the end */ 
        long endOfDisk = ftell(device); 
        printf("\nDevice Size: %ld\n", endOfDisk); 
    
        /* Verify if key is multiple of blocks */ 
        int numBlocks = 0; 
        if (keySize % 512 != 0 || endOfDisk < (blockSize + keySize)) { 
          printf("\nSorry but key size is not multiple of block size or device you trying to write to is too small, try again. TA.\n"); 
         fclose(device); 
          exit(1); 
        } 
    
    
    
        /* Make sure we start again */ 
        rewind(device); 
    
        /* Get the required amount sunbstracting block size */ 
        long startFrom = endOfDisk - blockSize - keySize; 
    
        /* Write some data to the disk */ 
        printf("\nWriting data starting from: %ld\n", startFrom); 
        fseek(device, startFrom, SEEK_SET); 
        fwrite(block, 1, keySize, device); 
        printf("\nBlock Position after data write procedure : %ld\n", ftell(device)); 
    
        /* 
         Below is just for convenience, to read what was written, 
         can aid in debugging hence left commented for later. 
        */ 
        /* 
        printf("\nAmount of Data written : %ld\n", ftell(device) - startFrom); 
    
        // Start reading from specified block 
        printf("\n>>>>>>>> DEBUGGING SECTION <<<<<<<<<\n"); 
        rewind(device); // 
        fseek(device, startFrom, SEEK_SET); 
        printf("\nBlock Position before read attempted: %d\n", ftell(device)); 
        printf("\nKey size: %d\n", keySize); 
        fread(block, 1, keySize, device); 
    
        // Do something with the data 
        printf("\nBlock Position startFrom: %ld\n", startFrom); 
        printf("\nBlock Position after read: %d\n", ftell(device)); 
        printf("\n-- Buffer Read: --\n"); 
        for(count = 0; count < keySize; count++){ 
         printf("%c", block[count]); 
        } 
        printf("\n-- End block -- \n"); 
        printf("\n-- -- \n"); 
        printf("\n-- -- \n"); 
        */ 
    
        /* Close file */ 
        fclose(device); 
    
        /* Make sure freed array is zeroed */ 
        memset(block, 0, keySize); 
        free(block); 
    
    /* Return success, might change it to be useful return not place holder */ 
    return 0; 
    } 
    

    कच्चे डिवाइस के लिए लिखा कुंजी सत्यापित करने के लिए फाइल में से एक के रूप में एक ही है:

    diff -B <(./readkey </path/to/device> 4096) <(cat .tmpckey) 
    

    या खुद का उपयोग करते हुए उत्पन्न मौजूदा कुंजी के लिए का अर्थ है:

    diff -B <(./readkey </path/to/device> <generated elsewhere key size>) <(cat </path/to/keyfile>) 
    

    आप

    संबंधित मुद्दे