Score:0

ไบต์พิเศษเมื่อถอดรหัสด้วย OpenSSL

ธง fr

สตริงถูกเข้ารหัสด้วยคุณสมบัติต่อไปนี้ (โดยใช้ C#):

myAes.Mode = CipherMode.CBC

myAes.KeySize = 128

myAes.Padding = โหมดการแพดดิ้ง PKCS7

myAes.BlockSize = 128

myAes.FeedbackSize = 128

รหัส: 5753B8AA97BE5B5D9584864DF3134E64

นี่คือฟังก์ชั่นการถอดรหัสของฉัน:

int AESdecrypt (ถ่านที่ไม่ได้ลงชื่อ *ciphertext, size_t ciphertext_len, ถ่าน * คีย์ที่ไม่ได้ลงชื่อ, ถ่านที่ไม่ได้ลงชื่อ * iv, ถ่านที่ไม่ได้ลงชื่อ * ข้อความธรรมดา)
  {
    EVP_CIPHER_CTX *ctx;

    เลนส์ int;
      int retErrors = 1;

    int ธรรมดา text_len;

    /* สร้างและเริ่มต้นบริบท */
    ถ้า(!(ctx = EVP_CIPHER_CTX_new()))
    {
        LOGF_TRACE("\t เกิดข้อผิดพลาดใน EVP_CIPHER_CTX_new");
        EVP_CIPHER_CTX_free(ctx);
        กลับ 0;
    }

    /*
     * เริ่มต้นการดำเนินการถอดรหัส สำคัญ - ให้แน่ใจว่าคุณใช้รหัส
     * และขนาด IV ที่เหมาะสมสำหรับรหัสของคุณ
     * ในตัวอย่างนี้ เราใช้ AES 256 บิต (เช่น คีย์ 256 บิต) เดอะ
     * ขนาด IV สำหรับโหมด *ส่วนใหญ่* จะเหมือนกับขนาดบล็อก สำหรับ AES นี้
     * คือ 128 บิต
     */
    if(1 != EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, คีย์, iv))
    {
      LOGF_TRACE("\t เกิดข้อผิดพลาดใน EVP_DecryptInit_ex");
      EVP_CIPHER_CTX_free(ctx);
      กลับ 0;
    }

    /*
     * ระบุข้อความที่จะถอดรหัสและรับเอาต์พุตข้อความธรรมดา
     * สามารถเรียกใช้ EVP_DecryptUpdate ได้หลายครั้งหากจำเป็น
     */
    if(1 != EVP_DecryptUpdate(ctx, ข้อความธรรมดา, &len, ciphertext, ciphertext_len))
    {
      LOGF_TRACE("\t EVP_DecryptUpdate");
      EVP_CIPHER_CTX_free(ctx);
      กลับ 0;
    }
        
    plaintext_len = เลน;

    /*
     * จบการถอดรหัส อาจเขียนไบต์ข้อความธรรมดาเพิ่มเติมที่
     * ขั้นตอนนี้
     */
    if(1 != EVP_DecryptFinal_ex(ctx, ข้อความธรรมดา + len, &len))
    {
      LOGF_TRACE("\t EVP_DecryptFinal_ex");
      EVP_CIPHER_CTX_free(ctx);
      กลับ 0;
    }
        
    plaintext_len += เลน;

    /* ทำความสะอาด */
    EVP_CIPHER_CTX_free(ctx);

    กลับ plaintext_len;
  }

อย่างไรก็ตาม เมื่อฉันพยายามถอดรหัส สตริงผลลัพธ์จะมี 16 (0x10) ไบต์พิเศษ: (ลบอักขระบางตัวออกด้วยเหตุผลด้านความปลอดภัย)

0000 - 2e 3c 81 6b ed 2e 6b 59-fe 38 ae b7 56 11 1f c2 .<.k..kY.8..V...

0010 - 45 53 54 41 20 45 53 20-55 4e 41 20 50 52 55 45 ESTA ES UNA PRUE

0020 - 42 41 20 44 45 20 43 49-46 52 41 44 4f 20 41 45 BA DE CIFRADO AE

0030 - 53 20 50 41 52 41 20 45-54 48 45 52 4e 45 54 20 S พาราอีเทอร์เน็ต

0040 - XX XX XX XX XX XX XX XX-XX XX XX XXXXXXXXX

ฉันต้องการทราบว่านี่เป็นเรื่องปกติหรือไม่และฉันควรลบ 16 ไบต์แรกออกหรือจะหลีกเลี่ยงการมีไบต์พิเศษเหล่านั้นได้อย่างไร (ฉันรู้สึกไม่ปกติสำหรับฉัน)

สิ่งนี้อาจเกี่ยวข้องกับ IV ที่พวกเขาใช้สำหรับการเข้ารหัสหรือไม่

ขอบคุณ.

Score:3
ธง my

จากอาการของคุณ ดูเหมือนว่า IV จะรวมอยู่ในไซเฟอร์เท็กซ์ (เป็น 16 ไบต์แรก); คุณเปิดทิ้งไว้เมื่อคุณเรียก AESdecrypt

ถ้าเป็นเช่นนั้น คุณมีสองทางเลือก:

  • แยก 16 ไบต์แรกออกจากข้อความเข้ารหัส ส่ง 16 ไบต์เหล่านั้นเป็น IV และส่วนที่เหลือ (นั่นคือโดยลบ 16 ไบต์แรกออก) เป็นข้อความเข้ารหัส

  • ทำสิ่งที่คุณกำลังทำอยู่ และตัด 16 ไบต์แรกของข้อความธรรมดาที่ถอดรหัสออก

BTW: เมื่อใช้โหมด CBC โดยทั่วไปแล้วควรรวมรหัสยืนยันข้อความบางประเภท (ไม่ว่าจะเป็น CMAC, HMAC หรืออย่างอื่น) ซึ่งทำให้แน่ใจว่าใครบางคนไม่สามารถแก้ไขข้อความเข้ารหัสโดยไม่ถูกตรวจพบ (เนื่องจากผู้โจมตีอาจ สามารถแก้ไขไซเฟอร์เท็กซ์และควบคุมวิธีการแก้ไขการถอดรหัสได้) คุณกำลังทำอะไรเพื่อป้องกันสิ่งนั้นหรือไม่?

David Merinos avatar
fr flag
จะแก้ไขได้หรือไม่หากสร้างไซเฟอร์เท็กซ์ด้วย IV ของศูนย์ 16 ตัว เพราะฉันใช้ IV ของศูนย์ 16 ตัวในการถอดรหัส เกี่ยวกับการรับรองความถูกต้องที่เรายังคงดำเนินการอยู่
David Merinos avatar
fr flag
นอกจากนี้ เราแน่ใจได้หรือไม่ว่า OpenSSL ใช้ PKCS#7 ในการถอดรหัสเป็นค่าเริ่มต้น
poncho avatar
my flag
@DavidMerinos: IV ของ 0 ทั้งหมดนั้นใช้ได้หากเป็นข้อความเดียวที่จะถูกเข้ารหัสด้วยคีย์นี้ หากคุณกำลังใช้คีย์ซ้ำเพื่อเข้ารหัสข้อความหลายข้อความ (ซึ่งมักจะเป็นกรณีนี้ แต่ไม่เสมอไป) คุณควรเลือก IV ที่คาดเดาไม่ได้สำหรับแต่ละข้อความ
David Merinos avatar
fr flag
น่าสนใจ. แต่นั่นจะช่วยแก้ปัญหา 16 ไบต์พิเศษได้หรือไม่
poncho avatar
my flag
@DavidMerinos: สำหรับปัญหาเพิ่มเติม 16 ไบต์ ดูคำตอบ; ความคิดเห็นของฉันเกี่ยวกับแนวคิดในการใช้ IV ของ all-0 โดยเฉพาะ (ใช้งานได้ถ้าคุณเข้ารหัสเพียงข้อความเดียว ไม่ดีนักถ้าคุณเข้ารหัสหลายข้อความด้วยคีย์เดียวกัน)
poncho avatar
my flag
@DavidMerinos: BTW: คุณแน่ใจหรือว่าปัญหาคือ 16 ไบต์พิเศษที่ด้านหน้า แทนที่จะเป็น 16 ไบต์แรกที่ถอดรหัสซึ่งพูดพล่อยๆ (และที่เหลือก็ใช้ได้) - อันหลังระบุว่าคุณเข้าใจ IV ผิด (และทุกอย่างอื่นถูกต้อง)
David Merinos avatar
fr flag
ฉันรู้ว่าข้อความที่ถอดรหัสคือ: "ESTA ES UNA PRUEBA DE CIFRADO AES PARA ETHERNET XXXXXXXX" ฉันไม่ได้รับ IV จากด้านการเข้ารหัส สิ่งที่ฉันทำคือตั้งค่า IV เป็นอาร์เรย์ของศูนย์ 16 ตัว ฉันจะลองแยก 16 ไบต์แรกเหล่านั้น หมายความว่าฉันต้องตัดแต่งก่อนพยายามถอดรหัสใช่หรือไม่
dave_thompson_085 avatar
cn flag
@DavidMerinos: ใช่ OpenSSL _EVP สำหรับ block modes_ โดยค่าเริ่มต้นจะใช้การเติมที่เรียกว่า PKCS5 หรือ PKCS7 ขึ้นอยู่กับว่าตั้งชื่อเสร็จเมื่อใด หากไม่เป็นเช่นนั้น คุณจะต้องเพิ่มขยะหรือแก้ไขค่าที่ _end_ ของข้อความธรรมดา ส่วนอื่นๆ ของ OpenSSL นั้นแตกต่างออกไป
David Merinos avatar
fr flag
วันนี้ฉันทำการทดสอบโดยฉันเข้ารหัสข้อความเดียวกันโดยใช้ IV ของศูนย์ จากนั้นถอดรหัสด้วย IV เดียวกัน และฉันไม่ได้รับไบต์เพิ่ม เราจึงสรุปได้ว่าปัญหาคืออะไร

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา