Blowfish là thuật toán mật mã khối đối xứng mã hóa khối 64-bit mỗi lần. Tuân theo mạng Feistel, quy trình làm việc chia thành 2 phần:
Tạo khóa con (Subkey Generation) - Chuyển khóa lên đến 448-bit thành khóa con tổng 4168 bit.
Mã hóa dữ liệu (Data-Encryption) - Lặp 16 lần mạng. Mỗi vòng chứa hoán vị phụ thuộc khóa, và thay thế phụ thuộc khóa và dữ liệu. Phép toán trong thuật toán là XOR hoặc cộng trên từ 32-bit. Phép toán thêm chỉ là 4 tra bảng chỉ mục mỗi vòng.
Thảo luận 2 phần:
Tạo khóa con - Blowfish dùng số lượng lớn khóa con. Khóa tạo trước mã hóa/giải mã dữ liệu.
Mảng P chứa 18 khóa con 32-bit: P1, P2,..., P18.
4 S-box 32-bit, mỗi 256 mục: S1,0...S1,255; S2,0...S2,255; S3,0...S3,255; S4,0...S4,255.
Các bước tạo khóa con
Khởi tạo mảng P và 4 S-box theo thứ tự với chuỗi cố định, chuỗi này cũng chứa chữ số hex của π. P1=0x243f6a88, P2=0x85a308d3, P3=0x13198a2e, P4=0x3707344, v.v.
XOR P1 với 32-bit đầu khóa, XOR P2 với 32-bit thứ 2, v.v. cho tất cả bit khóa (có thể đến P14). Lặp chu trình qua bit khóa cho đến khi toàn bộ mảng P đã XOR với bit khóa. (Với khóa ngắn, có khóa dài tương đương. Ví dụ A khóa 64-bit, thì AA, AAA... là khóa tương đương.)
Mã hóa chuỗi toàn số 0 bằng Blowfish, dùng khóa con bước 1 và 2.
Thay P1, P2 bằng đầu ra 64-bit bước (3).
Mã hóa đầu ra bước (3) dùng thuật toán với khóa con đã thay đổi.
Thay P3, P4 bằng đầu ra bước (5).
Tiếp tục thủ tục, thay tất cả mục mảng P, rồi 4 S-box theo thứ tự, bằng đầu ra thuật toán liên tục thay đổi.
Tổng 521 lần lặp cần thiết tạo tất cả khóa con cần thiết. Ứng dụng có thể lưu khóa con thay vì dẫn xuất nhiều lần.
Mã hóa dữ liệu - Blowfish là mạng Feistel 16 vòng.
Đầu vào: yếu tố dữ liệu 64-bit, x.
Chia x thành 2 nửa 32-bit: xL, xR.
Với i = 1 đến 16:
xL = xL XOR Pi
xR = F(xL) XOR xR
Hoán đổi xL và xR
Sau vòng 16, hoán đổi xL và xR lại để undo hoán đổi cuối.
Sau đó, bản mã = nối xL và xR, xR = xR XOR P17 và xL = xL XOR P18.
Cuối cùng, gộp xL và xR lấy bản mã. Giải mã giống mã hóa, trừ P1...P18 dùng theo thứ tự ngược.