2017-03-28 27 views
5

tôi như một đoạn mã:QCryptographicHash - SHA3 là gì trong thực tế?

void SHAPresenter::hashData(QString data) 
{ 
    QCryptographicHash* newHash = new QCryptographicHash(QCryptographicHash::Sha3_224); 
    newHash->addData(data.toUtf8()); 
    QByteArray hashResultByteArray = newHash->result(); 
    setHashedData(QString(hashResultByteArray.toHex())); 
    delete newHash; 
} 

Theo Qt spec, QCryptographicHash :: Sha3_224 nên "tạo ra một tổng SHA3-224 băm Được giới thiệu vào Qt 5.1.". Tôi muốn so sánh kết quả của mã đó với một nguồn khác để kiểm tra xem tôi có đặt dữ liệu đúng cách hay không. Tôi tìm thấy trang web: https://emn178.github.io/online-tools/sha3_224.html Vì vậy, chúng tôi có SHA3_224 trong cả hai trường hợp. Vấn đề là người đầu tiên sẽ tạo ra như một chuỗi byte từ "test":

3be30a9ff64f34a5861116c5198987ad780165f8366e67aff4760b5e 

Và thứ hai:

3797bf0afbbfca4a7bbba7602a2b552746876517a7f9b7ce2db0ae7b 

Không giống chút nào. Nhưng đó cũng là một trang web đó làm "Keccak-224": https://emn178.github.io/online-tools/keccak_224.html

Và đây quả là:

3be30a9ff64f34a5861116c5198987ad780165f8366e67aff4760b5e 

Tôi biết rằng SHA3 được dựa trên chức năng Keccak của - nhưng vấn đề ở đây là gì? Việc triển khai nào trong hai triển khai này sau NIST FIPS 202 theo cách thích hợp và làm cách nào để chúng ta biết điều đó?

+3

Vấn đề là, SHA3 là Keccak được sửa đổi. Qt dường như tính toán Keccak, không phải SHA3. Oh well. https://bugreports.qt.io/browse/QTBUG-59770 – peppe

+0

Đó là những gì bạn nhận được nếu bạn tạo mã và gọi nó là SHA-3 trước khi tiêu chuẩn được chính thức chấp nhận. Các tác giả nên đã triển khai số phiên bản Keccac + thay vì "SHA-3". Có lẽ họ nên đổi tên việc thực hiện "NSSHA" của họ cho Non-Standard-Secure-Hash-Algorithm ": P –

+0

Vâng, nó có thể được đổi tên thành Keccak một cách an toàn, nhưng đó không phải là SHA3. – peppe

Trả lời

2

Tôi đang viết thư viện Keccak cho Java vào lúc này, vì vậy tôi đã có đồ chơi tiện dụng để kiểm tra sự nghi ngờ ban đầu.

Đầu tiên tóm tắt ngắn gọn. Keccak là một hàm bọt biển có thể lấy một số tham số (bitrate, dung lượng, hậu tố tên miền và độ dài đầu ra). SHA-3 chỉ đơn giản là một tập hợp con của Keccak, nơi các giá trị này đã được chọn và được chuẩn hóa bởi NIST (trong FIPS PUB 202).

Trong trường hợp của SHA3-224, các thông số như sau:

bitrate: 1152 
capacity: 448 
domain suffix: "01" 
output length: 224 (hence the name SHA3-224) 

Điều quan trọng cần lưu ý là các hậu tố tên miền là một bitstring mà được nối sau khi thông báo đầu vào và trước khi đệm. Hậu tố tên miền là một cách tùy chọn để phân biệt các ứng dụng khác nhau của hàm Keccak (như SHA3, SHAKE, RawSHAKE, v.v.). Tất cả các hàm SHA3 sử dụng "01" làm hậu tố tên miền.

Dựa trên tài liệu, tôi có ấn tượng rằng Keccak ban đầu không có khái niệm hậu tố tên miền và các bài kiểm tra đã biết được cung cấp bởi nhóm Keccak yêu cầu không sử dụng hậu tố tên miền.

Vì vậy, cho vấn đề của bạn. Nếu chúng ta lấy String "test" và chuyển đổi nó thành mảng byte sử dụng mã hóa ASCII hoặc UTF-8 (vì Keccak hoạt động trên nhị phân, vì vậy văn bản phải được chuyển đổi thành byte hoặc bit trước tiên, và do đó quan trọng là phải quyết định mã hóa ký tự nào sử dụng) sau đó ăn nó vào một chức năng SHA3-224 băm thật chúng tôi sẽ có được kết quả như sau (đại diện trong hệ thập lục phân, 16 byte để một dòng cho dễ đọc):

37 97 BF 0A FB BF CA 4A 7B BB A7 60 2A 2B 55 27 
46 87 65 17 A7 F9 B7 CE 2D B0 AE 7B 

SHA3-224 có thể được tóm tắt như Keccak[1152, 448](M || "01", 224) trong đó M || "01" có nghĩa là "nối thêm 01 sau thông điệp đầu vào và trước khi chèn nhiều tỷ lệ".

Tuy nhiên, không có hậu tố tên miền, chúng tôi nhận được Keccak[1152, 448](M, 224) trong đó M đơn lẻ có nghĩa là không có bit hậu tố nào được nối thêm và phần đệm đa tốc độ sẽ bắt đầu ngay sau thông báo đầu vào.Nếu chúng ta ăn vào cùng một "test" thông điệp của bạn để chức năng này Keccak mà không sử dụng một hậu tố tên miền sau đó chúng tôi nhận được kết quả sau (một lần nữa trong hex):

3B E3 0A 9F F6 4F 34 A5 86 11 16 C5 19 89 87 AD 
78 01 65 F8 36 6E 67 AF F4 76 0B 5E 

Vì vậy, kết quả này chỉ ra rằng chức năng là không SHA3-224.

Tất cả có nghĩa là sự khác biệt về đầu ra mà bạn đang xem được giải thích hoàn toàn bởi sự hiện diện hoặc vắng mặt của hậu tố tên miền "01" (tức là nghi ngờ ngay lập tức của tôi khi đọc câu hỏi của bạn). Bất cứ điều gì mà tuyên bố là SHA3 phải sử dụng hậu tố tên miền "01", vì vậy hãy cảnh giác với các công cụ hoạt động khác nhau. Kiểm tra tài liệu cẩn thận để đảm bảo rằng chúng không yêu cầu bạn chỉ định hậu tố tên miền mong muốn khi tạo/sử dụng đối tượng hoặc hàm, nhưng bất kỳ thứ gì được cho là SHA3 thực sự sẽ không làm cho nó có thể quên các bit hậu tố.

Các vấn đề liên quan