Xem mẫu

  1. 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
  2. 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 (w4w0, w4w0w1, dụng AES-NI nói trên. Việc thử nghiệm được tiến hành trên w4w0w1w2, w4w0w1w2w3). 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. w0w1, w1w2, w2w3). - Cặp lệnh (pslldq, pxor) thứ hai đưa xmm2 về dạng (w0, w0w1, w0w1w2, w1w2w3). - Cặp lệnh (pslldq, pxor) thứ ba đưa xmm2 về dạng (w0, w0w1, w0w1w2, w0w1w2w3). - Lệnh pxor cuối cùng đưa xmm2 về dạng (w4w0, w4w0w1, w4w0w1w2, w4w0w1w2 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
  3. 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