Xem mẫu
- HộiHội
Thảo Quốc
Thảo QuốcGia
Gia2015
2015về
về Điện Tử, Truyền
Điện Tử, ThôngvàvàCông
Truyền Thông CôngNghệ
Nghệ Thông
Thông Tin Tin (ECIT
(ECIT 2015)
2015)
Hiệu Năng Mã Hóa Với Tập Lệnh AES-NI
Nguyễn Tuấn Anh#, Lương Thế Dũng#, Nguyễn Thị Trang*
#
Khoa An toàn thông tin – Học viện Kỹ thuật mật mã
*
Khoa Công nghệ thông tin – Học viện Công nghệ bưu chính viễn thông
Email: tuananh1982act@gmail.com, thedungluong@gmail.com, trangmamcnttptit11@gmail.com
Abstract— Bài báo này giới thiệu tập lệnh hợp ngữ trong một số thể viết những chương trình mã hóa/giải mã bằng AES với tốc
dòng vi xử lý Intel thế hệ mới cho phép tăng đáng kể tốc độ mã độ cao hơn hẳn so với cài đặt mềm thông thường. Đến nay đã
hóa, giải mã với thuật toán AES. Các tác giả sẽ làm rõ những có nhiều ứng dụng và thư viện mật mã có khả năng làm việc
điểm đặc biệt khi sử dụng một trong số các lệnh đó để mở rộng với tập lệnh này. Danh sách cụ thể các ứng dụng và thư viện đó
khóa; đây là vấn đề chưa được trình bày trong các tài liệu về tập
có thể tham khảo tại [3].
lệnh này. Đồng thời, bài báo cũng giới thiệu kết quả thực nghiệm
về tốc độ mã hóa, giải mã mà các tác giả đã đạt được khi nghiên II. TẬP LỆNH AES-NI
cứu tập lệnh nói trên. Một trong những kết quả quan trọng mà
các tác giả thu được là sự chênh lệch không đáng kể về tốc độ mã Tập lệnh AES-NI bao gồm 6 lệnh hợp ngữ, trong đó có 2
hóa, giải mã khi sử dụng tập lệnh nói trên để viết chương trình lệnh để mã hóa, 2 lệnh để giải mã và 2 lệnh để tạo khóa vòng.
cho nền tảng 32 bit và nền tảng 64 bit. Hai lệnh để mã hóa là AESENC và AESENCLAST. Trong đó
lệnh AESENCLAST là để mã hóa vòng cuối cùng, lệnh
Keywords- AES-NI, cứng hóa AES, tăng tốc mã hóa. AESENC là để mã hóa một vòng đối với tất các vòng còn lại.
Tương tự, hai lệnh để giải mã là AESDEC và AESDECLAST.
I. GIỚI THIỆU Trong đó, lệnh AESDECLAST thực hiện giải mã vòng cuối
Như đã biết, mật mã là công cụ quan trọng hàng đầu trong cùng, còn lệnh AESDEC thực hiện giải mã một vòng đối với
lĩnh vực an toàn thông tin. Nếu xét riêng lĩnh vực công nghệ tất cả các vòng còn lại. Hai lệnh để tạo khóa vòng là
thông tin và viễn thông thì nhiệm vụ đảm bảo an toàn thông tin AESKEYGENASSIST và AESIMC. Trong đó,
sẽ không thể đạt được nếu không có mật mã. Tuy nhiên, việc AESKEYGENASSIST được sử dụng để tạo khóa vòng mã
áp dụng các thao tác mật mã vào quá trình xử lý thông tin sẽ hóa, tức là để mở rộng khóa (key expansion), còn AESIMC
làm chậm đáng kể quá trình này. Do vậy, bên cạnh việc nghiên được sử dụng để tạo khóa giải mã. AES hỗ trợ hai phương án
cứu và xây dựng những hệ mật tốt thì việc nghiên cứu các giải giải mã. Phương án thứ nhất là trong từng vòng phải đảo trật tự
pháp cải thiện hiệu năng làm việc của các hệ mật cũng có ý các phép biến đổi SubBytes, ShiftRow, MixColumn,
nghĩa to lớn trong an toàn thông tin. AddRoundKey. Trong trường hợp này, khóa giải mã cũng
Vào ngày 02/01/1997, Viện tiêu chuẩn và kỹ thuật quốc gia chính là khóa giải mã (nhưng dùng với trật tự đảo ngược).
Mỹ (NIST) đã khởi động chương trình xây dựng chuẩn mật mã Phương án thứ hai là giữ nguyên trật tự các phép biến đổi trên
mới để thay thế cho chuẩn mật mã lúc bấy giờ là DES [1]. trong từng vòng, nhưng bên cạnh việc sử dụng khóa vòng với
Trong đó, NIST xác định việc xây dựng chuẩn mật mã mới sẽ trật tự đảo ngược thì cần thực hiện biến đổi nhất định lên khóa
dựa vào công sức của cộng đồng quốc tế thông qua việc tổ vòng mã hóa để thu được khóa vòng giải mã. Phép biến đổi
chức cuộc thi để tìm ra thuật toán mật mã tốt nhất. Đồng thời, khóa vòng này chính là được thực hiện bởi lệnh AESIMC. Bên
NIST cũng đặt ra yêu cầu bắt buộc đối với các ứng viên là cạnh tập lệnh trên đây, Intel cũng đưa vào lệnh PCLMULQDQ
thuật toán của họ sẽ được miễn phí cho mọi người dùng nếu (Carry-Less Multiplication) cho phép thực hiện phép nhân trên
được chọn làm chuẩn. Đến ngày 02/10/2000, NIST công bố trường hữu hạn đối với các hạng tử 64 bit. Lệnh này được sử
thuật toán Rijndael được chọn làm chuẩn mật mã mới, gọi là dụng để cài đặt một cách hiệu quả thuật toán AES ở chế độ
AES (Advanced Encryption Standard); chuẩn này được ban Galois Counter Mode (AES-GCM) [4].
hành chính thức bởi NIST vào năm 2001 [2]. Đến nay, AES đã Cú pháp cũng như chức năng của các lệnh AES-NI được
được hỗ trợ bởi hầu hết các sản phẩm có chức năng mật mã. trình bày trong tài liệu [5] của Intel. Tuy nhiên nếu cách thức
Mặc dù AES được cho là có hiệu năng thực thi cao cả khi sử dụng các lệnh mã hóa, giải mã là đơn giản, rõ ràng thì lệnh
cái đặt bằng phần mềm và phần cứng, nhưng dù sao thì tốc độ tạo khóa vòng AESKEYGENASSIST lại khá rối rắm, khó
mã hóa/giải mã bằng phần mềm còn kém nhiều so với các phần hiểu. Có lẽ người lập trình sẽ mong đợi rằng mỗi lần gọi lệnh
cứng chuyên dụng. Tuy vậy, phần cứng mật mã chuyên dụng AESKEYGENASSIST thì sẽ thu được một khóa vòng, tức là
lại đắt đỏ và kém linh hoạt hơn hẳn so với phần mềm. Vào năm nó có tính trọn vẹn như các lệnh còn lại. Tuy nhiên thực tế
2008, hãng sản xuất vi xử lý Intel đã đưa ra giải pháp cho phép không như vậy. Dù rằng kích thước giá trị đầu ra của lệnh trên
dung hòa ưu, nhược điểm của cài đặt cứng và cài đặt mềm đối là 128 bit nhưng để tạo được một khóa vòng 128 bit thì cần gọi
với AES, đó là tập lệnh AES-NI (AES New Instructions) bao lệnh trên và sau đó là một loạt lệnh khác nữa. Trong tài liệu
gồm 6 lệnh hợp ngữ được hỗ trợ bởi một số dòng vi xử lý mới [5], Intel chỉ đưa ra đoạn mã để thực hiện sinh khóa vòng mà
của Intel và AMD. Bằng việc sử dụng tập lệnh này, người ta có hoàn toàn không giải thích bản chất của chúng; cũng như
không đề cập đến việc có thể sử dụng một bộ lệnh khác (sau
ISBN: 978-604-67-0635-9 327
327
- HộiHội
Thảo Quốc
Thảo Gia
Quốc 2015
Gia 2015vềvềĐiện
ĐiệnTử,
Tử,Truyền
TruyềnThông và Công
Thông và CôngNghệ
NghệThông
ThôngTinTin (ECIT
(ECIT 2015)
2015)
lệnh AESKEYGENASSIST) để đạt được cùng mục đích là III. HIỆU NĂNG MÃ HÓA, GIẢI MÃ
sinh khóa vòng. Ví dụ, dựa trên mã nguồn của CyaSSL [6], Để đánh giá hiệu năng mã hóa, giải mã khi sử dụng tập lệnh
chúng tôi đã sử dụng một bộ 10 lệnh dưới đây để thay cho bộ AES-NI, chúng tôi viết chương trình mã hóa, giải mã sử dụng
20 lệnh mà Intel đề xuất trong [5]: tập lệnh này với hai phiên bản khác nhau: một cho nền tảng 32
aeskeygenassist xmm1, xmm2, 01h bit và một cho nền tảng 64 bit. Cả hai phiên bản này đều thực
pshufd xmm1, xmm1, 0FFh hiện mã hóa, giải mã theo chế độ ECB với AES-128. Nguyên
movdqu xmm3, xmm2 mẫu hàm mã hóa cho cả hai phiên bản có dạng:
pslldq xmm3, 4 void aes128_encrypt_ecb(unsigned char* buf,
pxor xmm2, xmm3 unsigned char *expanded_key, int block_num)
pslldq xmm3, 4 Trong đó tham số buf trỏ đến vùng đệm chứa dữ liệu cần
pxor xmm2, xmm3 mã hóa, bản mã sẽ được ghi lên chính vùng đệm này; tham số
pslldq xmm3, 4 expanded _key trỏ đến các khóa vòng mã hóa; và tham số
block_num cho biết kích thước dữ liệu tính theo khối (16
pxor xmm2, xmm3
bytes). Hàm mã hóa cũng có cú pháp hoàn toàn tương tự.
pxor xmm2, xmm1 Sở dĩ cần viết chương trình với hai phiên bản 32 bit và 64
Chức năng của lệnh AESKEYGENASSIST được Intel giải bit là vì lý do như sau. Các lệnh AES-NI chủ yếu được thực
thích trong [5] bằng đoạn giả mã như sau: hiện trên các thanh ghi XMM 128 bit. Khi viết chương trình
AESKEYGENASSIST xmm1, xmm2/m128, imm8 cho nền tảng 64 bit, người lập trình có thể sử dụng 16 thanh ghi
Tmp := xmm2/LOAD(m128) như vậy (XMM0-XMM15). Trong trường hợp đó, có thể nạp
X3[31-0] := Tmp[127-96]; sẵn tất cả các khóa vòng vào các thanh ghi này, sau đó các khối
X2[31-0] := Tmp[95-64]; được mã hóa/giải mã bằng khóa đã chứa sẵn trong các thanh
ghi; tức là cho dù có bao nhiêu khối dữ liệu trong vùng đệm đi
X1[31-0] := Tmp[63-32];
nữa thì cũng chỉ phải thực hiện duy nhất một lần việc nạp khóa
X0[31-0] := Tmp[31-0]; vòng từ bộ nhớ vào thanh ghi. Điều này giúp giảm thiểu thời
RCON[7-0] := imm8; gian truy xuất khóa vòng. Trong trường hợp viết chương trình
xmm1 := [Rot (SubWord (X3)) RCON, SubWord cho nền tảng 32 bit, chỉ có 8 trong số 16 thanh ghi (XMM0-
(X3), Rot (SubWord (X1)) RCON, XMM7) là có thể sử dụng được. Do đó, chỉ có thể nạp sẵn một
SubWord (X1)] phần khóa vòng; các khóa còn lại phải được nạp từ bộ nhớ mỗi
khi cần sử dụng để mã hóa các khối.
Theo đó, nếu biểu diễn 128 bit đầu vào (xmm2) dưới dạng
Trong phần này chúng tôi cũng sử dụng một chương trình
bộ 4 từ 32 bit (w0, w1, w2, w3) thì đầu ra (xmm1) sẽ có dạng
cài đặt AES bằng ngôn ngữ C++ đã được tối ưu hóa và không
(w4, w5, w6, w7). Trong khi đó, theo yêu cầu của AES thì
sử dụng AES-NI để so sánh hiệu năng với chương trình sử
khóa vòng tương ứng phải có dạng (w4w0, w4w0w1, dụng AES-NI nói trên. Việc thử nghiệm được tiến hành trên
w4w0w1w2, w4w0w1w2w3). Như vậy, để thu máy có cấu hình: Intel Core i5-3210M 2,5GHz, RAM 4GB,
được khóa vòng cần thiết thì sau khi gọi lệnh Windows 7 64-bit.Kết quả thử nghiệm mã hóa 10 GB dữ liệu
AESKEYGENASSIST cần phải thực hiện thêm các lệnh khác với các kích thước vùng đệm khác nhau được thể hiện trên
để đưa đầu ra về dạng mong đợi. Hình 1. Trong đó, trục hoành là kích thước của vùng đệm tính
- Lệnh pshufd đưa xmm1 về dạng (w4, w4, w4, w4). bằng số khối, mỗi khối 16 bytes; trục tung là tốc độ mã hóa
- Cặp lệnh (pslldq, pxor) thứ nhất đưa xmm2 về dạng (w0, tính bằng MB/s.
w0w1, w1w2, w2w3).
- Cặp lệnh (pslldq, pxor) thứ hai đưa xmm2 về dạng (w0,
w0w1, w0w1w2, w1w2w3).
- Cặp lệnh (pslldq, pxor) thứ ba đưa xmm2 về dạng (w0,
w0w1, w0w1w2, w0w1w2w3).
- Lệnh pxor cuối cùng đưa xmm2 về dạng (w4w0,
w4w0w1, w4w0w1w2, w4w0w1w2 w3). Và
đây chính là khóa vòng cần có.
Câu hỏi đặt ra là tại sao Intel không thiết kế lệnh
AESKEYGENASSIST để nó thực hiện tất cả các thao tác trên
đây? Có lẽ là vì AES hỗ trợ 3 kích thước khóa khác nhau, và
thủ tục mở rộng khóa có sự khác nhau nhất định cho ba kích
thước khóa này. Mặt khác, người ta chỉ phải thực hiện duy nhất Hình 1. Tốc độ mã hóa bằng AES.
một lần mở rộng khóa cho mỗi phiên mã hóa/giải mã, do đó tốc
độ thực thi mở rộng khóa không thực sự quan trọng. Có thể dễ dàng nhận thấy chương trình mã hóa sử dụng tập
lệnh AES-NI cho tốc độ cao hơn hẳn so với chương trình mã
hóa không sử dụng tập lệnh này. Cụ thể, chương trình mã hóa
không sử dụng tập lệnh AES-NI đạt được tốc độ 155 MB/s,
328
328
- HộiHội
Thảo Quốc
Thảo Gia
Quốc 2015
Gia 2015vềvềĐiện
ĐiệnTử,
Tử,Truyền
TruyềnThông và Công
Thông và CôngNghệ
NghệThông
ThôngTinTin (ECIT
(ECIT 2015)
2015)
trong khi chương trình mã hóa sử dụng tập lệnh AES-NI đạt thước vùng đệm vào khoảng 60 khối, tức là 960 byte. Như vậy,
được tốc độ 2040 MB/s cho phiên bản 32 bit và tốc độ 2120 để đạt được tốc độ mã hóa, giải mã cao nhất, nên sử dụng vùng
MB/s cho phiên bản 64 bit. đệm có kích thước tối thiểu 1 KB. Đây là giá trị rất nhỏ so với
Mặt khác, kết quả thử nghiệm cho thấy sự chênh lệch tốc kích thước vùng đệm được sử dụng trong thực tế.
độ mã hóa giữa phiên bản 32 bit và phiên bản 64 bit không
như dự kiến. Trước khi thử nghiệm, chúng tôi dự kiến rằng, vì
trong phiên bản 64 bit chỉ phải nạp khóa vòng từ bộ nhớ một IV. KẾT LUẬN
lần duy nhất, trong khi đối với phiên bản 32 bit thì một số khóa Tập lệnh AES-NI trong các dòng vi xử lý đời mới của Intel
vòng sẽ phải được nạp từ bộ nhớ khi mã hóa mỗi khối, do đó và AMD cho phép đạt được tốc độ mã hóa và giải mã bằng
tốc độ của phiên bản 64 bit phải lớn hơn đáng kể so với phiên AES cao hơn hẳn so với khi cài đặt thuật toán này sử dụng các
bản 32 bit. Tuy nhiên, như có thể thấy trên Hình 1, chênh lệch lệnh tính toán đa dụng. Cụ thể, trên máy tính có CPU Intel
về tốc độ giữa hai phiên bản này là không nhiều. Điều này có Core i5-3210M 2,5 GHz, RAM 4GB và Windows 7 64-bit,
thể được giải thích bởi cơ chế bộ nhớ đệm (cache) trong các vi chúng tôi đạt được tốc độ mã hóa là 2120 MB/s và tốc độ giải
xử lý hiện đại của Intel. Theo đó, có những khóa vòng tuy mã là 1950 MB/s. Để đạt được tốc độ mã hóa và giả mã cao
không được nạp vào thanh ghi nhưng được lưu sẵn trong bộ nhất, cần sử dụng vùng đệm có kích thước tối thiểu là 1 KB.
nhớ cache, việc nạp khóa vòng được thực hiện từ bộ nhớ cache Phần mềm viết cho nền tảng 64 bit có lợi thế so với phần
chứ không phải từ RAM, do đó sự chênh lệch tốc độ giữa hai mềm viết cho nền tảng 32 bit về số lượng thanh ghi XMM để
phiên bản là không nhiều. nạp trước các khóa vòng; tuy nhiên lợi thế đó không mang lại
Tương tự như trên, chúng tôi thử nghiệm việc giải mã và sự khác biệt về tốc độ. Do vậy, khi phát triển phần mềm có
thu được kết quả như trên Hình 2. chức năng mật mã (và có sử dụng AES-NI) thì không cần phải
xây dựng hai phiên bản 32 bit và 64 bit nếu chỉ vì muốn đạt
được tốc độ mã hóa/giải mã cao hơn trong nền tảng 64 bit; thay
vào đó, chỉ cần xây dựng phiên bản 32 bit là đủ.
TÀI LIỆU THAM KHẢO
[1] Mitchell C. Richards, "AES: The Making of a New Encryption
Standard, SANS Institute," Tech. Rep. 2001.
[2] Advanced Encryption Standard (AES), NIST std. FIPS PUB 197, 2001.
[3] AES Instruction Set. [Online]. Available:
https://en.wikipedia.org/wiki/AES_instruction_set#Libraries.
Hình 2. Tốc độ giải mã bằng AES. [4] Shay Gueron , Intel® Carry-Less Multiplication Instruction and its
Usage for Computing the GCM Mode - Rev 2.02. [Online]. Available:
Trong trường hợp này, tốc độ giải mã của chương trình có https://software.intel.com/en-us/articles/intel-carry-less-multiplication-
instruction-and-its-usage-for-computing-the-gcm-mode/.
sử dụng tập lệnh AES-NI cũng cao hơn hẳn so với chương
[5] Intel Advanced Encryption Standard (AES) New Instructions Set, Intel,
trình không sử dụng tập lệnh này. Cụ thể, chương trình không 2012.
sử dụng tập lệnh AES-NI đạt được tốc độ 146 MB/s trong khi [6] AES Implementation in CYASSL. [Online]. Available:
chương trình có sử dụng tập lệnh đó đạt được tốc độ 1880 https://github.com/cyassl/cyassl/blob/master/ctaocrypt/src/aes_asm.s.
MB/s (đối với phiên bản 32 bit) và 1950 MB/s (đối với phiên [7] Manley, Raymond, and David Gregg, "A program generator for intel
bản 64 bit). Điều này cũng cho thấy rằng sự chênh lệnh tốc độ AES-NI instructions," Progress in Cryptology-INDOCRYPT 2010.
Springer Berlin Heidelberg, 2010, pp.311-327.
giữa phiên bản 32 bit và phiên bản 64 bit là không nhiều.
[8] Bharata Rao. Inline assembly for x86 in Linux. [Online]. Available:
Cũng từ Hình 1 và Hình 2 có thể thấy được tốc độ mã hóa http://www.ibm.com/developerworks/library/l-ia/.
và giải mã khi sử dụng tập lệnh AES-NI phụ thuộc rõ rệt vào [9] Reducing the Impact of Misaligned Memory Accesses. [Online].
kích thước vùng đệm. Nếu kích thước vùng đệm là 1 khối, Available: https://software.intel.com/en-us/articles/reducing-the-impact-
tương đương 16 byte, thì tốc độ mã hóa và giải mã chỉ đạt of-misaligned-memory-accesses.
khoảng 500 KB/s. Nếu tăng kích thước vùng đệm thì tốc độ mã
hóa, giải mã cũng tăng theo; tốc độ cực đại đạt được khi kích
329
329
nguon tai.lieu . vn