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ợp và c 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:
- tạo khóa 256 bit ngẫu nhiên
- tạo một khối 16 byte ngẫu nhiên
- 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):
- Tìm tất cả các macro truy cập vào chỉ mục 24 và thay đổi nó thành 1
- 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.