Điểm:0

Thêm byte khi giải mã bằng OpenSSL

lá cờ fr

Chuỗi được mã hóa với các thuộc tính sau (sử dụng C#):

myAes.Mode = CipherMode.CBC

myAes.KeySize = 128

myAes.Padding = PaddingMode.PKCS7

myAes.BlockSize = 128

myAes.FeedbackSize = 128

Mã: 5753B8AA97BE5B5D9584864DF3134E64

Đây là chức năng giải mã của tôi:

int AESdecrypt(ký tự không dấu *bản mã, size_t ciphertext_len, khóa char *không dấu, ký tự không dấu *iv, ký tự không dấu *bản rõ)
  {
    EVP_CIPHER_CTX *ctx;

    int len;
      int retErrors=1;

    int bản rõ_len;

    /* Tạo và khởi tạo ngữ cảnh */
    if(!(ctx = EVP_CIPHER_CTX_new()))
    {
        LOGF_TRACE("\t Lỗi trong EVP_CIPHER_CTX_new");
        EVP_CIPHER_CTX_free(ctx);
        trả về 0;
    }

    /*
     * Khởi tạo hoạt động giải mã. QUAN TRỌNG - đảm bảo bạn sử dụng khóa
     * và kích thước IV phù hợp với mật mã của bạn
     * Trong ví dụ này, chúng tôi đang sử dụng AES 256 bit (tức là khóa 256 bit). Các
     * Kích thước IV cho các chế độ *hầu hết* giống với kích thước khối. Đối với AES này
     * là 128 bit
     */
    if(1 != EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv))
    {
      LOGF_TRACE("\t Lỗi trong EVP_DecryptInit_ex");
      EVP_CIPHER_CTX_free(ctx);
      trả về 0;
    }

    /*
     * Cung cấp tin nhắn cần được giải mã và nhận đầu ra văn bản gốc.
     * EVP_DecryptUpdate có thể được gọi nhiều lần nếu cần.
     */
    if(1 != EVP_DecryptUpdate(ctx, bản rõ, &len, bản mã, bản mã_len))
    {
      LOGF_TRACE("\t EVP_DecryptUpdate");
      EVP_CIPHER_CTX_free(ctx);
      trả về 0;
    }
        
    bản rõ_len = len;

    /*
     * Hoàn thiện việc giải mã. Các byte văn bản rõ hơn nữa có thể được viết tại
     * sân khấu này.
     */
    if(1 != EVP_DecryptFinal_ex(ctx, bản rõ + len, &len))
    {
      LOGF_TRACE("\t EVP_DecryptFinal_ex");
      EVP_CIPHER_CTX_free(ctx);
      trả về 0;
    }
        
    bản rõ_len += len;

    /* Dọn dẹp */
    EVP_CIPHER_CTX_free(ctx);

    trả lại bản rõ_len;
  }

Tuy nhiên, khi tôi cố gắng giải mã, chuỗi kết quả có thêm 16 (0x10) byte: (Đã xóa một số ký tự vì lý do bảo mật).

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 PRUUE

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 PARA ETHERNET

0040 - XX XX XX XX XX XX XX-XX XX XX XXXXXXXX

Tôi muốn biết liệu điều này có bình thường không và tôi chỉ nên xóa 16 byte đầu tiên hoặc làm cách nào để tránh có thêm các byte đó (tôi cảm thấy không bình thường).

Điều này có liên quan gì đến IV mà họ đang sử dụng để mã hóa không?

Cảm ơn.

Điểm:3
lá cờ my

Từ các triệu chứng của bạn, có vẻ như IV được bao gồm trong bản mã (dưới dạng 16 byte đầu tiên); bạn đang để nó bật khi gọi AESdecrypt.

Nếu vậy, thì bạn có hai lựa chọn:

  • Trích xuất 16 byte đầu tiên từ bản mã; chuyển 16 byte đó dưới dạng IV và phần còn lại (nghĩa là với 16 byte đầu tiên đã bị xóa) dưới dạng bản mã

  • Làm những gì bạn đang làm và cắt bỏ 16 byte đầu tiên của văn bản gốc được giải mã.

BTW: với chế độ CBC, nói chung nên bao gồm một số loại mã xác thực thư (có thể là CMAC, HMAC hoặc mã nào đó khác), để đảm bảo rằng ai đó không thể sửa đổi bản mã mà không bị phát hiện (vì kẻ tấn công có thể bị phát hiện) có thể sửa đổi bản mã và có một số quyền kiểm soát đối với cách điều đó sửa đổi quá trình giải mã). Bạn đang làm một cái gì đó để bảo vệ chống lại điều đó?

David Merinos avatar
lá cờ fr
Nó sẽ được giải quyết nếu bản mã được tạo ra với và IV của 16 số không? Vì tôi đang sử dụng IV gồm 16 số 0 để giải mã. Về xác thực, chúng tôi vẫn đang làm việc với nó.
David Merinos avatar
lá cờ fr
Ngoài ra, chúng tôi có thể chắc chắn rằng OpenSSL sử dụng PKCS#7 để giải mã làm mặc định không?
poncho avatar
lá cờ my
@DavidMerinos: IV của tất cả 0 đều ổn nếu đó là tin nhắn duy nhất sẽ được mã hóa bằng khóa này; nếu bạn đang sử dụng lại khóa để mã hóa nhiều thư (điều này thường xảy ra nhưng không phải lúc nào cũng xảy ra), bạn nên chọn một IV không thể đoán trước cho từng thư.
David Merinos avatar
lá cờ fr
Hấp dẫn. Nhưng điều đó có giải quyết được vấn đề thêm 16 byte không?
poncho avatar
lá cờ my
@DavidMerinos: đối với vấn đề thêm 16 byte, hãy xem câu trả lời; nhận xét của tôi cụ thể là về ý tưởng sử dụng IV của all-0 (hoạt động nếu bạn chỉ mã hóa một tin nhắn; sẽ không ổn nếu bạn đang mã hóa nhiều tin nhắn bằng cùng một khóa)
poncho avatar
lá cờ my
@DavidMerinos: BTW: bạn có chắc vấn đề là thêm 16 byte ở phía trước, thay vì 16 byte đầu tiên được giải mã là vô nghĩa (và phần còn lại đều ổn) - điều sau cho thấy rằng bạn đã hiểu sai IV (và mọi thứ khác đều đúng)
David Merinos avatar
lá cờ fr
Chà, tôi biết thông báo được giải mã là: "ESTA ES UNA PRUEBA DE CIFRADO AES PARA ETHERNET XXXXXXXX" Tôi không nhận được bất kỳ IV nào từ phía mã hóa; những gì tôi đang làm là đặt IV thành một mảng gồm 16 số không. Tôi sẽ thử trích xuất 16 byte đầu tiên đó. Điều đó có nghĩa là tôi cần phải cắt nó trước khi thử giải mã?
dave_thompson_085 avatar
lá cờ cn
@DavidMerinos: có, OpenSSL _EVP cho các chế độ khối_ theo mặc định sử dụng phần đệm có tên PKCS5 hoặc PKCS7 tùy thuộc vào thời điểm đặt tên được thực hiện. Nếu không, bạn sẽ bị thêm rác hoặc xóa các giá trị chính xác ở _end_ của bản rõ. Các phần khác của OpenSSL thì khác.
David Merinos avatar
lá cờ fr
Hôm nay tôi đã chạy thử nghiệm trong đó tôi mã hóa cùng một tin nhắn bằng cách sử dụng IV của số 0, sau đó giải mã nó bằng cùng một IV và tôi không nhận được thêm byte nào nên chúng tôi có thể kết luận vấn đề là như vậy.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.