Điểm:1

Camellia 1.2.0: các từ có 0 ở bảng chính

lá cờ co

Kiểm tra mã sử dụng Camellia 1.2.0 mã nguồn, khi tạo keyTable từ khóa đầu vào, sử dụng:

void Camellia_Ekeygen(const int keyBitLength, 
          const unsigned char *rawKey, 
          KEY_TABLE_TYPE keyTable)

Đầu ra hiển thị một số từ 'không' ở cùng một vị trí. Hai ví dụ ngẫu nhiên cho 256 bit:

E1AE67E4 07AE952B 94B0FCD1 CD366E1C 5160F1A8 45893AE8 0994EC20 1B5782AF

52027468 D2CEEB8F 00000000 00000000 5A44D15D 533F0EF8 E441183F 960616CE
B492E69C C71899DB 1C149A9E DA2EF3F9 C590DF1D 8ECE1AA3 5BF4C76A 517A719B
BA4E6211 083B6502 ABE0D506 6A3C58D4 32B152A6 C7D2AD48 2338FC75 4B1C4805
6FB9B4E4 4E14DA25 46CEF6AA D655F3C1 E89A9073 87CCF090 098D9E8F C73283B7
CD0F4BB9 E166D31C 7EE61ACE 52E97A40 0F5B9E82 4F98AEDE 91D08211 2E660D02
01506F57 40F9E4BA C2AB1164 196A9DE8 6E870140 C0A16094 F462E486 D98FF34F
F8543532 5ACAA32E 0046EFC7 06E9A0B9 42409189 9D9C0A16 EF580EC8 03E52B67
4D99620A B6A40197 3999A1B9 A9B45F27 6AE83BF0 7351AF36 6AEDF2EC 0A050076
B50EBD28 B9A2B34C 00000000 00000000


BE276A07 021C223F 40262C4B 2B07D216 AB51C522 C919C184 BBAD4565 B3050C87

93759D00 1DCE4C1F 00000000 00000000 91C6EBE1 47BE73E0 A1ECCAB9 B997E1E5
DEB11931 C13C15D2 EA9E2B5B 892BC368 BFD5F521 7B61B763 CB8C58B7 0AE271F1
617046B2 5951EB2E 2143C16C 4871D4EA 8AA8E801 3CD1E79E D64B23F5 DA983076
D6232073 5364BDE7 77FFE6AE B967FDE4 FDD26694 1720ECF0 6FC56EEE 3B618822
C46202F4 217DB0B2 A076E26B 23C22170 AD07C5E8 890AE608 EFC78526 F0F62449
7C712F1A D7CC710B C0FDB367 E97D2186 437CA739 F93D0CBF C90FF6E2 C879AA2B
511B3CF8 2E25C89E 7B745E74 CA705CCE 3DFD612D 1BE56472 FA45E7EA 4B3B85B0
95F84DCF 4C14FC95 20310BF7 A353A328 0E505958 A56CB1A1 007D2357 CC0239C8
4EFF9C31 2B9BEF19 00000000 00000000

Điều này có được mong đợi không?

Làm rõ: các kết xuất "hex" ở trên hiển thị hai lời gọi của hàm. Đối với mỗi một keyBitLength được đặt thành 256, chuỗi ngắn hơn (vừa với một dòng) là một khóa 256 bit ngẫu nhiên và phần tiếp theo là đầu ra của hàm (được sao chép vào bộ đệm keyTable).

Một thử nghiệm khác: Tôi đã zeroing keyTable trước khi gọi hàm. Bây giờ tôi đã đặt tất cả các byte là 0xFF và các từ được đánh số 0 trở thành: 0xFFFFFFFF. Đáng sợ. Những từ này (luôn luôn là những từ giống nhau) không được hàm chạm vào.

Cố gắng giải quyết bằng cách sử dụng các loại tiêu chuẩn. Tôi cũng đã chuyển sang trình biên dịch -O0 để tránh mọi sự cố tối ưu hóa:

//typedef không dấu int KEY_TABLE_TYPE[CAMELLIA_TABLE_WORD_LEN];
/* u32 phải là từ 32 bit */
//typedef không dấu int u32;
// typedef unsign char u8;

#include <stdint.h> // đây là thay đổi duy nhất đối với mã gốc (được giữ ở trên):
typedef uint32_t KEY_TABLE_TYPE[CAMELLIA_TABLE_WORD_LEN];
gõdef uint32_t u32;
typedef uint8_t u8;

Tôi đã tải lên một chương trình thử nghiệm tối thiểu đây.

DannyNiu avatar
lá cờ vu
Mã nguồn giả định `dài` là 32 bit, điều này có thể không đúng với hệ thống 64 bit. Hãy thử thay thế định nghĩa loại cho `Word` bằng `uint32_t` ở đầu mã nguồn.
devnull avatar
lá cờ co
@DannyNiu. Cảm ơn. Tôi đã thử điều đó và cập nhật câu hỏi (không thay đổi). Tôi cũng đã tải xuống lại nguồn và tách riêng một chương trình thử nghiệm "tối thiểu" có thể sao chép được đối với tôi (687 dòng mã). Tôi có nên tải nó lên đây không?
Maarten Bodewes avatar
lá cờ in
Điều đó có thể hơi nhiều, nhưng tất nhiên bạn có thể đặt nó ở đâu đó cho phép đoạn mã và đặt liên kết trong câu hỏi.Cá nhân tôi sẽ thử mã khác dễ biên dịch (ví dụ: Lâu đài Bouncy/Java) và sau đó thử xác minh các giá trị bạn đã tạo. Những khác biệt như giá trị hoàn toàn bằng 0, v.v. sẽ dễ dàng nhận ra.
Maarten Bodewes avatar
lá cờ in
Ugh, đối với bất kỳ ai đi theo con đường đó, BC chỉ định RFC 3713. Tôi không nhận được các giá trị giống nhau chút nào, tôi đoán một giá trị là v1 và giá trị còn lại là v2 của mật mã Camelia. Thở dài, tôi cho rằng điều đó phù hợp với một câu hỏi khác.
devnull avatar
lá cờ co
@MaartenBodewes Tôi vừa tải xuống phiên bản x86_64 asm từ cùng một trang (liên kết đầu tiên ở trên cùng) và nó tạo ra một keyTable hoàn toàn khác (cũng không có 4 từ không sử dụng). Tôi đã gửi email đến địa chỉ liên hệ trên cùng một trang và sẽ báo cáo ở đây mọi câu trả lời có liên quan.
Maarten Bodewes avatar
lá cờ in
Tôi hy vọng bạn nhận được câu trả lời, đôi khi rất khó để nhận được câu trả lời từ Nhật Bản :)
devnull avatar
lá cờ co
@MaartenBodewes. Như bạn đã đề cập, không có câu trả lời.Tôi đang viết câu trả lời để ghi lại điều này vì lỗi hiện đã rõ ràng bằng cách kiểm tra mã.
Điểm:1
lá cờ co

Trong khi NTT xem xét vấn đề này, tôi sẽ đăng bài này dưới dạng "giải pháp":

Qua kiểm tra chức năng

void camellia_setup256(const unsigned char *key, u32 *subkey)

rõ ràng là tất cả các truy cập vào 'khóa con' của véc tơ đầu ra đều được thực hiện bằng cách sử dụng macro

#define CamelliaSubkeyL(INDEX) (khóa con[(INDEX)*2])
#define CamelliaSubkeyR(INDEX) (khóa con[(INDEX)*2 + 1])

Không nơi nào trong hàm có tham chiếu đến chỉ mục 1 và 33 được tìm thấy. Các chỉ mục này sẽ ghi vào các vị trí từ 2, 3, 66 và 67. Đây chính xác là 4 từ không được ghi vào trong các bài kiểm tra.

Cổng OpenSSL của mật mã Camellia (Giấy phép Apache 2.0) không gặp sự cố này: hội,, tổ hợpc có sẵn.

Cập nhật:

Tôi đã so sánh hai cổng trên với mã từ NTT được liên kết trong câu hỏi, như sau:

  1. tạo khóa 256 bit ngẫu nhiên
  2. tạo một khối 16 byte ngẫu nhiên
  3. với mỗi trong số 3 triển khai mã hóa khối để so sánh bản mã

Tóm tắt: mặc dù có những từ không được sử dụng trong keyTable cho việc triển khai NTT, nhưng trong tất cả hàng triệu cặp khóa/khối được kiểm tra, tất cả các bản mã được tạo bởi 3 triển khai đều khớp nhau.

Sửa chữa:

Vì nó không ảnh hưởng đến quá trình mã hóa/giải mã nên bản sửa lỗi chỉ làm giảm kích thước keyTable từ 68 xuống 64 từ.Vì mã rất rõ ràng và tất cả các truy cập được thực hiện với hai macro ở trên nên chỉ cần thay đổi 16 dòng (chỉ được thử nghiệm với các khóa 256 bit):

  1. Tìm tất cả các macro truy cập vào chỉ mục 24 và thay đổi nó thành 1
  2. Tìm tất cả các macro truy cập vào chỉ mục 32 và thay đổi nó thành 24

Tôi đã thử nghiệm điều này trong quy trình được mô tả ở trên.

Maarten Bodewes avatar
lá cờ in
Mát mẻ. Bạn đã kiểm tra xem bạn có thể sửa mã gốc không? Đó sẽ là bằng chứng cuối cùng. Bạn có thể chấp nhận câu trả lời của riêng bạn sau 2 ngày.
DannyNiu avatar
lá cờ vu
"Mã tham chiếu" ở *dưới cùng* của [trang này](https://info.isl.ntt.co.jp/crypt/eng/camellia/source/) chứa phiên bản mà tôi đã điều chỉnh cho phù hợp với sở thích của mình project (`long` -> `uint32_t`) để tạo các vectơ thử nghiệm. Điều này dường như đang làm việc một cách chính xác.
devnull avatar
lá cờ co
@DannyNiu Cảm ơn. Tôi đã mô tả cách khắc phục và một số thử nghiệm ở trên.

Đă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.