<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog Khoa Học Máy Tính &#187; Bảo mật và mật mã học</title>
	<atom:link href="http://www.procul.org/blog/category/b%e1%ba%a3o-m%e1%ba%adt-va-m%e1%ba%adt-ma-h%e1%bb%8dc/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.procul.org/blog</link>
	<description>Tầm nhìn ta thật ngắn mà đã thấy bao thứ  để làm -- Alan Turing</description>
	<lastBuildDate>Wed, 08 Feb 2012 20:06:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Bạn phá mã được không?</title>
		<link>http://www.procul.org/blog/2011/12/02/b%e1%ba%a1n-pha-ma-d%c6%b0%e1%bb%a3c-khong/</link>
		<comments>http://www.procul.org/blog/2011/12/02/b%e1%ba%a1n-pha-ma-d%c6%b0%e1%bb%a3c-khong/#comments</comments>
		<pubDate>Fri, 02 Dec 2011 18:52:06 +0000</pubDate>
		<dc:creator>thaidn</dc:creator>
				<category><![CDATA[Bảo mật và mật mã học]]></category>
		<category><![CDATA[Dành cho du học sinh]]></category>
		<category><![CDATA[Vui - Giải Trí]]></category>
		<category><![CDATA[Bảo mật]]></category>
		<category><![CDATA[Phá mã]]></category>

		<guid isPermaLink="false">http://www.procul.org/blog/?p=4118</guid>
		<description><![CDATA[Câu hỏi phỏng vấn thú vị của GCHQ: Giải được câu này sẽ còn hai câu tiếp theo. GCHQ được xem là NSA của Anh quốc. Cụ Alan Turing từng làm việc ở đây thời chiến tranh thế giới thứ hai. GCHQ cũng là nơi phát minh ra mật mã khóa công khai vào năm 1973, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.canyoucrackit.co.uk/">Câu hỏi phỏng vấn</a> thú vị của <a href="http://en.wikipedia.org/wiki/Government_Communications_Headquarters">GCHQ</a>:</p>
<p><img class="alignnone" title="Can you crack it?" src="http://www.canyoucrackit.co.uk/images/cyber.png" alt="" width="740" height="260" /></p>
<p>Giải được câu này sẽ còn hai câu tiếp theo. GCHQ được xem là <a href="http://www.nsa.gov">NSA</a> của Anh quốc. Cụ Alan Turing từng <a href="http://www.procul.org/blog/2011/10/27/m%E1%BA%ADt-ma-hi%E1%BB%87n-d%E1%BA%A1i-2/">làm việc ở đây</a> thời chiến tranh thế giới thứ hai. GCHQ cũng là nơi phát minh ra <a href="http://en.wikipedia.org/wiki/Asymmetric_key_algorithm#History">mật mã khóa công khai</a> vào năm 1973, 3 năm trước Diffie-Hellman và 4 năm trước RSA.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.procul.org/blog/2011/12/02/b%e1%ba%a1n-pha-ma-d%c6%b0%e1%bb%a3c-khong/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Mật mã hiện đại (2)</title>
		<link>http://www.procul.org/blog/2011/10/27/m%e1%ba%adt-ma-hi%e1%bb%87n-d%e1%ba%a1i-2/</link>
		<comments>http://www.procul.org/blog/2011/10/27/m%e1%ba%adt-ma-hi%e1%bb%87n-d%e1%ba%a1i-2/#comments</comments>
		<pubDate>Thu, 27 Oct 2011 06:04:10 +0000</pubDate>
		<dc:creator>thaidn</dc:creator>
				<category><![CDATA[Bảo mật và mật mã học]]></category>
		<category><![CDATA[Toán Ứng Dụng]]></category>

		<guid isPermaLink="false">http://www.procul.org/blog/?p=3921</guid>
		<description><![CDATA[Mới đây mà đã gần 10 tháng kể từ ngày tôi viết phần 1 của loạt bài này. Tôi bắt đầu phần 2 này cách đây cũng khá lâu, nhưng gặp trở ngại khi viết mã LaTex trên Blogger nên cứ chần chừ rồi quên hẳn. Hồi tháng 4, anh Phan Dương Hiệu có viết một [...]]]></description>
			<content:encoded><![CDATA[<p>Mới đây mà đã gần 10 tháng kể từ ngày tôi viết <a href="http://vnhacker.blogspot.com/2010/05/mat-ma-hien-ai-1.html">phần 1</a> của loạt bài này. Tôi bắt đầu phần 2 này cách đây cũng khá lâu, nhưng gặp trở ngại khi viết mã LaTex trên Blogger nên cứ chần chừ rồi quên hẳn. Hồi tháng 4, anh Phan Dương Hiệu có viết một bài rất công phu về <a href="http://www.procul.org/blog/2011/04/12/m%E1%BA%ADt-ma-khoa-cong-khai-s%E1%BB%B1-phat-tri%E1%BB%83n-t%C6%B0%C6%A1ng-h%E1%BB%97-v%E1%BB%9Bi-cac-nganh-khoa-h%E1%BB%8Dc-khac/">hành trình 35 năm của mật mã khóa công khai.</a> Hôm nay ngồi đọc lại bài viết rất hay đó tự dưng tôi thấy&#8230; nao nao và quyết định là phải viết tiếp loạt bài này. Phần thứ 2 này tôi sẽ điểm lại lịch sử của mật mã. Bạn nào có cuốn KL thì có thể đọc chương 1 và chương 2. Trong hai phần tiếp theo tôi sẽ giới thiệu mã dòng (stream cipher) và mã khối (block cipher).</p>
<p>&#8212;-</p>
<p><span id="more-3921"></span></p>
<p><strong>II. Lịch sử</strong></p>
<blockquote><p>We stand today on the brink of a revolution in cryptography.</p></blockquote>
<p>Whitfield Diffie và Martin Hellman đã viết đầy hứng khởi như thế trong bài báo <a href="http://securespeech.cs.cmu.edu/reports/DiffieHellman.pdf">New Directions in Cryptography</a> công bố năm 1976. Quả đúng như vậy. Trước Diffie-Hellman, mật mã là sân chơi của quân đội, chính phủ và những tập đoàn lớn. Nếu tôi không lầm thì công trình nghiên cứu về mật mã duy nhất được phổ biến rộng rãi là cuốn <a href="http://www.amazon.com/Codebreakers-Comprehensive-History-Communication-Internet/dp/0684831309">The Codebreakers</a> xuất bản lần đầu năm 1967 của David Kahn. Bài báo của Diffie-Hellman vừa khai sinh ra mật mã khóa công khai, vừa đánh dấu sự bắt đầu của mật mã hiện đại. Trong vòng vài chục năm, mật mã từ một nghệ thuật đã trở thành một ngành khoa học được giảng dạy và nghiên cứu khắp nơi trên thế giới. Các ứng dụng của mật mã không chỉ còn gói gọn trong ngành công nghiệp quốc phòng mà đã hiện diện trong mọi mặt của đời sống hàng ngày (mời bạn xem thêm bài của anh Hiệu). Mật mã hiện đại cũng là đề tài của loạt bài viết này. Tuy vậy, mật mã là một trong những nghệ thuật cổ xưa nhất của loài người với lịch sử hàng ngàn năm và tôi không thể viết về mật mã mà không giới thiệu sơ qua về lịch sử phát triển của ngành. Dẫu vậy, tôi cũng lưu ý là phần giới thiệu dưới đây chỉ là &#8220;cưỡi ngựa xem hoa&#8221;, bạn nào muốn tìm hiểu ngọn ngành thì nên đọc cuốn The Codebreakers.</p>
<p>Từ xa xưa, mật mã là nghệ thuật giữ bí mật nhằm giải quyết vấn đề truyền thông tin an toàn giữa người gửi và người nhận. Chẳng hạn như nhà vua cần truyền mệnh lệnh cho tướng ngoài mặt trận. Một cách đơn giản là ông ấy viết mệnh lệnh vào một lá thư, rồi gửi cho người đưa tin và người này sẽ đi từ kinh thành ra mặt trận để trao thư. Với cách làm này, ông vua không có cách nào đảm bảo được rằng chỉ có tướng quân mới xem được thư. Người đưa thư có thể phản bội, trao thư cho kẻ thù, hoặc họ cũng có thể bị kẻ thù bắt trên đường đi từ kinh thành ra mặt trận. Để giải quyết vấn đề này, nhà vua có thể sử dụng <strong>mã (cipher). </strong>Một mã thường bao gồm 2 hàm:</p>
<ul>
<li><img src='http://s.wordpress.com/latex.php?latex=E&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='E' title='E' class='latex' />: lập mã. Hàm này nhận vào một <strong>bản rõ (plaintext)</strong> <img src='http://s.wordpress.com/latex.php?latex=m&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='m' title='m' class='latex' /> và một <strong>khóa (key)</strong> <img src='http://s.wordpress.com/latex.php?latex=k&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='k' title='k' class='latex' /> rồi xuất ra một <strong>bản mã (ciphertext) </strong><img src='http://s.wordpress.com/latex.php?latex=c&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='c' title='c' class='latex' />.</li>
</ul>
<ul>
<li><img src='http://s.wordpress.com/latex.php?latex=D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='D' title='D' class='latex' />: giải mã. Hàm này nhận vào một bản mã <img src='http://s.wordpress.com/latex.php?latex=c&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='c' title='c' class='latex' /> và một khóa <img src='http://s.wordpress.com/latex.php?latex=k&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='k' title='k' class='latex' /> rồi xuất ra một bản rõ <img src='http://s.wordpress.com/latex.php?latex=m&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='m' title='m' class='latex' />.</li>
</ul>
<p>Các tài liệu mật mã thường gọi ông vua, tướng quân và kẻ thù trong ví dụ ở trên lần lượt là Alice, Bob và Eve, nên tôi cũng sẽ gọi như thế ở đây. Alice và Bob muốn gửi thông điệp cho nhau và không muốn Eve coi trộm. Để sử dụng được một bộ mã, Alice và Bob phải thống nhất với nhau một khóa <img src='http://s.wordpress.com/latex.php?latex=k&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='k' title='k' class='latex' /> mà Eve không biết. Làm sao Alice và Bob làm được điều đó? Chúng ta sẽ cùng đi tìm câu trả lời khi bàn về mã hóa khóa công khai, còn bây giờ cứ giả sử là bằng cách nào đó Alice và Bob đã có chung một khóa <img src='http://s.wordpress.com/latex.php?latex=k&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='k' title='k' class='latex' /> như thế.</p>
<p><strong>1. Mã thay thế (substitution cipher)</strong></p>
<p><em>Lập mã &#8211; Giải mã</em></p>
<p>Ý tưởng của mã thay thế rất đơn giản: thay mỗi ký tự trong <img src='http://s.wordpress.com/latex.php?latex=m&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='m' title='m' class='latex' /> bằng một ký tự khác. Quy tắc thay thế chính là khóa <img src='http://s.wordpress.com/latex.php?latex=k&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='k' title='k' class='latex' />, trong đó mỗi khóa là một hoán vị của bảng chữ cái. Ví dụ:</p>
<pre>Khóa:	(A -&gt; H, B -&gt; N, C -&gt; D, D -&gt; X,..., Z -&gt; Y)
Bản rõ:	ABCZ
Bản mã: HNDY</pre>
<p>Mã thay thế được sử dụng rộng rãi trong nhiều thế kỷ. Tương truyền rằng <a href="http://vi.wikipedia.org/wiki/Julius_Caesar">Julius Caesar</a>, vị lãnh tụ lừng danh của Đế Chế La Mã, đã sử dụng một loại <a href="http://en.wikipedia.org/wiki/Caesar_cipher">mã thay thế</a> để bảo vệ tính bí mật của các văn bản quân sự.</p>
<p><em>Thám mã</em></p>
<p>Người đầu tiên đưa ra phương pháp phá các mã thay thế là Al-Kindi, một người Ả Rập sống vào thế kỷ thứ 9. Sau khi nghiên cứu kỹ lưỡng cuốn kinh Koran, Al-Kindi đã có một quan sát rất thú vị rằng trong một văn bản đủ dài, mỗi ký tự trong bộ chữ cái Ả Rập sẽ xuất hiện với tần suất tương đương với tần suất mà chúng xuất hiện trong kinh Koran. Nói cách khác, tần suất xuất hiện của các ký tự trong một văn bản là ổn định và điều này đúng không chỉ với tiếng Ả Rập mà còn đúng với tiếng Anh và nhiều ngôn ngữ khác (kể cả tiếng Việt?). Ví dụ như trong tiếng Anh, các ký tự xuất hiện nhiều nhất là &#8220;e&#8221; (12.7%), &#8220;t&#8221; (9.1%) và &#8220;a&#8221; (8.1%). Ngoài ra, tần suất của các bộ hai ký tự (digram) và bộ ba ký tự (trigram) cũng ổn định. Ví dụ như trong tiếng Anh, các bộ hai ký tự xuất hiện nhiều nhất luôn là &#8220;th&#8221;, &#8220;he&#8221;, &#8220;an&#8221; và &#8220;in&#8221; và bộ ba ký tự phổ biến nhất là &#8220;tha&#8221;.</p>
<p>Dựa vào quan sát này, Al-Kindi đã đề ra phương pháp thám mã phân tích tần suất (<a href="http://en.wikipedia.org/wiki/Frequency_analysis">frequency analysis</a>). Ý tưởng là tính tần suất của từng ký tự, từng bộ hai ký tự và từng bộ ba ký tự trong bản mã rồi so sánh các tần suất đó với tần suất chuẩn trong ngôn ngữ của bản rõ. Ví dụ như bản rõ là tiếng Anh và sau khi tính tần suất của các ký tự trong bản mã chúng ta nhận thấy &#8220;x&#8221; và &#8220;m&#8221; xuất hiện nhiều nhất thì &#8220;x&#8221; rất có thể là &#8220;e&#8221; và &#8220;m&#8221; có thể là &#8220;t&#8221;. Bước tiếp theo là thử thay thế &#8220;x&#8221; bằng &#8220;e&#8221; và &#8220;m&#8221; bằng &#8220;t&#8221; (cũng như các thay thế thích hợp khác) trong bản mã, rồi xem có xác định được từ hoặc cụm từ có nghĩa nào hay không.</p>
<p>Ngoài phương pháp thủ công này, mục 1.3 cuốn KL có mô tả một thuật toán thực hiện thám mã bằng phân tích tần suất hoàn toàn tự động. Lưu ý rằng phân tích tần suất là dạng tấn công <strong>chỉ biết bản mã (ciphertext-only attack)</strong>, nghĩa là chỉ cần nhìn vào bản mã là có thể tìm được khóa và bản rõ. Đây là một tấn công rất yếu nhưng vẫn đủ mạnh để phá mã thay thế.</p>
<p><strong><em>Bài tập 1</em></strong>: Tính số lượng khóa có thể có của mã thay thế vừa mô tả. Hi vọng con số này sẽ giúp bạn hiểu rằng chiều dài khóa không đảm bảo được sự an toàn của mã và đừng bao giờ xài mã có khóa dài <a href="http://www.schneier.com/crypto-gram-9902.html#snakeoil">1 triệu bit</a> <img src='http://www.procul.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p>
<p><strong>2. Mã Vigenère</strong></p>
<p><em>Lập mã &#8211; Giải mã</em></p>
<p><em></em><a href="http://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher">Mã Vigenère</a> được phát minh vào khoảng thế kỷ 16. Mục tiêu của mã Vigenère rất rõ ràng: chống thám mã bằng phương pháp phân tích tần suất. Nói cách khác, tần suất của các ký tự trong bản mã phải khác với tần suất của các ký tự trong bản rõ. Để đạt được mục tiêu này, những người phát minh ra mã Vigenère đã có một ý tưởng rất hay: chọn <img src='http://s.wordpress.com/latex.php?latex=k&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='k' title='k' class='latex' /> sao cho <img src='http://s.wordpress.com/latex.php?latex=%7Ck%7C%20%3D%20%7Cm%7C&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='|k| = |m|' title='|k| = |m|' class='latex' /> (ký hiệu <img src='http://s.wordpress.com/latex.php?latex=%7Cx%7C&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='|x|' title='|x|' class='latex' /> chỉ chiều dài của x) và mỗi ký tự của <img src='http://s.wordpress.com/latex.php?latex=m&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='m' title='m' class='latex' /> sẽ được mã hóa bằng một ký tự tương ứng của <img src='http://s.wordpress.com/latex.php?latex=k&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='k' title='k' class='latex' />. Nếu xem mỗi ký tự A-Z tương đương với 0-25 thì lập mã bằng mã Vigenère sẽ là <img src='http://s.wordpress.com/latex.php?latex=c_i%20%3D%20E%28k%2C%20m_i%29%20%3D%20%28m_i%20%2B%20k_i%29%20%5Ctext%7B%20mod%2026%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='c_i = E(k, m_i) = (m_i + k_i) \text{ mod 26}' title='c_i = E(k, m_i) = (m_i + k_i) \text{ mod 26}' class='latex' /> và giải mã sẽ là <img src='http://s.wordpress.com/latex.php?latex=m_i%20%3D%20D%28k%2C%20c_i%29%20%3D%20%28c_i%20-%20k_i%29%20%5Ctext%7B%20mod%2026%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='m_i = D(k, c_i) = (c_i - k_i) \text{ mod 26}' title='m_i = D(k, c_i) = (c_i - k_i) \text{ mod 26}' class='latex' />, trong đó <img src='http://s.wordpress.com/latex.php?latex=m%20%3D%20%7Bm_0%7D%5Ccdots%7Bm_n%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='m = {m_0}\cdots{m_n}' title='m = {m_0}\cdots{m_n}' class='latex' /> là bản rõ, <img src='http://s.wordpress.com/latex.php?latex=c%20%3D%20%7Bc_0%7D%5Ccdots%7Bc_n%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='c = {c_0}\cdots{c_n}' title='c = {c_0}\cdots{c_n}' class='latex' /> là bản mã và <img src='http://s.wordpress.com/latex.php?latex=k%3D%7Bk_0%7D%5Ccdots%7Bk_n%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='k={k_0}\cdots{k_n}' title='k={k_0}\cdots{k_n}' class='latex' /> là khóa.</p>
<p>Thực tế thì mã Vigenère có khác một chút so với mô tả ở trên của tôi: thay vì dùng một khóa <img src='http://s.wordpress.com/latex.php?latex=k&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='k' title='k' class='latex' /> ngẫu nhiên với <img src='http://s.wordpress.com/latex.php?latex=%7Ck%7C%20%3D%20%7Cm%7C&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='|k| = |m|' title='|k| = |m|' class='latex' />, người ta dùng một khóa ngắn và lập đi lập lại khóa này cho đến khi dài bằng với bản rõ. Ví dụ như với <img src='http://s.wordpress.com/latex.php?latex=m&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='m' title='m' class='latex' /> là &#8220;TANCONGNGAY&#8221; và <img src='http://s.wordpress.com/latex.php?latex=k&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='k' title='k' class='latex' /> là &#8220;KHMT&#8221; thì mã hóa bằng mã Vigenère sẽ như sau:</p>
<pre>Bản rõ:	TANCONGNGAY
Khóa:	KHMTKHMTKHM
Bản mã: DHZVYUSGQHK</pre>
<p><strong><em>Bài tập 2</em></strong>: Tìm hiểu cách phá mã Vigenère bằng phương pháp phân tích tần suất.</p>
<pre><span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 14px; line-height: 19px; white-space: normal;"><strong>3. Mã máy rôtơ (rotor machines cipher)</strong></span></pre>
<p>Việc phát hiện ra điện năng vào thế kỷ thứ 19 đã dẫn đến sự ra đời của vô vàn máy móc, thiết bị chạy bằng điện và mã máy rôtơ là một trong số đó. Mã máy rôtơ là tên gọi chung của các loại mã mà quá trình lập mã và giải mã được thực hiện bởi các máy rôtơ điện. Mã máy rôtơ nổi tiếng nhất là <a href="http://en.wikipedia.org/wiki/Enigma_machine">máy Enigma</a>, được Đức quốc xã sử dụng trong chiến tranh thế giới thứ II. Tôi sẽ không giải thích cơ chế hoạt động của mã máy rô tơ vì chúng ta sẽ không gặp lại mã này. Thay vào đó, chúng ta sẽ cùng điểm lại một chút thành tựu phá mã Enigma của phe Đồng Minh, mà người đóng góp lớn nhất chính là Alan Turing có-tầm-nhìn-thật-ngắn của chúng ta.</p>
<p>Quay lại năm 1940. Lúc này Pháp đã bị quân Hitler chiếm đóng và Anh là quốc gia duy nhất chống lại Phát Xít ở Tây Âu. Khả năng chiến đấu của Anh phụ thuộc vào nguồn hàng viện trợ từ Mỹ và phe Đồng Minh, được chuyển đến đảo quốc bằng những đoàn tàu hộ tống xuyên Bắc Đại Tây Dương. Những đoàn tàu này thường xuyên phải chơi trò &#8220;trốn tìm&#8221; với đám <a href="http://en.wikipedia.org/wiki/U-boat">tàu ngầm U-boat</a> của Hilter, vốn có nhiệm vụ định vị và đánh chìm tất cả những con tàu viện trợ, hòng làm cho Anh kiệt quệ rồi đầu hàng. Ai thắng ai thua trong trò &#8220;mèo vờn chuột&#8221; này rốt cuộc xoay quanh kết quả của cuộc chiến thông tin: liệu Đức quốc xã có thể định vị tàu hộ tống tốt hơn phe Đồng Minh định vị U-boat hay ngược lại?</p>
<p>Đức thua.</p>
<p>Nhưng lý do chính khiến Đức thất bại chỉ được công bố vào năm 1974: mã của hải quân Đức, chính là một loại mã Enigma, đã bị phá bởi <a href="http://en.wikipedia.org/wiki/Polish_Cipher_Bureau">Cục Mật Mã Ba Lan</a> và phương pháp phá mã đã được chuyển đến Anh quốc chỉ vài tuần trước khi Phát Xít xâm lược Ba Lan vào năm 1939. Trong suốt cuộc chiến, quân Đồng Minh luôn định vị được tàu ngầm của Đức rồi hướng các đoàn tàu viện trợ đi vòng qua. Dẫu vậy chính phủ Anh không tiết lộ làm cách nào họ phá được các phiên bản mới của mã Enigma, vốn được điều chỉnh nhiều lần trong suốt cuộc chiến, cho đến tận năm 1996. Thông tin mà chính phủ Mỹ công bố vào năm đó cho thấy ngay khi chiến tranh vừa xảy ra, Alan Turing đã tham gia vào nỗ lực phá mã của Anh quốc ở <a href="http://en.wikipedia.org/wiki/Bletchley_Park">Bletchley Party</a>, nơi ông trở thành người có đóng góp lớn nhất cho sự phát triển của các kỹ thuật phá mã Engima nhanh và hiệu quả, dựa trên phương pháp của người Ba Lan. Cho đến năm 1945, tất cả các loại mã Enigma của Đức đều có thể bị giải mã trong vòng một hoặc hai ngày. Thành tựu này của Alan Turing và đồng nghiệp được tướng năm sao <a href="Dwight D. Eisenhower">Dwight D. Eisenhower</a>, chỉ huy tối cao của quân Đồng Minh ở Châu Âu, đánh giá là <a href="en.wikipedia.org/wiki/Cryptanalysis_of_the_Enigma">yếu tố quyết định</a> dẫn đến chiến thắng cuối cùng của quân Đồng Minh.</p>
<p><strong>4. Mã máy tính</strong></p>
<p>Có một chi tiết thú vị mà bây giờ tôi mới nhận ra: giới làm mật mã rất nhạy bén với các phát minh quan trọng của nhân loại. Nếu như thế kỷ 19 họ tạo ra mã máy rôtơ để tận dụng điện năng thì từ giữa thế kỷ 20, họ sáng chế ra các loại mã máy tính để tận dụng&#8230; máy tính. Ba loại mã máy tính quan trọng nhất mà chúng ta sẽ tìm hiểu chi tiết trong hai phần tiếp theo là DES, RC4 và AES. Ở đây chúng ta sẽ bàn một chút về lịch sử của DES.</p>
<p>Trong những năm 1970, nhận thấy cần phải có một mã tiêu chuẩn để mã hóa dữ liệu của chính phủ cũng như dùng trong thương mại, <a href="http://nist.gov">Viện Công Nghệ và Tiêu Chuẩn Quốc Gia</a> (NIST) của Mỹ, với sự tư vấn của <a href="http://nsa.gov">Cục An Ninh Quốc Gia</a> (NSA), tổ chức một cuộc thi để tìm ra loại mã phù hợp nhất. Cuộc thi lần thứ nhất thất bại thảm hại khi không có mã nào đạt tiêu chuẩn và NIST phải tổ chức thêm một cuộc thi khác vào mùa thu năm 1974. Lần này IBM nộp mã Lucifer, một loại mã được phát triển bởi Horst Fiestel, Don Coppersmith và đồng nghiệp trong thời gian đó. Lucifer là một mã khối, có chiều dài khóa là 128-bit và chiều dài khối là 128-bit, nhưng NSA chỉ chấp nhận Lucifer sau khi thực hiện hai điều chỉnh:</p>
<ul>
<li>NSA muốn giảm chiều dài khóa từ 128-bit xuống còn 48-bit. IBM không đồng ý, họ nghĩ tối thiểu phải là 64-bit. Cuối cùng hai bên đều nhượng bộ và chấp nhận khóa có chiều dài 56-bit.</li>
</ul>
<ul>
<li>NSA điều chỉnh lại các <strong>hộp thay thế (S-box)</strong>, một thành phần rất quan trọng trong cấu trúc của Lucifer. Lúc bấy giờ nhiều cryptographer tên tuổi, kể cả bộ đôi ma thuật Whitfield Diffie và Martin Hellman đều lên tiếng phản đối sự điều chỉnh này, vì họ ngờ rằng NSA đã cài một &#8220;cửa hậu&#8221; vào Lucifer, làm giảm đi sự an toàn của Lucifer. Sự thật về những hộp S-box bí ẩn này chỉ được phơi bày khi phương pháp thám mã vi phân được công bố vào những năm 90 của thế kỷ trước. Lúc bấy giờ người ta mới nhận ra rằng, sự điều chỉnh của NSA thật ra đã làm gia tăng sức mạnh của Lucifer, khiến cho mã này không bị phá vỡ dễ dàng bởi thám mã vi phân.</li>
</ul>
<p>Với hai điều chỉnh này, Lucifer được NIST chuẩn hóa thành DES. DES và phiên bản cải tiến Triple-DES được sử dụng rất rộng rãi. Hạn chế lớn nhất của DES là khóa quá ngắn và hạn chế lớn nhất của Triple-DES là tốc độ thực thi. Năm 1997, NIST lại tổ chức một cuộc thi để tìm một mã thay thế DES và kết quả là Rijndael, một mã của hai cryptographer người Bỉ chiến thắng và sau đó được chuẩn hóa thành AES. Chúng ta sẽ tìm hiểu chi tiết về AES khi nói về mã khối.</p>
<p><strong>III. Khoa học mật mã</strong></p>
<p>Như chúng ta đã thấy, mật mã có lịch sử kéo dài ngàn hàng năm và đã được sử dụng trong nhiều sự kiện quan trọng của nhân loại. Tuy vậy cho đến tận chiến tranh thế giới II, hầu hết các loại mã mà con người tạo ra đều đã bị phá vỡ hoàn toàn, trừ mã One-Time Pad (OTP), được phát minh năm 1917 bởi Gilbert Vernam, một kỹ sư làm việc ở Bell Labs thuộc AT&amp;T. Dẫu vậy, trong nhiều năm liền, không một ai biết OTP thực sự an toàn đến mức nào, cho đến năm 1949, khi công trình <a href="http://netlab.cs.ucla.edu/wiki/files/shannon1949.pdf">Communication Theory of Secrecy Systems</a> của Claude Shannon được công bố rộng rãi. Trong bài báo đó, Claude Shannon đã đặt nền móng cho lý thuyết mật mã hiện đại khi lần đầu tiên đưa ra định nghĩa toán học của khái niệm an toàn và chứng minh được OTP an toàn theo định nghĩa đó.</p>
<p>Để hiểu công trình của Shannon, trước tiên chúng ta cần định nghĩa khái niệm mã.</p>
<p><strong>1. Định nghĩa mã</strong></p>
<p>Một mã xác định trên <img src='http://s.wordpress.com/latex.php?latex=%28K%2C%20M%2C%20C%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='(K, M, C)' title='(K, M, C)' class='latex' /> là một cặp hai thuật toán &#8220;hiệu quả&#8221; <img src='http://s.wordpress.com/latex.php?latex=%28E%2C%20D%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='(E, D)' title='(E, D)' class='latex' /> trong đó:</p>
<p><img src='http://s.wordpress.com/latex.php?latex=%7BE%7D%3A%20%7BK%7D%20%5Ctimes%20%7BM%7D%20%5Crightarrow%20%7BC%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{E}: {K} \times {M} \rightarrow {C}' title='{E}: {K} \times {M} \rightarrow {C}' class='latex' />,</p>
<img src='http://s.wordpress.com/latex.php?latex=%7BD%7D%3A%20%7BK%7D%20%5Ctimes%20%7BC%7D%20%5Crightarrow%20%7BM%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{D}: {K} \times {C} \rightarrow {M}' title='{D}: {K} \times {C} \rightarrow {M}' class='latex' />
<p>thỏa điều kiện <img src='http://s.wordpress.com/latex.php?latex=%5Cforall%7Bm%7D%20%5Cin%20%7BM%7D%2C%20%5Cforall%7Bk%7D%20%5Cin%20%7BK%7D%3A%20%7BD_k%28E_k%28m%29%29%20%3D%20m%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\forall{m} \in {M}, \forall{k} \in {K}: {D_k(E_k(m)) = m}' title='\forall{m} \in {M}, \forall{k} \in {K}: {D_k(E_k(m)) = m}' class='latex' /> (gọi là điều kiện nhất quán). Có hai điểm cần lưu ý:</p>
<ul>
<li>Tôi để chữ &#8220;hiệu quả&#8221; trong ngoặc kép vì từ này có nghĩa khác nhau với những người khác nhau. Trong định nghĩa này, một thuật toán có thể được xem là &#8220;hiệu quả&#8221; khi nó có thời gian thực thi và yêu cầu bộ nhớ tương đương với DES.</li>
</ul>
<ul>
<li>Nếu như <img src='http://s.wordpress.com/latex.php?latex=D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='D' title='D' class='latex' /> luôn là thuật toán xác định (deterministic algorithm) thì <img src='http://s.wordpress.com/latex.php?latex=E&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='E' title='E' class='latex' /> thường là một thuật toán ngẫu nhiên (randomized algorithm). Nghĩa là <img src='http://s.wordpress.com/latex.php?latex=E&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='E' title='E' class='latex' /> thường sử dụng yếu tố ngẫu nhiên như một phần của thuật toán để đảm bảo rằng khi mã hóa hai lần một bản rõ giống nhau, chúng ta sẽ thu được hai bản mã hoàn toàn khác nhau.</li>
</ul>
<p><strong>Bài tập 3</strong>: Quân ta đang ở chiến trường. Mỗi ngày bộ chỉ huy sẽ gửi ra một lệnh cho biết hôm đó quân ta sẽ làm gì. Chỉ có hai lệnh: “TAN CONG” hoặc “PHONG THU”. Do quân địch cũng có thể nghe lén sóng radio, nên để cho an toàn, bộ chỉ huy sử dụng một mã <img src='http://s.wordpress.com/latex.php?latex=X&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='X' title='X' class='latex' /> để bảo vệ quá trình gửi và nhận lệnh. Mã <img src='http://s.wordpress.com/latex.php?latex=X&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='X' title='X' class='latex' /> này có thuật toán lập mã <img src='http://s.wordpress.com/latex.php?latex=E&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='E' title='E' class='latex' /> hoàn toàn xác định, nghĩa là bản rõ giống nhau sẽ tạo ra bản mã giống nhau. Tất cả các lệnh đều được mã hóa bằng cùng một khóa duy nhất. Chứng minh rằng ngay trong ngày thứ hai, quân địch đã có thể đoán trước chiến thuật của quân ta.</p>
<p><strong>2. One-Time Pad (OTP)</strong></p>
<p>Vernam tạo ra mã OTP khi tìm cách cải tiến mã Vigenère, nên ý tưởng của OTP khá giống với ý tưởng của Vigenère mà tôi mô tả ở trên, cụ thể như sau:</p>
<ul>
<li><img src='http://s.wordpress.com/latex.php?latex=%7BM%7D%20%3D%20%7BC%7D%20%3D%20%7BK%7D%20%3D%20%5C%7B0%2C%201%5C%7D%5E%7Bn%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{M} = {C} = {K} = \{0, 1\}^{n}' title='{M} = {C} = {K} = \{0, 1\}^{n}' class='latex' />. OTP xem bản rõ là một chuỗi bit &#8220;0101010101&#8230;&#8221; và mỗi khóa là một chuỗi bit ngẫu nhiên có chiều dài bằng với bản rõ.</li>
</ul>
<ul>
<li>Lập mã: <img src='http://s.wordpress.com/latex.php?latex=%7BC%7D%20%3A%3D%20E%28k%2C%20m%29%20%3D%20%7Bk%7D%20%5Coplus%20%7Bm%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{C} := E(k, m) = {k} \oplus {m}' title='{C} := E(k, m) = {k} \oplus {m}' class='latex' />. Phép XOR thực chất là phép cộng modulo 2 khi thực hiện trên các chuỗi bit.</li>
</ul>
<ul>
<li>Giải mã: <img src='http://s.wordpress.com/latex.php?latex=%7BD%7D%20%3A%3D%20D%28k%2C%20c%29%20%3D%20%7Bk%7D%20%5Coplus%20%7Bc%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{D} := D(k, c) = {k} \oplus {c}' title='{D} := D(k, c) = {k} \oplus {c}' class='latex' />.</li>
</ul>
<p>Ví dụ:</p>
<pre>Bản rõ:	10110010010
Khóa:	01101010101
Bản mã: 11011000111</pre>
<p>Chúng ta có thể dễ dàng kiểm chứng rằng OTP thỏa yêu cầu nhất quán của một mã. Một trong những lợi thế của OTP là tốc độ thực thi rất nhanh, còn bất lợi duy nhất là chiều dài khóa phải bằng chiều dài của bản rõ. Bất lợi này làm cho OTP gần như trở thành vô dụng, bởi vì nếu như Alice và Bob đã có một cách để trao đổi khóa an toàn, thì họ đã có thể dùng ngay cách đó để trao đổi bản rõ luôn. Tuy vậy OTP vẫn được sử dụng trong thực tế và chúng ta sẽ còn gặp lại mã này trong bài sau khi bàn về mã dòng. Như đã nói ở trên, trong nhiều năm liền không ai phá được mã OTP nhưng cũng không ai chứng minh được rằng OTP là an toàn. Nhưng&#8230; an toàn là gì? Chúng ta đề cập nhiều đến khái niệm này mà không có một định nghĩa cụ thể. Đây là một thiếu sót rất lớn, bởi lẽ chỉ khi nào chúng ta định nghĩa được khái niệm an toàn của mã thì khi đó mật mã mới có thể trở thành một ngành khoa học.</p>
<p><strong>3. Định nghĩa mã an toàn:</strong></p>
<p>Muốn định nghĩa được mã an toàn, trước tiên chúng ta phải xác định được khả năng của kẻ tấn công Eve, nghĩa là xác định Eve có thể thực hiện được dạng tấn công nào. Có nhiều dạng tấn công và chúng ta sẽ tìm hiểu chi tiết về chúng trong các bài tới. Từ đây đến cuối bài, chúng ta sẽ giả định là kẻ tấn công chỉ thực hiện được dạng tấn công yếu nhất là tấn công biết bản mã (ciphertext-only attack) bằng cách nghe lén (eavesdropping). Quay lại câu hỏi chính, thế nào là một mã an toàn? Sau đây là một vài ý kiến phổ biến:</p>
<ol>
<li>Mã an toàn là mã mà Eve không thể lấy được khóa.</li>
<li>Mã an toàn là mã mà Eve không thể giải mã toàn bộ bản rõ.</li>
<li>Mã an toàn là mã mà Eve không thể giải mã được bất kỳ bit nào của bản rõ.</li>
</ol>
<p>Định nghĩa thứ nhất là một ngộ nhận thường gặp khi sử dụng mã. Mục tiêu tối thượng của mã là bảo vệ bản rõ, chứ không phải để bảo vệ khóa (bảo vệ khóa cũng chỉ là để bảo vệ bản rõ). Ví dụ như xét <img src='http://s.wordpress.com/latex.php?latex=I&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='I' title='I' class='latex' /> là mã cơ sở (identity cipher) với <img src='http://s.wordpress.com/latex.php?latex=E%28k%2C%20m%29%20%3D%20m&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='E(k, m) = m' title='E(k, m) = m' class='latex' />, nghĩa là <img src='http://s.wordpress.com/latex.php?latex=I&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='I' title='I' class='latex' /> không làm gì cả, nhưng <img src='http://s.wordpress.com/latex.php?latex=I&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='I' title='I' class='latex' /> vẫn an toàn theo định nghĩa thứ nhất vì không có cách nào lấy được khóa.</p>
<p>Định nghĩa thứ hai tốt hơn định nghĩa thứ nhất nhưng rõ ràng vẫn không đạt yêu cầu. Không ai muốn sử dụng một mã <img src='http://s.wordpress.com/latex.php?latex=X&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='X' title='X' class='latex' /> khiến kẻ tấn công giải mã được dầu chỉ một bit thông tin. Vậy định nghĩa thứ ba có đạt yêu cầu hay không? Đây là một định nghĩa tốt, dẫu vậy có nhiều trường hợp kẻ tấn công không thu được bất kỳ bit nào của bản rõ nhưng vẫn tính toán được một thuộc tính nào đó của bản rõ và như thế là đủ để phá hủy tính bí mật của bản rõ, ví dụ như ở trường hợp ở bài tập số 3. Nói cách khác,<strong> mã an toàn là mã mà kẻ tấn công không tính được bất kỳ hàm nào của bản rõ.</strong> Đây là một định nghĩa rất mạnh và chúng ta sẽ còn trở lại định nghĩa này trong thời gian tới. Trong phần tiếp theo chúng ta sẽ tìm hiểu định nghĩa an toàn theo cách của Claude Shannon.</p>
<p><strong>4. An toàn tuyệt đối (perfect secrecy)</strong></p>
<p>Claude Shannon là cha đẻ của lý thuyết thông tin nên định nghĩa mã an toàn của ông cũng mang &#8220;màu sắc&#8221; lý thuyết này. Shannon cho rằng một mã là an toàn tuyệt đối nếu như bản mã không tiết lộ bất kỳ &#8220;thông tin&#8221; nào về bản rõ. Để hiểu ý tưởng của Shannon, chúng ta hãy giả định rằng Eve biết được phân bố xác suất trên <img src='http://s.wordpress.com/latex.php?latex=M&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='M' title='M' class='latex' />, nghĩa là Eve biết rõ xác suất được gửi ra ngoài của các bản rõ khác nhau. Ví dụ như Eve biết Alice chỉ gửi một trong hai bản rõ <img src='http://s.wordpress.com/latex.php?latex=m_0&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='m_0' title='m_0' class='latex' /> là &#8220;TAN CONG&#8221; và <img src='http://s.wordpress.com/latex.php?latex=m_1&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='m_1' title='m_1' class='latex' /> là &#8220;PHONG THU&#8221;. Ngoài ra Eve còn biết xác suất mà Alice gửi <img src='http://s.wordpress.com/latex.php?latex=m_0&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='m_0' title='m_0' class='latex' /> là 0.6 và xác suất gửi <img src='http://s.wordpress.com/latex.php?latex=m_1&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='m_1' title='m_1' class='latex' /> là 0.4. Rồi Eve thấy một bản mã <img src='http://s.wordpress.com/latex.php?latex=c&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='c' title='c' class='latex' /> được gửi từ Alice đến cho Bob. Shannon nói rằng mã mà Alice và Bob sử dụng là an toàn tuyệt đối nếu như việc biết thêm <img src='http://s.wordpress.com/latex.php?latex=c&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='c' title='c' class='latex' /> không làm thay đổi khả năng của Eve. Nói cách khác, <img src='http://s.wordpress.com/latex.php?latex=c&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='c' title='c' class='latex' /> không tiết lộ bất kỳ thông tin gì về bản rõ được gửi đi, bởi vì có biết <img src='http://s.wordpress.com/latex.php?latex=c&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='c' title='c' class='latex' /> hay không thì Eve vẫn chỉ biết xác suất Alice gửi <img src='http://s.wordpress.com/latex.php?latex=m_0&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='m_0' title='m_0' class='latex' /> là 0.6 và <img src='http://s.wordpress.com/latex.php?latex=m_1&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='m_1' title='m_1' class='latex' /> là 0.4.</p>
<p>Để tiện việc chứng minh các bổ đề, chúng ta sẽ không dùng định nghĩa nguyên thủy của Shannon mà sẽ sử dụng một định nghĩa tương đương như sau (xem bổ đề 2.3 cuốn KL):</p>
<blockquote><p><em>An toàn tuyệt đối</em></p>
<p>Một mã <img src='http://s.wordpress.com/latex.php?latex=%28E%2C%20D%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='(E, D)' title='(E, D)' class='latex' /> trên <img src='http://s.wordpress.com/latex.php?latex=%28K%2C%20M%2C%20C%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='(K, M, C)' title='(K, M, C)' class='latex' /> là an toàn tuyệt đối nếu và chỉ nếu <img src='http://s.wordpress.com/latex.php?latex=%7B%5Cforall%7D%20%7Bm_0%7D%2C%20%7Bm_1%7D%20%5Cin%20%7BM%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{\forall} {m_0}, {m_1} \in {M}' title='{\forall} {m_0}, {m_1} \in {M}' class='latex' /> thỏa <img src='http://s.wordpress.com/latex.php?latex=%7C%7Bm_0%7D%7C%20%3D%20%7C%7Bm_1%7D%7C&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='|{m_0}| = |{m_1}|' title='|{m_0}| = |{m_1}|' class='latex' /> và <img src='http://s.wordpress.com/latex.php?latex=%7B%5Cforall%7D%20%7Bc%7D%20%5Cin%20%7BC%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{\forall} {c} \in {C}' title='{\forall} {c} \in {C}' class='latex' />, ta có Pr[E(k, <img src='http://s.wordpress.com/latex.php?latex=m_0&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='m_0' title='m_0' class='latex' />) = c] = Pr[E(k, <img src='http://s.wordpress.com/latex.php?latex=m_1&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='m_1' title='m_1' class='latex' />) = c], trong đó <img src='http://s.wordpress.com/latex.php?latex=k&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='k' title='k' class='latex' /> được chọn ngẫu nhiên (uniformly) từ <img src='http://s.wordpress.com/latex.php?latex=K&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='K' title='K' class='latex' /> (ký hiệu là <img src='http://s.wordpress.com/latex.php?latex=%7Bk%7D%20%5Coverset%7BR%7D%7B%5Cleftarrow%7D%20%7BK%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{k} \overset{R}{\leftarrow} {K}' title='{k} \overset{R}{\leftarrow} {K}' class='latex' />).</p></blockquote>
<p>Chúng ta cần điều kiện <img src='http://s.wordpress.com/latex.php?latex=%7C%7Bm_0%7D%7C%20%3D%20%7C%7Bm_1%7D%7C&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='|{m_0}| = |{m_1}|' title='|{m_0}| = |{m_1}|' class='latex' /> vì các mã thường tiết lộ chiều dài của bản rõ. Định nghĩa này có thể hiểu như sau: nếu khóa <img src='http://s.wordpress.com/latex.php?latex=k&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='k' title='k' class='latex' /> được chọn ngẫu nhiên thì xác suất để <img src='http://s.wordpress.com/latex.php?latex=m_0&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='m_0' title='m_0' class='latex' /> mã hóa thành một bản mã <img src='http://s.wordpress.com/latex.php?latex=c&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='c' title='c' class='latex' /> nào đó sẽ bằng với xác suất để <img src='http://s.wordpress.com/latex.php?latex=m_1&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='m_1' title='m_1' class='latex' /> mã hóa thành chính bản mã đó. Nghĩa là nếu chỉ nhìn vào một bản mã thì không có cách nào biết được nguồn gốc của nó. Nói cách khác, việc quan sát được <img src='http://s.wordpress.com/latex.php?latex=c&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='c' title='c' class='latex' /> không giúp cho Eve biết được bản rõ là <img src='http://s.wordpress.com/latex.php?latex=m_0&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='m_0' title='m_0' class='latex' /> hay <img src='http://s.wordpress.com/latex.php?latex=m_1&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='m_1' title='m_1' class='latex' /> hay <img src='http://s.wordpress.com/latex.php?latex=m_i&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='m_i' title='m_i' class='latex' /> với <img src='http://s.wordpress.com/latex.php?latex=i&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='i' title='i' class='latex' /> bất kỳ.</p>
<p>Như vậy, định nghĩa của Shannon chỉ ra rằng một mã an toàn tuyệt đối sẽ không thể bị phá bằng tấn công chỉ biết bản mã, bất chấp kẻ tấn công có sức mạnh như thế nào. Đây cũng là một điểm thú vị cho thấy các mã được sử dụng trong các bộ phim Hollywood thường không phải là mã an toàn tuyệt đối, vì nhân vật chính thường giải mã thành công chỉ bằng cách nhìn chằm chằm vào bản mã (ví dụ như John Nash trong phim A Beautiful Mind).</p>
<p>Câu hỏi hiển nhiển bây giờ là: có mã nào là an toàn tuyệt đối hay không? Rất may câu trả lời là có.</p>
<p><em>4.1 Bổ đề &#8220;tin tốt&#8221;</em></p>
<blockquote><p>OTP là an toàn tuyệt đối.</p></blockquote>
<p><em>Chứng minh:</em></p>
<p>Xét một bản rõ bất kỳ <img src='http://s.wordpress.com/latex.php?latex=%7Bm%7D%20%5Cin%20%7BM%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{m} \in {M}' title='{m} \in {M}' class='latex' />. Với mọi bản mã <img src='http://s.wordpress.com/latex.php?latex=%7Bc%7D%20%5Cin%20%7BC%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{c} \in {C}' title='{c} \in {C}' class='latex' />, ta có <img src='http://s.wordpress.com/latex.php?latex=Pr%5BOTP%28k%2C%20%7Bm%7D%29%20%3D%20%7Bc%7D%5D%20%3D%20Pr%5B%7Bk%7D%20%5Coplus%20%7Bm%7D%20%3D%20%7Bc%7D%5D%20%3D%20Pr%5B%7Bk%7D%20%3D%20%7Bm%7D%20%5Coplus%20%7Bc%7D%5D%20%3D%20%5Cfrac%7B1%7D%7B%7CK%7C%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='Pr[OTP(k, {m}) = {c}] = Pr[{k} \oplus {m} = {c}] = Pr[{k} = {m} \oplus {c}] = \frac{1}{|K|}' title='Pr[OTP(k, {m}) = {c}] = Pr[{k} \oplus {m} = {c}] = Pr[{k} = {m} \oplus {c}] = \frac{1}{|K|}' class='latex' />. Điều này đúng với <img src='http://s.wordpress.com/latex.php?latex=%5Cforall%7Bm%7D%20%5Cin%20%7BM%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\forall{m} \in {M}' title='\forall{m} \in {M}' class='latex' /> nên <img src='http://s.wordpress.com/latex.php?latex=%5Cforall%20%7Bm_0%7D%2C%20%7Bm_1%7D%20%5Cin%20%7BM%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\forall {m_0}, {m_1} \in {M}' title='\forall {m_0}, {m_1} \in {M}' class='latex' /> và <img src='http://s.wordpress.com/latex.php?latex=%7B%5Cforall%7D%20%7Bc%7D%20%5Cin%20%7BC%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{\forall} {c} \in {C}' title='{\forall} {c} \in {C}' class='latex' />, ta có Pr[E(k, <img src='http://s.wordpress.com/latex.php?latex=m_0&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='m_0' title='m_0' class='latex' />) = c] = Pr[E(k, <img src='http://s.wordpress.com/latex.php?latex=m_1&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='m_1' title='m_1' class='latex' />) = c]. Vậy OTP là an toàn tuyệt đối theo định nghĩa.</p>
<p>Như vậy chúng ta đã tìm được một mã an toàn tuyệt đối, loạt bài này coi như đã &#8220;thành công tốt đẹp&#8221; rồi. Chưa đâu! Còn nhớ ở trên chúng ta nói OTP có một vấn đề làm cho nó trở nên vô dụng đó là chiều dài khóa lớn hơn hoặc bằng chiều dài bản rõ. Shannon chứng minh rằng không chỉ OTP mà tất cả mã an toàn tuyệt đối đều có tính chất này. Tôi gọi đây là bổ đề &#8220;tin xấu&#8221; bởi lẽ nó làm tiêu tan hi vọng về một sự an toàn tuyệt đối của tất cả chúng ta <img src='http://www.procul.org/blog/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /> .</p>
<p><em>4.2 Bổ đề &#8220;tin xấu&#8221;</em></p>
<blockquote><p>Một mã là an toàn tuyệt đối phải có <img src='http://s.wordpress.com/latex.php?latex=%7CK%7C%20%5Cgeq%20%7CM%7C&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='|K| \geq |M|' title='|K| \geq |M|' class='latex' />. Nói cách khác chiều dài khóa phải lớn hơn hoặc bằng chiều dài bản rõ.</p></blockquote>
<p><strong>Bài tập 5</strong>: chứng minh bổ đề &#8220;tin xấu&#8221;.</p>
<p>Câu hỏi bây giờ là: có cách nào giải quyết khuyết điểm của OTP hay không? Chúng ta sẽ tìm câu trả lời trong phần kế tiếp khi bàn về mã dòng (đọc KL 61-77).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.procul.org/blog/2011/10/27/m%e1%ba%adt-ma-hi%e1%bb%87n-d%e1%ba%a1i-2/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>BEAST: Một phương pháp tấn công HTTPS mới (2)</title>
		<link>http://www.procul.org/blog/2011/10/06/beast-2/</link>
		<comments>http://www.procul.org/blog/2011/10/06/beast-2/#comments</comments>
		<pubDate>Fri, 07 Oct 2011 01:26:38 +0000</pubDate>
		<dc:creator>thaidn</dc:creator>
				<category><![CDATA[Bảo mật và mật mã học]]></category>
		<category><![CDATA[Lý thuyết mã hóa]]></category>

		<guid isPermaLink="false">http://www.procul.org/blog/?p=3759</guid>
		<description><![CDATA[2. CBC &#8211; Tấn công Rogaway-Dai 2.1 CBC Trong định nghĩa của mỗi mã khối (block cipher) đều có một thuật toán mã hóa nhận vào một khối bản rõ (plaintext block) có chiều dài bit (gọi là chiều dài khối &#8211; block size) và một khóa có chiều dài bit, rồi &#8220;nhào trộn&#8221; bản [...]]]></description>
			<content:encoded><![CDATA[<p><strong>2. CBC &#8211; Tấn công Rogaway-Dai<br />
</strong></p>
<p><em>2.1 CBC</em></p>
<p>Trong định nghĩa của mỗi mã khối (block cipher) đều có một thuật toán mã hóa nhận vào một khối bản rõ (plaintext block) có chiều dài <img src='http://s.wordpress.com/latex.php?latex=b&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='b' title='b' class='latex' /> bit (gọi là chiều dài khối &#8211; block size) và một khóa có chiều dài <img src='http://s.wordpress.com/latex.php?latex=n&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='n' title='n' class='latex' /> bit, rồi &#8220;nhào trộn&#8221; bản rõ và khóa lại với nhau để xuất ra một khối bản mã (ciphertext block) có <img src='http://s.wordpress.com/latex.php?latex=b&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='b' title='b' class='latex' /> bit. Ví dụ như thuật toán mã hóa của mã khối nổi tiếng DES nhận vào một khối bản rõ có chiều dài 64 bit và một khóa có chiều dài 56 bit, rồi xuất ra một khối bản mã có chiều dài 64 bit. Vì lý do an toàn, các mã khối hiện đại thường có <img src='http://s.wordpress.com/latex.php?latex=b%20%3D%20128&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='b = 128' title='b = 128' class='latex' /> và <img src='http://s.wordpress.com/latex.php?latex=n%20%3E%3D%20128&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='n &gt;= 128' title='n &gt;= 128' class='latex' />, ví dụ như AES-128, AES-192, AES-256 (con số phía sau là chiều dài khóa; tất cả đều có chiều dài khối là 128 bit). Câu hỏi tự nhiên là mã hóa thế nào nếu bản rõ dài hơn <img src='http://s.wordpress.com/latex.php?latex=b&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='b' title='b' class='latex' />? Chẳng hạn như tôi cần phải làm sao nếu muốn dùng AES-128 để mã hóa bài viết này, vốn chắc chắn dài hơn 128 bit?</p>
<p>Để giải quyết vấn đề này, người ta dùng mộ<em>t phương thức hoạt động</em> (mode of operation) của mã khối. Lưu ý rằng cùng một phương thức hoạt động có thể sử dụng cho nhiều mã khối khác nhau và ngược lại. Mỗi phương thức hoạt động sẽ định nghĩa hai thuật toán: mã hóa và giải mã. Các thuật toán này sẽ sử dụng mã khối và một khóa duy nhất để mã hóa/giải mã các khối dữ liệu có chiều dài lớn hơn <img src='http://s.wordpress.com/latex.php?latex=b&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='b' title='b' class='latex' />.  Có nhiều phương thức hoạt động, phổ biến nhất là Electronic Code Book (ECB) và Cipher Block Chaining (CBC). Để mã hóa bằng ECB hay CBC, chúng ta cần phải thực hiện hai bước:</p>
<p><span id="more-3759"></span></p>
<ul>
<li>Nếu chiều dài bản rõ không chia hết cho chiều dài khối thì đệm thêm (pad) một số byte vào bản rõ (padding bytes) để tổng chiều dài chia hết cho <img src='http://s.wordpress.com/latex.php?latex=b&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='b' title='b' class='latex' />. Có nhiều cách đệm, phổ biến nhất là đệm theo chuẩn <a href="http://www.rsa.com/rsalabs/node.asp?id=2127">PKCS #5</a>.</li>
<li>Chia bản rõ ra thành từng khối và mã hóa theo thuật toán quy định trong phương thức hoạt động. Tôi sẽ đi vào chi tiết bước này trong cả hai phương thức ECB và CBC ngay bên dưới.</li>
</ul>
<p>Điều thú vị là cả hai thao tác này đều đã tạo ra những tấn công rất nghiêm trọng vào các ứng dụng của mã khối trong thực tế. Ví dụ như đối với bước thứ nhất, ở Eurocrypt 2002 Serge Vaudenay đã trình bày <a href="http://lasecwww.epfl.ch/memo/memo_ssl.shtml">tấn công padding oracle</a>, một tấn công chọn bản mã (chosen-ciphertext attack) cho phép kẻ tấn công có thể giải mã bất kỳ bản mã nào, chỉ với một điều kiện là nạn nhân tiết lộ kết quả gỡ đệm trong quá trình giải mã. Sau Vaudenay, đã có rất nhiều nghiên cứu khác về <a href="http://scholar.google.com/scholar?q=padding+oracle&amp;hl=en&amp;btnG=Search&amp;as_sdt=1%2C5&amp;as_sdtp=on">tấn công padding oracle</a>. Tôi và một đồng nghiệp cũng có hai <a href="http://usenix.org/events/woot10/tech/full_papers/Rizzo.pdf">nghiên</a> <a href="http://www.ieee-security.org/TC/SP2011/PAPERS/2011/paper030.pdf">cứu</a> về đề tài này. Tuy vậy, BEAST không phải là một tấn công padding oracle, nên từ đây về sau chúng ta xem như các bản rõ đều đã được thêm đệm cho phù hợp.</p>
<p>Tôi dùng một số ký hiệu sau đây cho phần còn lại của loạt bài này:</p>
<ul>
<li>Bản rõ được ký hiệu là <img src='http://s.wordpress.com/latex.php?latex=M&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='M' title='M' class='latex' />, bản mã là <img src='http://s.wordpress.com/latex.php?latex=C&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='C' title='C' class='latex' />. Bản rõ được chia ra thành <img src='http://s.wordpress.com/latex.php?latex=m&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='m' title='m' class='latex' /> khối <img src='http://s.wordpress.com/latex.php?latex=P_1&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='P_1' title='P_1' class='latex' />, <img src='http://s.wordpress.com/latex.php?latex=P_2&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='P_2' title='P_2' class='latex' />,&#8230;,<img src='http://s.wordpress.com/latex.php?latex=P_m&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='P_m' title='P_m' class='latex' />. Các khối này sẽ được mã hóa thành <img src='http://s.wordpress.com/latex.php?latex=C_1&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='C_1' title='C_1' class='latex' />, <img src='http://s.wordpress.com/latex.php?latex=C_2&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='C_2' title='C_2' class='latex' />,&#8230;,<img src='http://s.wordpress.com/latex.php?latex=C_m&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='C_m' title='C_m' class='latex' />.</li>
<li>Hàm mã hóa của mã khối là <img src='http://s.wordpress.com/latex.php?latex=E_k&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='E_k' title='E_k' class='latex' />, trong đó <img src='http://s.wordpress.com/latex.php?latex=k&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='k' title='k' class='latex' /> là khóa. Tương ứng, hàm giải mã là <img src='http://s.wordpress.com/latex.php?latex=D_k&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='D_k' title='D_k' class='latex' />.</li>
<li>Viết <img src='http://s.wordpress.com/latex.php?latex=X%20%3D%20%7BX_1%7D%7C%7BX_2%7D%7C%5Ccdots%7C%7BX_m%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='X = {X_1}|{X_2}|\cdots|{X_m}' title='X = {X_1}|{X_2}|\cdots|{X_m}' class='latex' /> nghĩa là kết nối các khối <img src='http://s.wordpress.com/latex.php?latex=X_i&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='X_i' title='X_i' class='latex' /> lại với nhau để tạo ra khối <img src='http://s.wordpress.com/latex.php?latex=X&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='X' title='X' class='latex' />.</li>
<li>Vector khởi tạo (initialization vector) được ký hiệu là <img src='http://s.wordpress.com/latex.php?latex=IV&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='IV' title='IV' class='latex' />.</li>
</ul>
<p>Phương thức hoạt động đơn giản nhất là ECB. ECB mã hóa các khối bản rõ độc lập với nhau, cụ thể như sau:</p>
<p><em>Mã hóa</em></p>
<p style="text-align: left;" align="center"><img src='http://s.wordpress.com/latex.php?latex=%5Cdisplaystyle%20%5Cbegin%7Barray%7D%7Brcl%7D%20C_i%20%26%3D%26%20E_k%28P_i%29%2C%20i%3D1%2C..%2Cm%5C%5C%20C%20%26%3D%26%20C_1%7CC_2%7C%5Ccdots%7CC_m%20%5Cend%7Barray%7D%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\displaystyle \begin{array}{rcl} C_i &amp;=&amp; E_k(P_i), i=1,..,m\\ C &amp;=&amp; C_1|C_2|\cdots|C_m \end{array} ' title='\displaystyle \begin{array}{rcl} C_i &amp;=&amp; E_k(P_i), i=1,..,m\\ C &amp;=&amp; C_1|C_2|\cdots|C_m \end{array} ' class='latex' /></p>
<p><em>Giải mã</em></p>
<p style="text-align: left;" align="center"><img src='http://s.wordpress.com/latex.php?latex=%5Cdisplaystyle%20%5Cbegin%7Barray%7D%7Brcl%7D%20P_i%20%26%3D%26%20D_k%28C_i%29%2C%20i%3D1%2C..%2Cm%5C%5C%20M%20%26%3D%26%20P_1%7CP_2%7C%5Ccdots%7CP_m%20%5Cend%7Barray%7D%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\displaystyle \begin{array}{rcl} P_i &amp;=&amp; D_k(C_i), i=1,..,m\\ M &amp;=&amp; P_1|P_2|\cdots|P_m \end{array} ' title='\displaystyle \begin{array}{rcl} P_i &amp;=&amp; D_k(C_i), i=1,..,m\\ M &amp;=&amp; P_1|P_2|\cdots|P_m \end{array} ' class='latex' /></p>
<p style="text-align: left;" align="center">Phương thức mã hóa độc lập này có một tính chất: các khối bản rõ giống nhau sẽ cho kết quả là các khối bản mã giống nhau. Nói cách khác, so sánh giá trị của <img src='http://s.wordpress.com/latex.php?latex=C_i&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='C_i' title='C_i' class='latex' /> và <img src='http://s.wordpress.com/latex.php?latex=C_j&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='C_j' title='C_j' class='latex' /> với <img src='http://s.wordpress.com/latex.php?latex=i%2C%20j&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='i, j' title='i, j' class='latex' /> bất kỳ chúng ta có thể biết được một chút &#8220;thông tin&#8221; về <img src='http://s.wordpress.com/latex.php?latex=P_i&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='P_i' title='P_i' class='latex' /> và <img src='http://s.wordpress.com/latex.php?latex=P_j&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='P_j' title='P_j' class='latex' />. Đây là một tính chất không mong muốn của bất kỳ phương thức hoạt động hay hệ mã nào (bởi vì nó làm cho hệ mã không còn an toàn theo định nghĩa <a href="http://en.wikipedia.org/wiki/Semantic_security">semantic security</a>). Điều thú vị là ECB được chọn là phương thức mặc định trong nhiều thư viện lập trình phổ biến.</p>
<p style="text-align: left;" align="center"><em><strong>Bài tập 1</strong></em>: Quân ta đang ở chiến trường. Mỗi ngày bộ chỉ huy sẽ gửi ra một lệnh cho biết hôm đó quân ta sẽ làm gì. Chỉ có hai lệnh: &#8220;TAN CONG&#8221; hoặc &#8220;PHONG THU&#8221;. Do quân địch cũng có thể nghe lén sóng radio, nên để cho an toàn, bộ chỉ huy sử dụng ECB để mã hóa các lệnh trước khi gửi. Tất cả các lệnh đều được mã hóa bằng cùng một khóa duy nhất. Chứng minh rằng ngay trong ngày thứ hai, quân địch đã có thể đoán trước chiến thuật của quân ta.</p>
<p style="text-align: left;" align="center"><em><strong>Bài tập 2</strong></em>: Tìm và liệt kê các thư viện lập trình sử dụng ECB là phương thức hoạt động mặc định. Điểm thưởng: tìm trên <a href="http://www.google.com/codesearch">Google Code Search</a> các chương trình sử dụng các thư viện này và xem thử có cách nào khai thác điểm yếu của ECB trong các chương trình này hay không.</p>
<p style="text-align: left;" align="center">Vậy làm thế nào để phá vỡ sự độc lập giữa các khối? Làm cho chúng phụ thuộc nhau <img src='http://www.procul.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . Đó cũng là ý tưởng của phương thức CBC. Tên gọi của CBC gợi ý rằng các khối bản mã sẽ được &#8220;móc nối&#8221; lại với nhau, cụ thể như sau:</p>
<p style="text-align: left;" align="center"><em>Mã hóa</em></p>
<p style="text-align: left;" align="center"><img src='http://s.wordpress.com/latex.php?latex=%5Cdisplaystyle%20%5Cbegin%7Barray%7D%7Brcl%7D%20C_0%20%26%3D%26%20IV%5C%5C%20C_i%20%26%3D%26%20E_k%28P_i%20%5Coplus%20C_%7Bi-1%7D%29%2C%20i%3D1%2C..%2Cm%5C%5C%20C%20%26%3D%26%20C_0%7CC_1%7CC_2%7C%5Ccdots%7CC_m%20%5Cend%7Barray%7D%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\displaystyle \begin{array}{rcl} C_0 &amp;=&amp; IV\\ C_i &amp;=&amp; E_k(P_i \oplus C_{i-1}), i=1,..,m\\ C &amp;=&amp; C_0|C_1|C_2|\cdots|C_m \end{array} ' title='\displaystyle \begin{array}{rcl} C_0 &amp;=&amp; IV\\ C_i &amp;=&amp; E_k(P_i \oplus C_{i-1}), i=1,..,m\\ C &amp;=&amp; C_0|C_1|C_2|\cdots|C_m \end{array} ' class='latex' /></p>
<p style="text-align: left;" align="center"><em>Giải mã</em></p>
<p style="text-align: left;" align="center"><img src='http://s.wordpress.com/latex.php?latex=%5Cdisplaystyle%20%5Cbegin%7Barray%7D%7Brcl%7D%20P_i%20%26%3D%26%20D_k%28C_i%29%20%5Coplus%20C_%7Bi-1%7D%2C%20i%3D1%2C..%2Cm%5C%5C%20M%20%26%3D%26%20P_1%7CP_2%7C%5Ccdots%7CP_m%20%5Cend%7Barray%7D%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\displaystyle \begin{array}{rcl} P_i &amp;=&amp; D_k(C_i) \oplus C_{i-1}, i=1,..,m\\ M &amp;=&amp; P_1|P_2|\cdots|P_m \end{array} ' title='\displaystyle \begin{array}{rcl} P_i &amp;=&amp; D_k(C_i) \oplus C_{i-1}, i=1,..,m\\ M &amp;=&amp; P_1|P_2|\cdots|P_m \end{array} ' class='latex' /></p>
<p style="text-align: left;" align="center"><a href="http://www.procul.org/blog/wp-content/uploads/2011/09/CBC.png"><img class="alignleft size-medium wp-image-3744" title="Sơ đồ hoạt động CBC" src="http://www.procul.org/blog/wp-content/uploads/2011/09/CBC-166x300.png" alt="" width="166" height="300" /></a>Lưu ý rằng khi mã hóa bằng CBC, chiều dài bản mã tăng thêm một khối. Khối tăng thêm này là <img src='http://s.wordpress.com/latex.php?latex=IV&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='IV' title='IV' class='latex' />, dùng để mã hóa khối bản rõ đầu tiên. Trong CBC, <img src='http://s.wordpress.com/latex.php?latex=IV&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='IV' title='IV' class='latex' /> không cần được giữ bí mật, nhưng với cùng một khóa thì <img src='http://s.wordpress.com/latex.php?latex=IV&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='IV' title='IV' class='latex' /> phải <em>độc nhất</em> và <em>không dự đoán được</em>.</p>
<p style="text-align: left;" align="center"><em><strong>Bài tập 3</strong></em>: Giả sử bộ chỉ huy ở bài tập 1 chuyển sang sử dụng CBC. Vì thiếu thiết bị tạo số ngẫu nhiên, bộ chỉ huy quyết định chọn một <img src='http://s.wordpress.com/latex.php?latex=IV&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='IV' title='IV' class='latex' /> cố định và dùng <img src='http://s.wordpress.com/latex.php?latex=IV&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='IV' title='IV' class='latex' /> này trong tất cả các lần gửi lệnh. Chứng minh rằng quân địch vẫn có thể đoán trước chiến thuật của quân ta ngay trong ngày thứ hai.</p>
<p style="text-align: left;" align="center">CBC được sử dụng ở rất nhiều ứng dụng của mã khối, trong đó có SSL/TLS. Điểm mấu chốt trong việc sử dụng CBC chính là chọn lựa <img src='http://s.wordpress.com/latex.php?latex=IV&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='IV' title='IV' class='latex' /> đảm bảo hai tiêu chí ở trên. Rất tiếc người thiết kế SSL/TLS làm sai chỗ này. Bài tập 3 gợi ý rằng, để có <img src='http://s.wordpress.com/latex.php?latex=IV&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='IV' title='IV' class='latex' /> độc nhất thì nên dùng một bộ tạo số ngẫu nhiên (random number generator). Lưu ý là không phải bộ tạo số nào cũng có thể dùng trong mật mã và hầu hết các bộ tạo số ngẫu nhiên đi kèm theo các ngôn ngữ lập trình đều không an toàn. Có lẽ tôi sẽ viết một bài về đề tài này sau. Quay trở lại giá trị <img src='http://s.wordpress.com/latex.php?latex=IV&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='IV' title='IV' class='latex' />. Như vậy trong CBC, mỗi lần mã hóa, chúng ta nên chọn một <img src='http://s.wordpress.com/latex.php?latex=IV&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='IV' title='IV' class='latex' /> ngẫu nhiên. Câu hỏi là: ngẫu nhiên có bao hàm không dự đoán được? Chắc chắn rồi, bởi nếu đã là ngẫu nhiên thì làm sao mà dự đoán được! Tôi nghĩ sự tồn tại của điểm yếu trong SSL/TLS, tấn công Rogaway-Dai và bây giờ là BEAST đều xuất phát từ chỗ này. <strong>Cách mà SSL/TLS chọn các <img src='http://s.wordpress.com/latex.php?latex=IV&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='IV' title='IV' class='latex' /> để mã hóa các bản ghi (record) khiến các <img src='http://s.wordpress.com/latex.php?latex=IV&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='IV' title='IV' class='latex' /> này ngẫu nhiên, nhưng lại dự đoán được! </strong></p>
<p style="text-align: left;" align="center">Trong SSL/TLS, dữ liệu từ tầng ứng dụng được chia ra thành từng bản ghi dài không quá <img src='http://s.wordpress.com/latex.php?latex=2%5E%7B14%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='2^{14}' title='2^{14}' class='latex' /> byte, rồi các bản ghi này sẽ được mã hóa dùng CBC. Với bản ghi đầu tiên, SSL/TLS sẽ chọn một <img src='http://s.wordpress.com/latex.php?latex=IV&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='IV' title='IV' class='latex' /> hoàn toàn ngẫu nhiên từ bộ tạo số ngẫu nhiên. <strong>Từ bản ghi thứ hai trở đi, SSL/TLS sẽ chọn khối bản mã cuối cùng của bản ghi trước đó làm <img src='http://s.wordpress.com/latex.php?latex=IV&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='IV' title='IV' class='latex' /></strong>. Ví dụ như bản ghi thứ nhất có 3 khối <img src='http://s.wordpress.com/latex.php?latex=P_1%2C%20P_2%2C%20P_3&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='P_1, P_2, P_3' title='P_1, P_2, P_3' class='latex' />, mã hóa tạo thành 4 khối <img src='http://s.wordpress.com/latex.php?latex=C_0%2C%20C_1%2C%20C_2%2C%20C_3&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='C_0, C_1, C_2, C_3' title='C_0, C_1, C_2, C_3' class='latex' />, thì <img src='http://s.wordpress.com/latex.php?latex=C_3&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='C_3' title='C_3' class='latex' /> sẽ được chọn làm <img src='http://s.wordpress.com/latex.php?latex=IV&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='IV' title='IV' class='latex' /> cho bản ghi thứ hai. Rồi khối bản mã cuối cùng của bản ghi thứ hai sẽ là <img src='http://s.wordpress.com/latex.php?latex=IV&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='IV' title='IV' class='latex' /> cho bản ghi thứ ba, v.v. Lưu ý rằng <img src='http://s.wordpress.com/latex.php?latex=C_3&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='C_3' title='C_3' class='latex' /> là hoàn toàn ngẫu nhiên, nhưng nếu như chúng ta biết <img src='http://s.wordpress.com/latex.php?latex=C_3&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='C_3' title='C_3' class='latex' /> trước khi chọn bản ghi thứ hai thì xem như <img src='http://s.wordpress.com/latex.php?latex=IV&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='IV' title='IV' class='latex' /> của bản ghi thứ hai là dự đoán được. Nói cách khác, <img src='http://s.wordpress.com/latex.php?latex=IV&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='IV' title='IV' class='latex' /> không dự đoán được nghĩa là chúng ta không thể biết được giá trị của <img src='http://s.wordpress.com/latex.php?latex=IV&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='IV' title='IV' class='latex' /> trước khi chọn bản rõ.<strong></strong></p>
<p style="text-align: left;" align="center">Vậy chuyện gì sẽ xảy ra nếu chúng ta dự đoán được <img src='http://s.wordpress.com/latex.php?latex=IV&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='IV' title='IV' class='latex' /> trước khi chọn bản rõ?<strong><br style="text-align: left;" /> </strong></p>
<p><em>2.2 Tấn công Rogaway-Dai</em></p>
<p><a href="http://www.openssl.org/~bodo/tls-cbc.txt">Wei Dai mô tả như sau tấn công này như sau:</a></p>
<blockquote><p>Phil Rogaway observed that CBC mode is not secure against chosen-plaintext attack if the IV is known or can be predicted by the attacker before he chooses his plaintext [1]. Similarly, CBC mode is not secure if the attacker can observe the last ciphertext block before choosing the next block of plaintext, because the last block of ciphertext essentially serves as the IV for the rest of the message.</p>
<p>The attack itself is very simple. Remember that in CBC mode, each plaintext block is XOR&#8217;ed with the last ciphertext block and then encrypted to produce the next ciphertext block. Suppose the attacker suspects that plaintext block <img src='http://s.wordpress.com/latex.php?latex=P_i&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='P_i' title='P_i' class='latex' /> might be <img src='http://s.wordpress.com/latex.php?latex=x&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='x' title='x' class='latex' />, and wants to test whether that&#8217;s the case, he would choose the next plaintext block <img src='http://s.wordpress.com/latex.php?latex=P_j&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='P_j' title='P_j' class='latex' /> to the <img src='http://s.wordpress.com/latex.php?latex=x%20%5Coplus%20C_%7Bi-1%7D%20%5Coplus%20C_%7Bj-1%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='x \oplus C_{i-1} \oplus C_{j-1}' title='x \oplus C_{i-1} \oplus C_{j-1}' class='latex' />. If his guess is correct, then <img src='http://s.wordpress.com/latex.php?latex=C_j%20%3D%20E_k%28P_j%20%5Coplus%20C_%7Bj-1%7D%29%20%3D%20E_k%28P_i%20%5Coplus%20C_%7Bi-1%7D%29%20%3D%20C_i&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='C_j = E_k(P_j \oplus C_{j-1}) = E_k(P_i \oplus C_{i-1}) = C_i' title='C_j = E_k(P_j \oplus C_{j-1}) = E_k(P_i \oplus C_{i-1}) = C_i' class='latex' />, and so he can confirm his guess by looking at whether <img src='http://s.wordpress.com/latex.php?latex=C_j%20%3D%20C_i&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='C_j = C_i' title='C_j = C_i' class='latex' />.[...]</p>
<p>[1] http://www.cs.ucdavis.edu/~rogaway/papers/draft-rogaway-ipsec-comments-00.txt</p></blockquote>
<p style="text-align: left;" align="center">Như vậy Dai chỉ ra rằng chúng ta có thể dự đoán được (giải mã!) bản rõ đã quan sát nếu chúng ta biết được <img src='http://s.wordpress.com/latex.php?latex=IV&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='IV' title='IV' class='latex' /> trước khi chọn bản rõ mới trong CBC. Nếu <img src='http://s.wordpress.com/latex.php?latex=P_i&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='P_i' title='P_i' class='latex' /> chỉ nhận 100 giá trị, thì rõ ràng chúng ta có thể giải mã được <img src='http://s.wordpress.com/latex.php?latex=P_i&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='P_i' title='P_i' class='latex' /> sau khi thực hiện trung bình 50 bước chọn và thử <img src='http://s.wordpress.com/latex.php?latex=P_j&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='P_j' title='P_j' class='latex' />. Giới hạn của Rogaway-Dai nằm ở chỗ trong thực tế miền giá trị của <img src='http://s.wordpress.com/latex.php?latex=P_i&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='P_i' title='P_i' class='latex' /> thường rất lớn. Làm sao để giảm miền giá trị của <img src='http://s.wordpress.com/latex.php?latex=P_i&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='P_i' title='P_i' class='latex' />?</p>
<p><strong><em>(Phần 3: Tấn công chọn lề)</em></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.procul.org/blog/2011/10/06/beast-2/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>BEAST: Một phương pháp tấn công HTTPS mới (1)</title>
		<link>http://www.procul.org/blog/2011/09/30/beast-1/</link>
		<comments>http://www.procul.org/blog/2011/09/30/beast-1/#comments</comments>
		<pubDate>Fri, 30 Sep 2011 05:18:14 +0000</pubDate>
		<dc:creator>thaidn</dc:creator>
				<category><![CDATA[Bảo mật và mật mã học]]></category>
		<category><![CDATA[Lý thuyết mã hóa]]></category>

		<guid isPermaLink="false">http://www.procul.org/blog/?p=3734</guid>
		<description><![CDATA[1. Giới thiệu Bây giờ nhắc đến Netscape chắc ít người còn nhớ, nhưng trong giai đoạn đầu của cuộc cách mạng World Wide Web hồi giữa những năm 1990, Netscape có vị thế như Google hay Facebook bây giờ. Rồi cuộc chiến trình duyệt lần thứ nhất nổ ra và Netscape là kẻ bại [...]]]></description>
			<content:encoded><![CDATA[<p><strong>1. Giới thiệu</strong></p>
<p>Bây giờ nhắc đến Netscape chắc ít người còn nhớ, nhưng trong giai đoạn đầu của cuộc cách mạng World Wide Web hồi giữa những năm 1990, Netscape có vị thế như Google hay Facebook bây giờ. Rồi <a href="http://en.wikipedia.org/wiki/Browser_Wars">cuộc chiến trình duyệt lần thứ nhất</a> nổ ra và Netscape là kẻ bại trận dưới tay gã khổng lồ Microsoft. Từ chỗ chiếm hơn 90% thị phần trình duyệt với sản phẩm chủ lực Netscape Navigator, Netscape giờ đây không còn được mấy ai biết đến. Dẫu vậy di sản mà họ để lại vẫn rất vĩ đại.</p>
<p>Netscape tạo nên Mozilla và đóng góp mã nguồn vào các phiên bản trình duyệt đầu tiên của tổ chức này. Javascript, ngôn ngữ lập trình được sử dụng phổ biến nhất trên WWW, cũng là một sản phẩm của Netscape. Vậy thì Netscape có liên quan gì đến tiêu đề của bài viết này? Secure Socket Layer (SSL), bộ giao thức giữ vai trò quyết định cho sự hình thành và phát triển của thương mại điện tử, nói không ngoa cũng là niềm hi vọng của cả thế giới về sự an toàn và riêng tư trên Internet, cũng được tạo ra ở Netscape.</p>
<p>Netscape làm xong SSL 1.0 từ năm 1994, nhưng phiên bản này chưa bao giờ được công bố. SSL 2.0 được công bố rộng rãi vào tháng Hai năm 1995. Không lâu sau đó người ta phát hiện ra nhiều vấn đề nghiêm trọng với bộ giao thức này nên vào năm 1996, Netscape phát hành SSL 3.0 với nhiều cải tiến nhằm sửa các lỗ hổng ở SSL 2.0. IETF, tổ chức quy định các tiêu chuẩn trên Internet, chuẩn hóa SSL và tạo ra Transportation Layer Security (TLS) và phát hành TLS 1.0 vào năm 1999.</p>
<p><span id="more-3734"></span></p>
<p>Năm 2002, trong một email với nhan đề &#8220;<a href="http://www.mail-archive.com/openssl-dev@openssl.org/msg10664.html">An attack against SSH2 protocol</a>&#8221; gửi đến nhóm phát triển OpenSSH, Wei Dai mô tả một tấn công chọn bản rõ (chosen-plaintext attack) vào cơ chế hoạt động <a href="http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation">CBC</a> (cipher-block chaining) của các mã khối (block cipher). Tấn công của Wei Dai dựa trên một ý kiến của Phillip Rogaway đưa ra từ năm 1995, khi ông bàn về <a href="http://www.cs.ucdavis.edu/~rogaway/papers/draft-rogaway-ipsec-comments-00.txt">các điểm yếu trong việc sử dụng mật mã của giao thức IPSEC</a>.</p>
<p>Không lâu sau đó, Bodo Möller, lập trình viên của dự án OpenSSL, nhận thấy tấn công của Rogaway-Dai có thể áp dụng được cho giao thức SSL 3.0 và TLS 1.0. Ông đề xuất một giải pháp khá thông minh, tạm gọi là <a href="http://www.openssl.org/~bodo/tls-cbc.txt">giải pháp OpenSSL</a> (chi tiết tôi sẽ nói sau) và tích hợp giải pháp đó vào phiên bản OpenSSL 0.9.6d phát hành giữa năm 2002. Tuy vậy, do gặp vấn đề về tương thích với trình duyệt Internet Explorer 6 của Microsoft (ai mà không gặp vấn đề này?), nên giải pháp OpenSSL thường bị gỡ bỏ trong các cài đặt của OpenSSL.</p>
<p>Ngoài OpenSSL ra, không một nhà phát triển SSL nào quan tâm đến tấn công Rogaway-Dai, vì ý tưởng này được xem là chỉ có ý nghĩa về mặt lý thuyết. Không ai nghĩ rằng có thể xây dựng được một tấn công thực thụ vào các ứng dụng SSL từ ý tưởng này, ngoại trừ Gregory Bard. Lần lượt trong hai năm, 2004 và 2006, Bard thử áp dụng tấn công Rogaway-Dai vào <a href="http://eprint.iacr.org/2004/111">SSL trong trình duyệt</a> và <a href="http://eprint.iacr.org/2006/136">SSL trong VPN</a>. Mặc dù Bard đã cho thấy được &#8220;diện mạo&#8221; của tấn công Rogaway-Dai khi áp dụng vào SSL sẽ ra sao, nhưng các tấn công của Bard vẫn không thể áp dụng được trong thực tế (tôi sẽ quay lại điểm này sau).</p>
<p>Trong khi đó, để ngăn chặn triệt để tấn công Rogaway-Dai, IETF quyết định chỉnh sửa TLS 1.0 và phát hành TLS 1.1 vào năm 2006. Đây là một điều chỉnh lớn, bởi vì TLS 1.1 (và TLS 1.2) không tương thích với TLS 1.0 và SSL 3.0. Đối với IETF, tấn công Rogaway-Dai, tồn tại trong hơn 11 năm từ những phiên bản đầu tiên của SSL, xem như là đã được giải quyết rốt ráo. Cho đến khi B.E.A.S.T được giới thiệu trong thời gian gần đây.</p>
<p>BEAST áp dụng Rogaway-Dai để tấn công vào giao thức HTTPS. Nếu như trước đây các tấn công vào HTTPS vốn chỉ tập trung vào việc khai thác điểm yếu của hạ tầng khóa công khai/chứng chỉ số thì BEAST thực sự giải mã các yêu cầu mà trình duyệt gửi đến máy chủ xuyên qua HTTPS, rồi lấy trộm các bánh quy HTTP (HTTP cookie). Trong số các ý kiến bình luận về BEAST, tôi thích nhất ý kiến của <a href="http://news.cnet.com/8301-30685_3-20108633-264/researchers-to-detail-hole-in-web-encryption/">Karsten Nohl</a>:</p>
<blockquote><p>The TLS exploit is a neat fusion of two streams in vulnerability research: Cryptanalysis and client-side attacks. In this case, a known client-side problem&#8211;namely (that) Web sites are not shielded from one another&#8211;is used to break an assumption in cryptography&#8211;that a user&#8217;s computer will not attack the user.</p>
<p>Users already need to trust all the Web sites they are visiting due to vulnerabilities in their browsers (&#8220;drive-by exploits&#8221;) and in trusted Web sites (&#8220;tab-nabbing&#8221;). The new exploit strongly reminds us of this rule.</p></blockquote>
<p>BEAST chỉ ra rằng: do tính chất liên kết của Web, rất dễ để thực hiện tấn công chọn bản rõ vào HTTPS. Một website bất kỳ có thể khiến trình duyệt của bạn mở một kết nối HTTPS đến một website khác và trong các kết nối đó, kẻ tấn công kiểm soát được phần lớn nội dung. Nói cách khác, BEAST có thể dễ dàng biến trình duyệt thành một encryption oracle, rồi cứ lần lượt gửi bản rõ vào, quan sát bản mã và lập lại (adaptive chosen-plaintext attack). Trong video trình diễn dưới đây, BEAST sẽ giải mã các yêu cầu HTTPS để lấy các bánh quy HTTP và từ đó truy cập vào tài khoản PayPal của nạn nhân.</p>
<p><iframe width="500" height="375" src="http://www.youtube.com/embed/BTqAIDVUvrU?fs=1&#038;feature=oembed" frameborder="0" allowfullscreen></iframe></p>
<p><strong><em>(Phần 2: CBC &#8211; Tấn công Rogaway-Dai)</em></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.procul.org/blog/2011/09/30/beast-1/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Stuxnet</title>
		<link>http://www.procul.org/blog/2011/07/15/stuxnet/</link>
		<comments>http://www.procul.org/blog/2011/07/15/stuxnet/#comments</comments>
		<pubDate>Fri, 15 Jul 2011 04:55:55 +0000</pubDate>
		<dc:creator>thaidn</dc:creator>
				<category><![CDATA[Bảo mật và mật mã học]]></category>
		<category><![CDATA[Tin tức đó đây]]></category>

		<guid isPermaLink="false">http://www.procul.org/blog/?p=3469</guid>
		<description><![CDATA[Wired vừa mới đăng một bài rất thú vị thuật lại quá trình người ta phát hiện và phân tích Stuxnet, con sâu máy tính được cho là đã phá hỏng hàng ngàn máy ly tâm trong các nhà máy làm giàu uranium của Iran: It was January 2010, and investigators with the International Atomic [...]]]></description>
			<content:encoded><![CDATA[<p>Wired vừa mới đăng một bài rất thú vị thuật lại quá trình người ta phát hiện và phân tích <a href="http://www.wired.com/threatlevel/2011/07/how-digital-detectives-deciphered-stuxnet/all/1">Stuxnet</a>, con sâu máy tính được cho là đã phá hỏng hàng ngàn máy ly tâm trong các nhà máy làm giàu uranium của Iran:</p>
<blockquote><p>It was January 2010, and investigators with the International Atomic Energy Agency had just completed an inspection at the uranium enrichment plant outside Natanz in central Iran, when they realized that something was off within the cascade rooms where thousands of centrifuges were enriching uranium.</p>
<p>Natanz technicians in white lab coats, gloves and blue booties were scurrying in and out of the “clean” cascade rooms, hauling out unwieldy centrifuges one by one, each sheathed in shiny silver cylindrical casings.</p>
<p>Any time workers at the plant decommissioned damaged or otherwise unusable centrifuges, they were required to line them up for IAEA inspection to verify that no radioactive material was being smuggled out in the devices before they were removed. The technicians had been doing so now for more than a month.</p>
<p>Normally Iran replaced up to 10 percent of its centrifuges a year, due to material defects and other issues. With about 8,700 centrifuges installed at Natanz at the time, it would have been normal to decommission about 800 over the course of the year.</p>
<p>But when the IAEA later reviewed footage from surveillance cameras installed outside the cascade rooms to monitor Iran’s enrichment program, they were stunned as they counted the numbers. The workers had been replacing the units at an incredible rate — later estimates would indicate between 1,000 and 2,000 centrifuges were swapped out over a few months.</p>
<p>The question was, why?</p></blockquote>
<p>Tóm gọn lại thì Stuxnet:</p>
<p>1. Chứa mã khai thác 4 lỗ hổng chưa vá (zero-day vulnerability) của hệ điều hành Windows. Trên thị trường mua bán lỗ hổng và mã khai thác, giá của một đoạn mã khai thác lỗ hổng Windows chưa được vá có thể lên đến hàng trăm ngàn USD.</p>
<p>2. Được chứng thực điện tử (digitally signed) bằng khóa riêng (private key) hoàn toàn hợp lệ của hai công ty phần mềm Đài Loan. Điều này giúp Stuxnet &#8220;trà trộn&#8221; và thay đổi nhưn của Windows mà không bị phát hiện.</p>
<p>3. Chỉ tập trung vào một mục tiêu duy nhất, mặc dù đã được &#8220;trang bị tận răng&#8221;. Mục tiêu này có vẻ không kết nối Internet, nên Stuxnet cũng không có cơ chế lây lan qua Internet, mà lây lan thông qua mạng LAN hoặc các ổ cứng USB.</p>
<p>4. Âm thầm phá hoại khi đã lây nhiễm vào mục tiêu. Coi phim Hollywood thường thấy bọn cướp ngân hàng hay đánh lừa các hệ thống camera theo dõi bằng cách chiếu đi chiếu lại một đoạn băng đã thu trước. Stuxnet cũng có một đoạn mã dành riêng cho việc đánh lừa các hệ thống theo dõi y như trong phim!</p>
<p>Kết quả là:</p>
<blockquote><p>If the malware’s aim had been to destroy centrifuges in Iran and cripple the country’s ability to produce a nuclear weapon, the consensus is that it failed. A physical attack would have been much more effective, though obviously much less stealthy or politically expedient. But if its intent was simply to delay and sow uncertainty in Iran’s nuclear program, then it appeared to succeed — for a time.</p>
<p>Earlier this year, the outgoing head of Israel’s Mossad said that unspecified malfunctions had set back Iran’s ability to produce a nuclear weapon until 2015. United States Secretary of State Hillary Clinton also said Iran’s nuclear program had been “slowed,” but added “[W]e have time. But not a lot of time.” Albright has noted that Iran has material to build only 12,000-15,000 centrifuges, and if 1,000 to 2,000 were destroyed, this would hasten the demise of its stockpile.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.procul.org/blog/2011/07/15/stuxnet/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Mật mã khóa công khai: hành trình 35 năm</title>
		<link>http://www.procul.org/blog/2011/04/12/m%e1%ba%adt-ma-khoa-cong-khai-s%e1%bb%b1-phat-tri%e1%bb%83n-t%c6%b0%c6%a1ng-h%e1%bb%97-v%e1%bb%9bi-cac-nganh-khoa-h%e1%bb%8dc-khac/</link>
		<comments>http://www.procul.org/blog/2011/04/12/m%e1%ba%adt-ma-khoa-cong-khai-s%e1%bb%b1-phat-tri%e1%bb%83n-t%c6%b0%c6%a1ng-h%e1%bb%97-v%e1%bb%9bi-cac-nganh-khoa-h%e1%bb%8dc-khac/#comments</comments>
		<pubDate>Tue, 12 Apr 2011 22:40:32 +0000</pubDate>
		<dc:creator>Phan Dương Hiệu</dc:creator>
				<category><![CDATA[Ảnh hưởng của CNTT]]></category>
		<category><![CDATA[Bảo mật và mật mã học]]></category>
		<category><![CDATA[Lý thuyết tính toán]]></category>
		<category><![CDATA[Toán Ứng Dụng]]></category>
		<category><![CDATA[Hàm cửa lật]]></category>
		<category><![CDATA[Khóa công khai]]></category>
		<category><![CDATA[Mật mã]]></category>
		<category><![CDATA[Mật mã học]]></category>
		<category><![CDATA[RSA]]></category>
		<category><![CDATA[xác suất]]></category>
		<category><![CDATA[Độ phức tạp tính toán]]></category>

		<guid isPermaLink="false">http://www.procul.org/blog/?p=3250</guid>
		<description><![CDATA[(Một phiên bản ngắn hơn của bài  này sẽ đăng trong số kỷ niệm 20 năm báo Tia Sáng. Các bạn có thể xem tại đây) Mã hóa khóa công khai ra đời cách đây 35 năm, đánh dấu bởi công trình khoa học của Whitfield Diffie và Martin Hellman. Đó thực sự là một [...]]]></description>
			<content:encoded><![CDATA[<p><em>(Một phiên bản ngắn hơn của bài  này sẽ đăng trong số kỷ niệm 20 năm báo Tia Sáng. Các bạn có thể xem <a href="http://dl.dropbox.com/u/15421912/Tiasang_Matma.pdf">tại đây</a>)</em></p>
<p>Mã hóa khóa công khai ra đời cách đây 35 năm, đánh dấu bởi công trình khoa học của Whitfield Diffie và Martin Hellman. Đó thực sự là một bước ngoặt đưa mật mã từ một nghệ thuật thành một ngành khoa học. Trong quá trình 35 năm phát triển, những phát kiến trong mật mã hầu hết rất phản trực quan, và do đó càng bất ngờ thú vị, đã có ảnh hưởng lớn đến nhiều ngành khoa học khác: áp dụng những kết quả trừu tượng trong lý thuyết số vào thực tế; thúc đẩy sự phát triển của các thuật toán xác suất; đưa ra những khái niệm quan trọng trong lý thuyết tính toán mà điển hình là khái niệm chứng minh tương tác; tạo cầu nối giữa lý thuyết số và khoa học máy tính thông qua lý thuyết số tính toán… Trong bài này, chúng tôi sẽ điểm sơ qua sự phát triển của mật mã trong mối liên hệ với các ngành khoa học khác, và thảo luận về những hướng phát triển của mật mã trong những năm tới.</p>
<p><span id="more-3250"></span></p>
<p><strong>Thay đổi trong cách tiếp cận tính an toàn.</strong></p>
<p>Từ ngàn xưa con người ta đã có nhu cầu trao đổi bí mật: từ những mệnh lệnh trong các cuộc chiến tranh cho đến những hẹn hò thường nhật. Ta tìm thấy vết tích của mật mã từ thời Ai cập cổ đại, cho tới hệ mã nổi tiếng mà Ceasar dùng trong thời La mã, cho tới bức thư tình mà <a href="http://5ko.free.fr/fr/sand.html">George Sand gửi cho Alfred de Musset</a>… Ở thời kỳ sơ khai, mật mã có thể coi như nghệ thuật che giấu thông tin mà độ an toàn đạt được là nhờ có sự thống nhất một qui ước bí mật chung. Như vậy, thuật toán lập mã và giải mã là bí mật. Nhưng khi tầm ứng dụng càng rộng thì yêu cầu bí mật cơ chế mã lại càng không hợp lý vì nhiều người sử dụng nên tất yếu sẽ rất dễ bị lộ. Cuối thế kỷ 19, Kerckhoffs đề nghị một nguyên tắc xem xét độ an toàn chỉ dựa trên khóa bí mật còn thuật toán lập mã/giải mã không cần phải giữ kín. Qui tắc này đến nay vẫn còn là rất cơ bản. Xuyên suốt thế kỷ vừa qua, người ta đã xây dựng được rất nhiều các cơ chế mã tốt, với độ an toàn dựa trên sự bảo mật của khóa chung giữa người gửi và người nhận. Tuy vậy, sự cần thiết chia sẻ khóa bí mật là một điểm bất thuận lợi, nó là rào cản lớn cho việc trao đổi thông tin trên diện rộng: ví dụ để thiết lập kênh bí mật đôi mội giữa một nghìn người thì cần tới cả nửa triệu khóa bí mật.</p>
<p>Mật mã khóa công khai đã vượt qua rào cản đó và đưa đến một bước ngoặt trong sự phát triển ngành mật mã. Ý tưởng chính của nó khá giản đơn: lập mã và giải mã là hai quá trình có bản chất khác nhau, nếu như giải mã nhất thiết phải dùng khóa bí mật (nếu không ai cũng giải được) thì lập mã lại không nhất thiết như vậy, và thậm chí sẽ càng tốt hơn khi ai cũng có thể lập mã. Do vậy, nếu ta có thể sinh ra một khóa bí mật cho giải mã và một khóa công khai tương ứng cho lập mã thì quá trình lập mã không còn cần bất kỳ bí mật nào. Tuy có vẻ tự nhiên nhưng việc mã hóa sử dụng khóa công khai làm thay đổi hoàn toàn yêu cầu về sự an toàn: khóa bí mật không cần chia sẻ nữa, mỗi người có khóa bí mật của riêng mình và chỉ cần giữ kín nó, không cần thiết phải chia sẻ nó với bất kỳ ai khác. Sự đảm bảo an toàn không còn cần dựa trên sự tin tưởng lẫn nhau giữa người gửi và người nhận.</p>
<p>Mật mã khóa công khai còn làm thay đổi hoàn toàn phạm vi ứng dụng, cho phép mật mã được sử dụng rộng rãi trong thực tế: việc thiết lập kênh bí mật giữa một nghìn hay một triệu người thì cũng chỉ yêu cầu mỗi người cần giữ một khóa bí mật và công bố một khóa công khai, không cần phải thống nhất khóa chung nào. Áp dụng vào thực tế, một cửa hàng trực tuyến có thể thu hút hàng triệu khách hàng mà chỉ cần công khai duy nhất một khóa để ai mua hàng cũng chỉ cần dùng khóa công khai đó để gửi thông tin bảo mật về thẻ thanh toán.<strong> </strong></p>
<p><strong> </strong></p>
<p><strong>Mật mã với lý thuyết độ phức tạp tính toán</strong></p>
<p>Bên cạnh những ưu điểm mang tính bước ngoặt, mã hóa khóa công khai ẩn chứa một điều đáng lo ngại về tính an toàn: khi công bố khóa công khai tương ứng với khóa bí mật sẽ có thể dẫn tới việc khóa bí mật không còn … hoàn toàn bí mật! Điều lo ngại đó hoàn toàn có cơ sở bởi một kẻ tấn công có thể thử hết các trường hợp có thể để tìm ra khóa bí mật tương ứng với khóa công khai. Do đó, về nguyên tắc, kẻ tấn công có thể phá được sơ đồ mã hóa, tìm ra khóa bí mật mà không cần quan sát bất kể bản mã nào! Chính vì thế mà độ an toàn của mật mã khóa công khai sẽ không thể chỉ dựa trên sự giữ bí mật khóa nữa. Muốn đảm bảo sự an toàn, ta phải chứng tỏ làm sao, dù về nguyên tắc, kẻ tấn công có thể tìm ra khóa bí mật, nhưng thời gian để đạt được mục đích đó phải là rất lớn, cỡ hàng triệu năm trên một máy tính nhanh nhất chẳng hạn. Hay nói cách khác, độ phức tạp mà kẻ tấn công có thể tìm lại khóa bí mật là lớn phi thực tế.</p>
<p>Một cách rất tự nhiên, nghiên cứu độ an toàn của mật mã khóa công khai đã nằm gọn trong lý thuyết độ phức tạp tính toán (<em>Computational Complexity</em>). Trong lý thuyết độ phức tạp, ta không chỉ quan tâm xem một bài toán có thể giải được hay không, mà điều quan trọng nhất là nghiên cứu xem để giải bài toán đó thì độ khó khăn lớn đến đâu. Độ phức tạp được phân cấp theo các lớp, trong đó hai lớp quan trọng nhất là lớp P và lớp NP. Lớp P bao gồm những bài toán giải được trong thời gian đa thức, và nó được coi là lớp các bài toán có thể giải được trong thực tế. Chẳng hạn các bài toán sắp xếp dữ liệu theo một thứ tự định sẵn, tìm đường đi ngắn nhất giữa hai thành phố, biến đổi Fourrier rời rạc (đều có thể thực hiện được với cỡ <em>nlog(n) </em>bước cho <em>n</em> đối tượng, tức là bị chặn bên bởi một đa thức <img src='http://s.wordpress.com/latex.php?latex=p%28n%29%3Dn%5E2&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p(n)=n^2' title='p(n)=n^2' class='latex' />) là những bài toán trong P. Lớp NP là lớp các bài toán có thể kiểm tra được lời giải đúng hay sai trong thời gian đa thức. Chẳng hạn trò chơi Sudoku thuộc lớp NP vì để giải nó có thể rất khó (thậm chí nó được chứng minh là một trong những bài toán thuộc <a href="http://en.wikipedia.org/wiki/Mathematics_of_Sudoku">lớp khó giải nhất trong NP</a>) nhưng để kiểm tra một phương án có là lời giải không thì có lẽ chỉ cần đến một cậu bé biết phân biệt các con số với nhau và duyệt qua tất cả các ô. Rõ ràng chỉ khi lời giải có thể kiểm tra được trong thực tế thì bài toán mới được quan tâm, do vậy mà lớp NP có vai trò quan trọng. Câu hỏi trọng tâm của lý thuyết độ phức tạp là liệu các bài toán trong NP có thể có lời giải thực tế (tức trong thời gian đa thức) hay không, tức liệu P có bằng NP? Nếu P=NP thì điều đó đem lại một sự bất ngờ cho nhận thức của chúng ta: việc tìm ra lời giải cũng chỉ khó như việc kiểm tra lời giải. Điều khó tin đó làm người ta thường giả thuyết rằng P khác NP. Sự quan trọng của câu hỏi “P chọi NP?” là lý do để nó được viện Clay xếp vào một trong bảy bài toán thiên niên kỷ.</p>
<p>Quay trở lại với lý thuyết mật mã và xem xét nó dưới góc nhìn của lý thuyết độ phức tạp. Giờ đây ta có thể định nghĩa hệ mã bị phá nếu như có thuật toán phá mã (tìm lại khóa bí mật từ khóa công khai, hay đơn giản hơn, tìm lại bản rõ từ bản mã) trong thời gian đa thức. Vậy độ phức tạp của thuật toán phá mã liệu có thể đánh giá trong trường hợp chung? Câu trả lời là có và với mọi sơ đồ mã hóa khóa công khai đều có thuật toán phá mã thuộc lớp NP: do điều kiện cần của hệ mã là khi giải mã ta phải tìm lại đúng bản rõ, bài toán kiểm tra xem 1 khóa bí mật có tương ứng với 1 khóa công khai hay không là dễ dàng (chỉ cần chọn 1 bản rõ, mã nó dùng khóa công khai rồi giải mã nó với khóa bí mật xem có thu lại được đúng bản rõ hay không). Bài toán “P chọi NP” trở nên có tầm quan trọng sống còn tới lý thuyết mật mã: nếu hai lớp này tương đương thì toàn bộ lý thuyết nghiên cứu mật mã dưới góc nhìn độ phức tạp sẽ hoàn toàn sụp đổ vì việc phá mã, vốn thuộc NP, khi đó sẽ có thể thực hiện được trong thời gian đa thức. Và cũng do vậy, nghiên cứu độ phức tạp trong mật mã cần phải dựa trên giả thuyết “P khác NP”.</p>
<p><strong>Hàm cửa lật một chiều và sự phát triển của lý thuyết số tính toán </strong></p>
<p>Khi tính an toàn chia tay với nghệ thuật che giấu bí mật để chuyển sang dựa trên lý thuyết độ phức tạp thì cũng là lúc mật mã bất ngờ tìm đến và làm những nghiên cứu trừu tượng trong lý thuyết số bỗng có những áp dụng đầy ý nghĩa trong thực tế. Nó cũng đưa lý thuyết số tính toán (<em>computational number theory</em>) trở thành một nhánh nghiên cứu quan trọng, nằm giữa vùng giao thoa của toán học và tin học.</p>
<p>Tựu chung yêu cầu để xây dựng mật mã khóa công khai là: hàm lập mã thì dễ (với khóa công khai), nhưng hàm giải mã thì khó khi không có khóa bí mật. Đó là các hàm cửa lật một chiều (<em>trapdoor oneway functions</em>): tính xuôi thì dễ, tính ngược lại phải khó, nhưng với cửa lật là khóa bí mật thì tính ngược, tức giải mã, cũng phải dễ. Yêu cầu trông có vẻ đơn giản đó nhưng thực tế là sau rất nhiều năm tìm kiếm vẫn chỉ có rất ít hàm có thể thỏa mãn. Các bài toán trong lớp NP-đầy đủ (là lớp các bài khó nhất trong NP, trò chơi Sudoku là một trong số đó; ta chỉ cần giải được 1 bài trong lớp NP-đầy đủ trong thời gian đa thức là đủ để chứng tỏ P=NP) rõ ràng là những ứng cử viên tiềm năng để xây dựng hàm cửa lật một chiều. Nhưng thực tế không hề dễ như ban đầu người ta hình dung, vì hai lý do: thứ nhất là bởi các bài toán NP chỉ quan tâm đến độ khó trong trường hợp xấu nhất, trong khi mã hóa cần mã an toàn cho mọi bản rõ nên cần ít nhất độ khó trong trường hợp trung bình; thứ hai là bởi tính chất cửa lật, bài toán cần khó nhưng với một số thông tin thì nó lại phải trở nên dễ giải, và chính yêu cầu về tính chất cửa lật đó đã khiến nhiều hệ mã dựa trên bài toán NP-đầy đủ (như hệ mã Chor-Rivest dựa trên bài toán xếp ba lô) bị phá vỡ.</p>
<p>Những hàm cửa lật thông dụng trong mật mã đã đến từ những bài toán rất cổ điển của lý thuyết số! Đó là bài toán phân tích số (cho một số <em>N = pq</em> là tích của hai số nguyên tố, phân tích nó ra thừa số nguyên tố <em>p,q</em>) và bài toán logarit rời rạc trong trường hữu hạn (cho một phần tử sinh <em>g</em> của một nhóm con của một trường hữu hạn, và một phần tử nhóm <em>u=g<sup>a</sup></em>, bài toán là phải tìm lại <em>a</em>). Cả hai bài toán này, tuy về mặt toán học là giải được, nhưng cho đến nay không thể giải được trong thời gian đa thức. Bài toán phân tích số là nền tảng cho độ an toàn của hệ mã nổi tiếng RSA, và bài toán logarit rời rạc là cơ sở cho hệ mã Elgamal. Chính vì tính phổ dụng của hai hệ mã này mà một cách tất nhiên, bài toán phân tích số và bài toán logarit rời rạc trở thành đối tượng nghiên cứu rất được quan tâm. Việc nghiên cứu tính phức tạp của việc tìm ra lời giải cho các bài toán lý thuyết số đã đưa tới sự phát triển sâu rộng của lý thuyết số tính toán.</p>
<p>Sau nhiều công trình nghiên cứu quan trọng thì các bài toán bài toán phân tích số và bài toán logarit rời rạc tuy chưa giải được trong thời gian đa thức nhưng cũng không cần đến thời gian hàm mũ để giải nó, mà đã có các thuật toán dưới mũ (<em>sub-exponention</em>) như thuật toán dùng tính chỉ số (<em>index calculus</em>) và thuật toán dùng <em>đường cong</em> <em>elliptic</em> của Lenstra, được giới thiệu năm 1985. Dù cho những công trình này không làm các hệ mã sụp đổ, nhưng nó buộc phép xây dựng các hệ mã phải giảm hiệu quả vì phải dùng các khóa dài hơn để đảm bảo an toàn. Công trình của Lenstra cũng đánh dấu lần đầu tiên lý thuyết các đường cong elliptic được sử dụng vào mật mã, ở đây có vai trò như phá mã. Điều thú vị là ngay sau đó thì lý thuyết các đường cong elliptic đã được sử dụng cho việc lập mã. Koblitz và Miller cùng độc lập đề nghị thay thế việc sử dụng nhóm trong trường hữu hạn bằng nhóm các điểm trên đường cong elliptic vì ở đó, các thuật toán dưới mũ đã biết để giải quyết bài toán logarit rời rạc có vẻ như không thể áp dụng được. Từ đó việc sử dụng đường cong elliptic dẫn tới dẫn đến những hệ mã hiệu quả hơn (do không cần phải chọn khóa quá dài để chống lại các thuật toán dưới mũ).</p>
<p>Các kết quả lý thuyết sâu sắc trong lý thuyết số tiếp tục được áp dụng vào mật mã. Việc sử dụng đường cong elliptic dẫn tới yêu cầu cần phải lựa chọn những đường cong phù hợp. Tấn công MOV (đưa ra bởi Menezes, Okamoto, và Vanstone) chỉ ra không phải loại đường cong elliptic nào cũng có thể được sử dụng, bằng cách đưa việc giải quyết bài toán logarit rời rạc trên đường cong elliptic trở lại bài toán logarit rời rạc trên một trường hữu hạn mở rộng với độ mở rộng tùy thuộc vào loại đường cong. Do đó, các đường cong siêu lạ (<em>supersingular</em>) rất được ưa dùng ở giai đoạn đầu lại trở nên rất yếu vì ở đó độ mở rộng chỉ cao nhất là 6. Nét đặc biệt trong tấn công MOV là việc sử dụng phép ghép cặp (<em>pairings</em>) trên các đường cong elliptic, với những kết quả khá mới mẻ trong lý thuyết số. Không chỉ phục vụ cho việc phá mã, việc sử dụng phép ghép cặp sau đó đã trở nên cực kỳ hữu hiệu trong việc xây dựng mã. Khởi đầu là Joux đã dùng phép ghép cặp để xây dựng sơ đồ  trao đổi khóa 3 bên, nhưng sự kiện nổi bật là việc dùng phép ghép cặp để giải quyết vấn đề mở về xây dựng mã hóa dựa trên danh tính-<em>Identity based Encryption</em>. Một cách giản đơn, mã hóa dựa trên danh tính cho phép ta sử dụng một khóa công khai duy nhất cho tất cả mọi người (từ đó giải quyết được vấn đề quản lý khóa của mã hóa khóa công khai, tuy vậy nhược điểm của nó là lại cần có thêm người quản trị đáng tin cậy để sinh ra khóa công khai chung và khóa bí mật cho từng người) và hàm lập mã dựa trên khóa công khai chung và danh tính của người nhận như địa chỉ email.  Sau khi Sakai-Ohgishi-Kasahara và Boneh-Franklin đưa ra lời giải cho bài toán mã hóa dựa trên danh tính vào những năm 2000, phép ghép cặp đã được sử dụng hầu khắp trong mọi lĩnh vực của mật mã (mã hóa, chứa ký điện tử, sơ đồ định danh&#8230;) để nâng cao tính an toàn và hiệu quả và đôi khi là giải quyết những bài toán mở đã bế tắc trong thời gian dài (chẳng hạn như trong việc xây dựng chữ ký nhóm). Đến cách đây vài năm người ta đã tổ chức hẳn một hội nghị (Pairing-based Cryptograhy) dành cho các nghiên cứu liên quan đến các thuật toán xây dựng và phân tích các phép ghép cặp trên các đường cong elliptic hay hyperelliptic và các phương pháp mã và tấn công mã dựa trên phép ghép cặp.</p>
<p>Nhìn lại các phát triển của lý thuyết số tính toán, ta nhận thấy các phương pháp mới thường được đề nghị đầu tiên cho phá mã, nhưng rồi sau đó lại được sử dụng rất hiệu quả cho việc lập mã. Điều đó cũng phần nào chứng tỏ vai trò tương hỗ giữa cộng đồng những người thám mã và lập mã: trong rất nhiều trường hợp, chính những người say mê tìm cách phá tính an toàn của các hệ thống mật mã, sẽ là những người đem tới những phát kiến mới mẻ để xây dựng những hệ mã an toàn hơn.</p>
<p><strong> </strong></p>
<p><strong>Đảm bảo tính an toàn và sự phát triển của lý thuyết các thuật toán xác suất</strong></p>
<p>Để có thể cài đặt được hệ mã RSA, một phần tất yếu là sự cần thiết phải tìm được những số nguyên tố lớn để có thể đảm bảo yêu cầu an toàn tối thiểu (khóa công khai chứa tích của hai số nguyên tố, và nếu một trong hai số nguyên tố là nhỏ thì bài toán phân tích số sẽ là dễ). Từ đó mà yêu cầu tìm các số nguyên tố lớn trở nên rất cần thiết.</p>
<p>Cho tới nay, các phương pháp tìm số nguyên tố lớn đều theo nguyên tắc hai bước: bước 1 là chọn một số tự nhiên đủ lớn và bước 2 là kiểm tra xem số được chọn có là số nguyên tố hay không. Do các số nguyên tố có cấu trúc rất bí hiểm và ta chưa hiểu được quy luật tường minh của chúng nên bước 1 chưa có cách nào khác là chọn một số ngẫu nhiên. Bước thứ 2 là bước kiểm tra tính nguyên tố. Chính những thuật toán kiểm tra tính nguyên tố, mà điển hình là những thuật toán được sử dụng rộng rãi của của Rabin và Solovay, Strassen,  đã khởi đầu cho việc dùng xác suất để thiết kế các thuật toán (chú ý rằng trước đó khá lâu phương pháp xác suất đã được Erd ̋os sử dụng trong việc chỉ ra <em>sự tồn tại</em> của các đối tượng tổ hợp). Các thuật toán xác suất cho ta lời giải không hoàn toàn chính xác, nhưng độ không chính xác có thể làm nhỏ tới bao nhiêu cũng được, với điều kiện đầu vào của thuật toán có một nguồn ngẫu nhiên đủ lớn.</p>
<p>Việc phát triển các thuật toán xác suất dẫn tới sự cần thiết tìm nguồn ngẫu nhiên đủ lớn. Điều đó dẫn tới việc nghiên cứu những bài toán sau đó đã trở nên rất có ý nghĩa trong khoa học máy tính như bài toán trích nguồn ngẫu nhiên (<em>randomness extractor</em>, nhằm từ một nguồn không hoàn toàn ngẫu nhiên ta phải trích ra từ đó một lượng tin có độ ngẫu nhiên cao)  và bài toán sinh dãy giả ngẫu nhiên (<em>pseudo-random generator</em> &#8211; từ một nguồn ngẫu nhiên nhỏ làm sao sinh ra một nguồn gần như ngẫu nhiên lớn hơn rất nhiều, nó không hoàn toàn ngẫu nhiên nhưng không có thuật toán nào trong thời gian đa thức có thể chỉ ra tính không ngẫu nhiên của nó)</p>
<p>Sau nhiều phát triển quan trọng của lý thuyết thuật toán xác suất, người ta quay lại hoài nghi “liệu độ ngẫu nhiên có thực sự mang tới sự hiệu quả?”. Bài toán “BPP chọi P” (ở đó BPP là lớp các bài toán giải được theo nghĩa xác suất) là một bài toán mở trọng tâm của lý thuyết độ phức tạp. Cũng như bài toán “P vs. NP”, nếu câu trả lời là hai lớp tương đương thì nó sẽ dẫn tới một khẳng định bất ngờ: mọi thuật toán xác suât đều có thể có thuật toán tất định tương đương. Bên cạnh câu hỏi tổng quan này, các nhà nghiên cứu quay lại với bài toán tìm số nguyên tố nhằm đưa ra một lời giải tất định cho nó. Công trình lý thuyết đột phá của Agrawal–Kayal–Saxena đưa ra năm 2000, đã chỉ ra một thuật toán tất định để kiểm thử tính nguyên tố trong thời gian đa thức, giải quyết trọng vẹn bước thứ 2 một cách tất định. Sự hấp dẫn của một lời giải hoàn chỉnh cho bài toán tất định tìm số nguyên tố chính là nguồn cảm hứng chung rất lớn của các nhà toán-tin học và nó được chọn là bài toán khởi đầu cho một kế hoạch đầy tham vọng nhằm thay đổi tư duy trong hợp tác nghiên cứu khoa học: hợp tác mở thông qua đóng góp, trao đổi mở trên mạng. Với sự nhiệt tình của Timothy Gower, Terence Tao  (cả hai đều đạt giải thưởng Fields), đã có rất nhiều nhà khoa học tham gia vào dự án mở Polymath để cùng trao đổi nhằm tìm kiếm lời giải cho bài toán này. Tuy chưa thể đưa ra lời giải toàn phần, họ đã có một số kết quả dẫn tới một <a href="http://arxiv.org/abs/1009.3956">bài báo khoa học</a> dưới tên tác giả Polymath. Rất có thể đây sẽ là một hình thức cộng tác khoa học xuyên biên giới có sức mạnh tổng hợp lớn trong tương lai.</p>
<p><strong>Chứng minh tương tác không để lộ tri thức </strong></p>
<p><strong> </strong></p>
<p>Trong mật mã, mọi trao đổi thông tin đều giả thiết có sự hiện diện của kẻ xấu. Mục đích của ta là vừa có thể thuyết phục người đối thoại về tính đúng đắn của một mệnh đề nào đó, lại vừa không cần tin tưởng anh ta, và không muốn sau khi trao đổi anh ta cũng có khả năng chứng minh mệnh đề đó với người khác. Chẳng hạn, một thành viên của một câu lạc bộ bí mật muốn chứng minh danh tính của mình cho người gác cổng, nhưng lại không muốn nói mật khẩu của mình vì sợ chính người gác cổng sẽ bán nó cho kẻ khác. Trong ngữ cảnh đó, một trong những khái niệm thú vị nhất của khoa học máy tính đã được đề nghị: chứng minh tương tác (<em>interactive proofs</em>). Khái niệm này được đưa ra bởi Goldwasser, Micali và Rackof vào đầu những năm 80 và nhờ đó họ đã được trao giải Godel đầu tiên trong lịch sử (giải thưởng hàng năm cho công trình lý thuyết xuất sắc nhất trong khoa học máy tính).</p>
<p>Dưới góc độ toán học, ta thường quan niệm chứng minh là một dãy các lập luận lô gíc có thể trình bày tường minh trên giấy. Liệu chăng yếu tố đối thoại, tương tác giữa người chứng minh và người kiểm tra có mang đến điều mới mẻ? Để trả lời câu hỏi đó, trước hết khái niệm về một chứng minh sẽ phải thay đổi. Goldreich thường trích lời thầy giáo Simon của mình khi giảng về các chứng minh tương tác:</p>
<p style="text-align: center;"><em>“chứng minh là bất kể cách gì có thể thuyết phục được tôi” </em><em>(“ A proof is whatever convinces me”).</em></p>
<p><em> </em></p>
<p>Theo nghĩa đó, một chứng minh tương tác là một chuỗi các chất vấn, cho tới khi người hỏi bị thuyết phục hoàn toàn bởi người chứng minh. Một câu chuyện vui kể rằng, rằng, một cậu bé cho rằng mình có câu thần chú để mở vách ngăn giữa hai nhánh của một hang động. Tất nhiên cậu ta không muốn lộ câu thần chú của mình, nhưng lại muốn chứng minh khả năng đó.  Trò chơi đuổi bắt có thể là một chứng minh tương tác hiệu quả: chú bé chạy vào 1 trong hai ngã, một người đuổi chon một hướng nhằm dồn chú vào ngách ngăn nhưng cuối cùng không lần nào bắt được chú. Nếu đuổi một lần ta có thể cho là chú đã chọn ngã khác, nhưng lặp đi lặp lại trò chơi tới 100 lần mà không lần nào đuổi được thì có lẽ ta bị thuyết phục là chú đúng là có câu thần chú (ví dụ lấy từ <a href="http://en.wikipedia.org/wiki/Zero-knowledge_proof">Wikipedia</a>). Các chứng minh tương tác hầu hết dựa trên một tinh thần như thế.</p>
<p><a href="http://www.procul.org/blog/wp-content/uploads/2011/04/ZK2.png"><img class="alignright size-medium wp-image-3263" title="ZK" src="http://www.procul.org/blog/wp-content/uploads/2011/04/ZK2-300x209.png" alt="" width="300" height="209" /></a></p>
<p>Có những bài toán mà người ta chưa biết cách nào chứng minh trong thời gian đa thức, nhưng lại chứng minh được thông qua tương tác, chẳng hạn bài toán chứng minh hai đồ thị không đồng cấu với nhau.  Hơn thế nữa, trong nhiều bài toán, người chứng minh có thể không cần để lộ ra bất kể tri thức nào anh ta có về cái chứng minh đó (<em>zero-knowledge proofs</em>).</p>
<p><em> </em></p>
<p>Kết quả rất đẹp của Goldreich, Micali và Wigderson cho ta kết quả bất ngờ: dựa trên giả thuyết tồn tại các hàm một chiều, tất cả những gì ta có thể chứng minh trong thực tế (theo nghĩa trong thời gian đa thức), đều có thể chứng minh mà không để lộ tri thức! Bài toán chứng minh danh tính phía trên là một trong số đó.</p>
<p>Các chứng minh không để lộ tri thức đặc biệt quan trọng trong mật mã, là thành phần cơ bản trong việc xây dựng các sơ đồ mã hóa, chữ ký điện tử. Chứng minh không để lộ tri thức cũng là thành phần không thể thiếu trong một sơ đồ bầu cử điện tử, cho phép mỗi cử tri kiểm tra được lá phiếu của mình đã được tính đến mà việc kiểm phiếu lại không cần phải công bố nội dung từng lá phiếu, đảm bảo quyền lựa chọn bí mật của cử tri.</p>
<p>Ở một khía cạnh khác, chứng minh tương tác cũng là phần hồn của nhánh khoa học «chứng minh tính bảo mật » (<em>provable security</em>), nơi ta cố gắng chứng minh tính an toàn của hệ thống trong một thế giới tương tác rất phức tạp (với sự hiện diện của kẻ tấn công luôn muốn lừa hệ thống thông qua quan sát, nghe trộm, đóng giả người tốt để tương tác với hệ thống) dựa trên những giả thuyết tĩnh, giản đơn của toán học.</p>
<p><strong>Một số h</strong><strong>ướng đi tương lai của mật mã </strong></p>
<p><strong> </strong></p>
<p><em>Bảo mật trong điện toán đám mây (cloud computing)</em></p>
<p>Điện toán đám mây cho phép ta lưu trữ những khối lượng thông tin khổng lồ trên mạng và thực hiện các thao tác trên nó một cách dễ dàng. Nó có thể giúp ta giải quyết những bài toán lớn mà trước đây khó có thể giải quyết trên một mạng lưới các máy tính mang tính chất cục bộ. Tuy nhiên, điều đó mang tới một thách thức vô cùng lớn về tính bảo mật. Có hai điều có vẻ như mâu thuẫn nhau: lưu trữ dữ liệu lớn trên các hệ thống xa lạ rõ ràng rất dễ bị đánh cắp thông tin, nhưng nếu ta mã hóa toàn bộ dữ liệu thì sẽ khó có thể tận dụng sức mạnh của tính toán đám mây để thao tác dữ liệu đó.</p>
<p>Nhưng gần đây, vấn đề tưởng khó có thể giải quyết này đã có chút tia hy vọng, với công trình của Gentry năm 2009 về mật mã đẳng cấu theo cả phép nhân và phép cộng (<em>fully homomorphic encryption</em>). Hệ mã này cho phép, từ hai bản mã của hai bản rõ <em>m</em> và <em>m’</em>, ta có thể tính được bản mã nhân của <em> mm’</em> và bản mã cộng của <em>m+m’</em>. Vấn đề với bề ngoài đơn giản nhưng chứa đựng không ít nghịch lý trong đó: hệ mã vừa phải đảm bảo an toàn cho dữ liệu (không thể biết thông tin về bản rõ <em>m, m’</em>), mà lại vẫn thao tác được trên dữ liệu đó. Và cũng với bề ngoài giản đơn như vậy, nó lại mang đến một ý nghĩa rất bao quát: do mọi tính toán đều có thể qui về các phép toán cơ bản là cộng và nhân, một hệ mã như thế sẽ cho ta khả năng làm mọi tính toán trên dự liệu được mã hóa! Điều đó có nghĩa ta có thể để tất cả dữ liệu bảo mật trên những máy mạng không an toàn mà vẫn có thể tận dụng được sức tính toán lớn của điện toán đám mây để thao tác trên dữ liệu được mã hóa. Tuy nhiên, hiện tại, hệ mã Gentry và một số hệ mã cải tiến còn có hiệu quả vô cùng thấp, hầu như chỉ mang tính lý thuyết. Một hệ mã hiệu quả sẽ là lời giải tuyệt vời cho bài toán an toàn thông tin trong điện toán đám mây.</p>
<p><em>Mở rộng mô hình mã hóa: cho đối tượng nhóm và cho việc giải mã bộ phận</em></p>
<p><strong> </strong></p>
<p>Mã hóa thường cho ta thiết lập kênh trao đổi thông tin giữa một người với một người. Tuy nhiên, những ứng dụng thực tế đòi hỏi khả năng ta mã một lần sao cho nhiều người cùng có thể giải mã. Một ví dụ điển hình là việc phát chương trình truyền hình mã hóa sao cho hàng triệu thuê bao đều giải được mã. Nhưng một ứng dụng như vậy sẽ đặt ra hai vấn đề: mã một lần cho nhiều người (<em>broadcast encryption</em>) và ngăn chặn một người hay một nhóm người thuê bao cấu kết nhau để làm một bộ giải mã giả (<em>tracing traitor</em>). Hiện tại các thuật toán được sử dụng trong truyền hình thuê bao hầu hết đang còn ở thời nguyên thủy: độ an toàn buộc phải dựa trên tính bí mật của thuật toán. Nhưng cũng bởi vậy nên khi một nhóm phá mã có thể phá được nguyên lý bằng kỹ nghệ đảo ngược (<em>reverse engineering</em>) thì thị trường chợ đen có thể bán tràn lan các bộ giải mã giả mà không có cách gì truy lại được ai là thủ phạm.</p>
<p>Hai năm trở lại đây, một hướng nghiên cứu khá mới là về một kiểu mã tổng quát có thể bao quát hết các khái niệm về mã hóa công khai, mã hóa dựa trên danh tính, hay mã hóa một lần cho nhiều người. Đó là loại mã hàm (<em>functional encryption</em>) ở đó nó cho phép người lập mã định nghĩa một cơ chế giải mã<em> </em>để đối với mỗi người nhận, tùy vào thuộc tính được gán có mà có thể truy cập sâu vào bản rõ tới đâu. Cho tới nay, đối với những cơ chế mã với các cấu trúc tương đối phức tạp, các phương án lập mã còn rất hạn chế về hiệu quả. Những kết quả trong tương lai chắc chắn sẽ mang tới những ứng dụng rất hiệu quả, đặc biệt là cho việc truy cập các cơ sở dữ liệu mã hóa lớn.</p>
<p><em>An toàn trước các tấn công vật lý</em></p>
<p><em> </em></p>
<p>Mật mã thường phân tích tính an toàn dựa trên giả thuyết là khóa bí mật được bảo vệ tốt. Tuy nhiên, những tấn công vật lý đôi khi lại có thể tìm ra những thông tin về khóa (chẳng hạn bằng cách đo năng lượng tiêu thụ của máy giải mã trên các bản mã khác nhau). Do vậy, một trong các mục đích của mật mã là tìm cách hình thức hóa các khái niệm tấn công vật lý và tiếp sau đó là thiết kế các sơ đồ mã hóa mà tính an toàn có thể đảm bảo chỉ duy nhất dựa trên các giả thiết toán học. Hướng nghiên cứu an toàn trong mô hình khóa bị lộ (<em>key leakage resilient cryptography</em>) đang khá được quan tâm trong cộng đồng mật mã.</p>
<p><strong> </strong></p>
<p><em>An toàn trước sự tấn công của máy tính lượng tử </em></p>
<p>Cuối cùng, chúng ta không thể bỏ qua sự hiện diện tiềm tàng của máy tính lượng tử, dù rằng cho tới nay các máy tính lượng tử mới chỉ phân tích được số 21 ra thừa số nguyên tố. Nhưng về mặt lý thuyết, nó có tiềm năng to lớn không thể không kể tới. Công trình của Shor năm 94 đã chỉ ra rằng bài toán phân tích số có thể giải được trong thời gian đa thức bởi máy tính lượng tử.  Bài toán logarít rời rạc trong trường hữu hạn hay trên đường cong elliptic cũng có thể giải được trong thời gian đa thức bởi máy tính lượng tử. Điều đó có nghĩa là các hệ mã thông dụng hiện nay sẽ bị phá vỡ một khi máy tính lượng tử được thiết kế chạy được trên dữ liệu lớn. Để phòng ngừa trước điều đó (dù khả năng sớm xảy ra được đánh giá là rất nhỏ), nhiều nghiên cứu nhằm xây dựng các hệ mã có thể an toàn trước máy tính lượng tử được đề nghị. Hai hướng chính đang được quan tâm là các hệ mã dựa trên mã sửa sai (<em>error correcting codes</em>) và dựa trên lý thuyết lưới Euclid (<em>lattice based cryptography</em>), nơi sự hiện diện của máy tính lượng tử có vẻ như không đem lại hiệu quả đặc biệt.<br />
<!-- Start of StatCounter Code --><br />
<script type="text/javascript">// <![CDATA[
 var sc_project=5132594; var sc_invisible=1; var sc_partition=58; var sc_click_stat=1; var sc_security="b1a02981";
// ]]&gt;</script></p>
<p><script src="http://www.statcounter.com/counter/counter.js" type="text/javascript"></script><noscript></p>
<div class="statcounter"><a title="wordpress statistics" href="http://www.statcounter.com/wordpress.com/" target="_blank"><img class="statcounter" src="http://c.statcounter.com/5132594/0/b1a02981/1/" alt="wordpress statistics" ></a></div>
<p></noscript><br />
<!-- End of StatCounter Code --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.procul.org/blog/2011/04/12/m%e1%ba%adt-ma-khoa-cong-khai-s%e1%bb%b1-phat-tri%e1%bb%83n-t%c6%b0%c6%a1ng-h%e1%bb%97-v%e1%bb%9bi-cac-nganh-khoa-h%e1%bb%8dc-khac/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Stuxnet, tế bào đầu tiên của Skynet?</title>
		<link>http://www.procul.org/blog/2010/09/22/stuxnet-t%e1%ba%bf-bao-d%e1%ba%a7u-tien-c%e1%bb%a7a-skynet/</link>
		<comments>http://www.procul.org/blog/2010/09/22/stuxnet-t%e1%ba%bf-bao-d%e1%ba%a7u-tien-c%e1%bb%a7a-skynet/#comments</comments>
		<pubDate>Thu, 23 Sep 2010 02:21:29 +0000</pubDate>
		<dc:creator>NQH</dc:creator>
				<category><![CDATA[Bảo mật và mật mã học]]></category>
		<category><![CDATA[Bảo mật]]></category>
		<category><![CDATA[Botnet]]></category>
		<category><![CDATA[Stuxnet]]></category>
		<category><![CDATA[Virus]]></category>
		<category><![CDATA[Worm]]></category>

		<guid isPermaLink="false">http://www.procul.org/blog/?p=2336</guid>
		<description><![CDATA[Skynet là &#8220;nhân vật&#8221; phản diện trong bộ Terminator. Mấy tháng vừa qua, bà con đang xôn xao về Stuxnet: The appearance of Stuxnet created a ripple of amazement among computer security experts. Too large, too encrypted, too complex to be immediately understood, it employed amazing new tricks, like taking control of a computer system [...]]]></description>
			<content:encoded><![CDATA[<p>Skynet là &#8220;nhân vật&#8221; phản diện trong bộ Terminator. Mấy tháng vừa qua, bà con <a href="http://news.yahoo.com/s/csm/20100921/ts_csm/327178">đang xôn xao</a> về Stuxnet:</p>
<blockquote><p>The appearance of Stuxnet created a ripple of amazement among computer security experts. Too large, too encrypted, too complex to be immediately understood, it employed amazing new tricks, like taking control of a computer system without the user taking any action or clicking any button other than inserting an infected memory stick. Experts say it took a massive expenditure of time, money, and software engineering talent to identify and exploit such vulnerabilities in industrial control software systems.<br />
Unlike most malware, Stuxnet is not intended to help someone make money or steal proprietary data. Industrial control systems experts now have concluded, after nearly four months spent reverse engineering Stuxnet, that the world faces a new breed of malware that could become a template for attackers wishing to launch digital strikes at physical targets worldwide. Internet link not required.<br />
&#8220;Until a few days ago, people did not believe a directed attack like this was possible,&#8221; Ralph Langner, a German cyber-security researcher, told the Monitor in an interview. He was slated to present his findings at a conference of industrial control system security experts Tuesday in Rockville, Md. &#8220;What Stuxnet represents is a future in which people with the funds will be able to buy an attack like this on the black market. This is now a valid concern.&#8221;
</p></blockquote>
<p>Xem thêm <a href="http://frank.geekheim.de/?p=1189">bài này</a>, và <a href="http://www.symantec.com/connect/symantec-blogs/security-response/11761/all/all/all/all">chuỗi bài này</a>. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.procul.org/blog/2010/09/22/stuxnet-t%e1%ba%bf-bao-d%e1%ba%a7u-tien-c%e1%bb%a7a-skynet/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Cẩn thận với mấy bạn Trung Của</title>
		<link>http://www.procul.org/blog/2010/02/02/c%e1%ba%a9n-th%e1%ba%adn-v%e1%bb%9bi-m%e1%ba%a5y-b%e1%ba%a1n-trung-c%e1%bb%a7a/</link>
		<comments>http://www.procul.org/blog/2010/02/02/c%e1%ba%a9n-th%e1%ba%adn-v%e1%bb%9bi-m%e1%ba%a5y-b%e1%ba%a1n-trung-c%e1%bb%a7a/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 06:29:27 +0000</pubDate>
		<dc:creator>NQH</dc:creator>
				<category><![CDATA[Bảo mật và mật mã học]]></category>
		<category><![CDATA[Bảo mật]]></category>
		<category><![CDATA[Vui]]></category>
		<category><![CDATA[Đoàn An Hải]]></category>

		<guid isPermaLink="false">http://www.procul.org/blog/?p=1935</guid>
		<description><![CDATA[Theo tờ Sunday Times, một tài liệu &#8220;bị lộ&#8221; của tổ chức phản gián MI5 của Anh cho biết nhiều doanh nhân Anh bị các bạn Trung Của gài bẫy bằng mỹ nhân kế và các phương tiện khác để phải tiết lộ bí mật kinh doanh. Một trong các bẫy khác là các bạn [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.timesonline.co.uk/tol/news/uk/crime/article7009749.ece">Theo tờ Sunday Times</a>, một tài liệu &#8220;bị lộ&#8221; của tổ chức phản gián MI5 của Anh cho biết nhiều doanh nhân Anh bị các bạn Trung Của gài bẫy bằng mỹ nhân kế và các phương tiện khác để phải tiết lộ bí mật kinh doanh. Một trong các bẫy khác là các bạn Trung Của tặng cho các doanh nhân các ổ USB có gài rệp, hoặc các máy chụp ảnh. Dùng các ổ USB này thì các con rệp sẽ cho phép các bạn Trung Của truy cập máy tính từ xa. Các &#8220;mỹ nhân&#8221; thì là gián điệp của quân đội nhân dân Trung Của. Các phòng khách sạn mà chính khách hay doanh nhân thường vãng lai cũng bị cài rệp.</p>
<p>Lần sau đi hội nghị nào do các bạn Trung Của tổ chức, gặp các em groupies, thì các bác cẩn thận, nhất là bác An Hải có nhiều groupies.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.procul.org/blog/2010/02/02/c%e1%ba%a9n-th%e1%ba%adn-v%e1%bb%9bi-m%e1%ba%a5y-b%e1%ba%a1n-trung-c%e1%bb%a7a/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>GT 3: Ứng dụng trong dòng dữ liệu và bảo mật</title>
		<link>http://www.procul.org/blog/2009/12/17/gt-3-%e1%bb%a9ng-d%e1%bb%a5ng-trong-dong-d%e1%bb%af-li%e1%bb%87u-va-b%e1%ba%a3o-m%e1%ba%adt/</link>
		<comments>http://www.procul.org/blog/2009/12/17/gt-3-%e1%bb%a9ng-d%e1%bb%a5ng-trong-dong-d%e1%bb%af-li%e1%bb%87u-va-b%e1%ba%a3o-m%e1%ba%adt/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 21:39:48 +0000</pubDate>
		<dc:creator>NQH</dc:creator>
				<category><![CDATA[Bảo mật và mật mã học]]></category>
		<category><![CDATA[Thuật Toán]]></category>

		<guid isPermaLink="false">http://www.procul.org/blog/?p=1838</guid>
		<description><![CDATA[3. Vài ứng dụng của thử nhóm bất ứng biến Muthu Muthukrishnan là một khoa học gia máy tính có rất nhiều đóng góp nặng ký trong nhiều nhánh khác nhau: cơ sở dữ liệu, thuật toán, dòng dữ liệu, v.v. Gần đây anh chuyển về Google làm về các thuật toán ad bidding, một [...]]]></description>
			<content:encoded><![CDATA[<p><b> 3. Vài ứng dụng của thử nhóm bất ứng biến </b></p>
<p>
<a href="http://www.cs.rutgers.edu/~muthu/">Muthu Muthukrishnan</a> là một khoa học gia máy tính có rất nhiều đóng góp nặng ký trong nhiều nhánh khác nhau: cơ sở dữ liệu, thuật toán, dòng dữ liệu, v.v. Gần đây anh chuyển về Google làm về các thuật toán ad bidding, một nhánh &#8220;hot&#8221; liên kết kinh tế học và KHMT; có thể xem là một phần của môn &#8220;kinh tế tính toán&#8221; &#8212; còn non trẻ nhưng rất thú vị. Muthukrishan cũng là một trong các khoa học gia vui vẻ dễ gần nhất mà tôi biết. Một lần giới thiệu Muthu nói chuyện, tôi hỏi anh muốn giới thiệu như thế nào, anh bảo giới thiệu thế này: &#8220;đây là Muthu, anh ta sẽ nói chuyện&#8221;. Muthukrishnan và Cormode mấy năm trước có một bài báo rất thú vị ở hội nghị FUN với nhan đề <a href="http://www.cs.rutgers.edu/&#37;7Emuthu/ccmfun.pdf">&#8220;Làm thế nào để tăng tỉ lệ nhận bài của các hội nghị đỉnh&#8221;</a>. Tôi đã giới thiệu bài này trong một <a href="http://www.procul.org/blog/2005/03/24/cac-hội-nghị-va-tỉ-lệ-nhận-bai/">blog post cũ</a>.</p>
<p>
<a href="http://www.procul.org/blog/2009/12/14/gt-1-bệnh-giang-mai-dại-số-hồi-phục-tin-hiệu-thưa-va-dong-dữ-liệu/">Hai</a> <a href="http://www.procul.org/blog/2009/12/15/gt-2-phan-ly-va-phan-cach/">bài</a> trước đã bàn về khái niệm thử nhóm bất ứng biến tổ hợp và một vài kết quả cơ bản. Trước khi nói đến các kết quả sâu hơn thì ta quay lại mô tả chi tiết một vài ứng dụng. Ứng dụng đầu tiên do Cormode và Muthukrishnan đề xuất là cho một bài toán trong <em>dòng dữ liệu</em>.</p>
<p><span id="more-1838"></span></p>
<p><b> 3.1. Một ứng dụng trong dòng dữ liệu </b></p>
<p><p>
<a href="http://www.amazon.com/gp/product/193301914X?ie=UTF8&#038;tag=bk06d-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=193301914X">Dòng dữ liệu</a> là một nhánh nghiên cứu khá mới và đầy tiềm năng, dù hai năm đổ lại đây có vẻ hơi bế tắc.</p>
<p>
Trong phạm vi của bài này ta chỉ thảo luận một bài toán của dòng dữ liệu: <em>tính các phần tử tần suất cao</em> (heavy hitter). Đại khái, giả sử ta có một router phải xử lý rất nhiều gói dữ liệu trên mạng. (Các routers ở trung tâm của Internet phải xử lý một gói dữ liệu trong vòng vài nano-giây hay thậm chí ít hơn.) Mỗi gói dữ liệu có địa chỉ đích đến. Nếu ta đang quan sát các gói dữ liệu trên dòng các gói đi qua router (cả nhiều triệu gói) mà trong đó có &#8220;rất nhiều&#8221; gói có cùng đích đến thì có khả năng là đia chỉ đó đang bị tấn công DoS. Ngược lại, nếu quá nhiều gói có cùng địa chỉ nguồn thì máy nguồn có lẽ đang bị một con sâu nhiễm và nó đang quét mạng. Trong ngữ cảnh khác, các ISPs có thể muốn thống kê xem trong số các gói dữ liệu gửi qua mạng của họ, có một số địa chỉ nào xuất hiện với tần suất cao hay không. Còn đây là một ứng dụng khác hẳn: các công ty như Google và Yahoo có rất nhiều &#8220;click streams&#8221; &#8212; triệu triệu clicks con chuột mỗi ngày. Họ có thể muốn biết hiện nay website nào được click nhiều nhất.</p>
<p>
Từ những vấn đề thực tế như vậy, chúng ta có thể định dạng bài toán tính các phần tử tần suất cao trong một dòng dữ liệu. Giả sử ta có một dòng <img src='http://s.wordpress.com/latex.php?latex=%7Bm%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{m}' title='{m}' class='latex' /> gói, trong đó <img src='http://s.wordpress.com/latex.php?latex=%7Bm%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{m}' title='{m}' class='latex' /> cực lớn và không biết trước. Mỗi gói có nhãn trong tập nhãn <img src='http://s.wordpress.com/latex.php?latex=%7B%5BN%5D%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{[N]}' title='{[N]}' class='latex' />, trong đó <img src='http://s.wordpress.com/latex.php?latex=%7BN%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{N}' title='{N}' class='latex' /> cũng rất lớn. Ví dụ, nếu tập nhãn là các địa chỉ IP thì <img src='http://s.wordpress.com/latex.php?latex=%7BN%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{N}' title='{N}' class='latex' /> có thể lên đến <img src='http://s.wordpress.com/latex.php?latex=%7B2%5E%7B32%7D%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{2^{32}}' title='{2^{32}}' class='latex' />. Chúng ta muốn thiết kế một thuật toán chỉ ra các nhãn có tần suất lớn hơn <img src='http://s.wordpress.com/latex.php?latex=%7Bm%2F%28d%2B1%29%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{m/(d+1)}' title='{m/(d+1)}' class='latex' />, trong đó <img src='http://s.wordpress.com/latex.php?latex=%7Bd%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{d}' title='{d}' class='latex' /> là một tham số (thường là hằng số). Bài toán là thiết kế một thuật toán, xử lý từng gói từng gói một trong dòng, sao cho thời gian chạy và tổng bộ nhớ dùng cho thuật toán là sub-linear trên các tham số <img src='http://s.wordpress.com/latex.php?latex=%7BN%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{N}' title='{N}' class='latex' /> và <img src='http://s.wordpress.com/latex.php?latex=%7Bm%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{m}' title='{m}' class='latex' />.</p>
<p>
Chú ý rằng có nhiều cách để định nghĩa bài toán tìm nhãn tần suất lớn này, tùy theo ứng dụng thực tế. Ví dụ, chúng ta có thể muốn tìm <img src='http://s.wordpress.com/latex.php?latex=%7Bd%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{d}' title='{d}' class='latex' /> phần tử xuất hiện nhiều nhất (không nhất thiết phải lớn hơn <img src='http://s.wordpress.com/latex.php?latex=%7Bm%2F%28d%2B1%29%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{m/(d+1)}' title='{m/(d+1)}' class='latex' /> lần.)</p>
<blockquote><p><b>Ví dụ 1 (Bài toán phần tử đa số)</b> <em> Nếu <img src='http://s.wordpress.com/latex.php?latex=%7Bd%3D1%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{d=1}' title='{d=1}' class='latex' /> thì ta cần thiết kế một thuật toán trả về nhãn nào xuất hiện nhiều hơn <img src='http://s.wordpress.com/latex.php?latex=%7Bm%2F2%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{m/2}' title='{m/2}' class='latex' /> lần. Đây là một bài tập rất tốt cho các bạn làm quen với các dòng dữ liệu. Dĩ nhiên, chúng ta không thể dùng một dãy gồm <img src='http://s.wordpress.com/latex.php?latex=%7BN%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{N}' title='{N}' class='latex' /> phần tử để đếm nhãn vì như vậy tổng không gian dùng sẽ là <img src='http://s.wordpress.com/latex.php?latex=%7B%5COmega%28N%29%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{\Omega(N)}' title='{\Omega(N)}' class='latex' />. Làm thế nào làm được việc này trong thời gian và không gian polo-log<img src='http://s.wordpress.com/latex.php?latex=%7B%28m%2CN%29%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{(m,N)}' title='{(m,N)}' class='latex' />? </em></p></blockquote>
<p><p>
Sau đây là một <a href="http://www.cs.yale.edu/publications/techreports/tr252.pdf">lời giải</a> rất dễ thương của Fischer và Salzberg; trước đó Boyer và Moore cũng đã đề xuất lời giải tương tự trong một báo cáo kỹ thuật (technical report).</p>
<blockquote><p>
 <b>Thuật toán Boyer-Moore-Fischer-Salzberg</b></p>
<p>
Chúng ta sẽ lưu trữ một biến đếm counter và một nhãn, gọi là nhãn hiện hành</p>
<p>
1. gán counter =1 và nhãn đầu tiên trong dòng dữ liệu là nhãn hiện hành</p>
<p>
2. với mỗi nhãn mới <img src='http://s.wordpress.com/latex.php?latex=%7Ba%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{a}' title='{a}' class='latex' /> trong dòng dữ liệu (từ nhãn thứ 2 trở đi) </p>
<ul>
<li> nếu <img src='http://s.wordpress.com/latex.php?latex=%7Ba%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{a}' title='{a}' class='latex' /> giống nhãn hiện hành thì tăng counter lên 1.</p>
<li> nếu <img src='http://s.wordpress.com/latex.php?latex=%7Ba%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{a}' title='{a}' class='latex' /> khác nhãn hiện hành
<ul>
<li> nếu (counter == 0) thì thay nhãn hiện hành bằng <img src='http://s.wordpress.com/latex.php?latex=%7Ba%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{a}' title='{a}' class='latex' /> và gán counter = 1;
<li> nếu (counter > 0) thì giảm counter đi 1
</ul>
</ul>
</blockquote>
<p>
Thuật toán trên chỉ dùng bộ nhớ với kích thước <img src='http://s.wordpress.com/latex.php?latex=%7B%5CTheta%28%5Clog%20N%20%2B%20%5Clog%20m%29%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{\Theta(\log N + \log m)}' title='{\Theta(\log N + \log m)}' class='latex' />, dĩ nhiên là tối ưu. Khi kết thúc, nếu có tồn tại một phần tử đa số (xuất hiện hơn <img src='http://s.wordpress.com/latex.php?latex=%7Bm%2F2%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{m/2}' title='{m/2}' class='latex' /> lần) thì phần tử đa số chính là nhãn hiện hành. Rất tiếc là nếu không có phần tử đa số thì thuật toán này không phân biệt được. Có thể chứng minh được rằng một thuật toán luôn luôn chỉ ra được phần tử đa số (hoặc báo cáo là không tồn tại phần tử đa số) buộc phải dùng không gian cỡ <img src='http://s.wordpress.com/latex.php?latex=%7B%5COmega%28m%29%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{\Omega(m)}' title='{\Omega(m)}' class='latex' />. Do đó, nếu chỉ được phép dùng không gian cỡ poly-log thì buộc chúng ta phải chấp nhận các giải pháp xấp xỉ. Ngoài ra, đã có rất nhiều các bài báo khác đưa ra các lời giải tổng quát hơn cho <img src='http://s.wordpress.com/latex.php?latex=%7Bd%3E1%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{d&gt;1}' title='{d&gt;1}' class='latex' />, xem bài mới nóng hổi của <a href="http://www2.research.att.com/~marioh/papers/cacm09.pdf">Cormode-Hadjieleftheriou</a> ở CACM 2009 và các tham khảo trong đó.</p>
<p>
Thuật toán như trên và các mở rộng của nó không giải quyết được trường hợp khi ta <em>trừ bớt</em> một nhãn khỏi dòng dữ liệu. Ví dụ, xét dòng dữ liệu là các đơn đặt hàng trên mạng của Amazon, trong đó nhãn của một mặt hàng có thể là loại mặt hàng chẳng hạn. Một cái click của một trong số cả triệu người dùng Amazon sẽ tạo ra một nhãn mới. Nhưng người dùng cũng có thể click để hủy bỏ một đơn hàng đã đặt trước đó. Như vậy, một biến thể của bài toán tính các phần tử tần suất cao đòi hỏi thuật toán cho phép xóa nhãn nữa.</p>
<p>
Có một giải pháp của Cormode-Muthukrishnan dựa trên ý tưởng thử nhóm như sau. Giả sử ta có một ma trận <img src='http://s.wordpress.com/latex.php?latex=%7Bd%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{d}' title='{d}' class='latex' />-phân-cách <img src='http://s.wordpress.com/latex.php?latex=%7B%7B%5Cbf%20M%7D%3D%28m_%7Bij%7D%29%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{{\bf M}=(m_{ij})}' title='{{\bf M}=(m_{ij})}' class='latex' /> với <img src='http://s.wordpress.com/latex.php?latex=%7Bt%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{t}' title='{t}' class='latex' /> hàng và <img src='http://s.wordpress.com/latex.php?latex=%7BN%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{N}' title='{N}' class='latex' /> cột. Như sẽ thấy trong một bài viết tới, không cần phải xây dựng ma trận này cụ thể ra (vì nếu không sẽ cần không gian <img src='http://s.wordpress.com/latex.php?latex=%7B%5COmega%28tN%29%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{\Omega(tN)}' title='{\Omega(tN)}' class='latex' />). Ta biết cách thiết kế một thuật toán hiệu quả để xác định xem <img src='http://s.wordpress.com/latex.php?latex=%7Bm_%7Bij%7D%3D1%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{m_{ij}=1}' title='{m_{ij}=1}' class='latex' /> hay không. Lưu trữ <img src='http://s.wordpress.com/latex.php?latex=%7Bt%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{t}' title='{t}' class='latex' /> bộ đếm <img src='http://s.wordpress.com/latex.php?latex=%7Bc_1%2C%20c_2%2C%20%5Cdots%2C%20c_t%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{c_1, c_2, \dots, c_t}' title='{c_1, c_2, \dots, c_t}' class='latex' />, khởi tạo bằng <img src='http://s.wordpress.com/latex.php?latex=%7B0%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{0}' title='{0}' class='latex' />. Mỗi khi có một nhãn <img src='http://s.wordpress.com/latex.php?latex=%7Bj%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{j}' title='{j}' class='latex' /> mới tới, nếu <img src='http://s.wordpress.com/latex.php?latex=%7Bm_%7Bij%7D%3D1%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{m_{ij}=1}' title='{m_{ij}=1}' class='latex' /> thì tăng <img src='http://s.wordpress.com/latex.php?latex=%7Bc_i%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{c_i}' title='{c_i}' class='latex' /> lên <img src='http://s.wordpress.com/latex.php?latex=%7B1%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{1}' title='{1}' class='latex' />. Còn nếu nhãn <img src='http://s.wordpress.com/latex.php?latex=%7Bj%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{j}' title='{j}' class='latex' /> được xóa đi thì giảm <img src='http://s.wordpress.com/latex.php?latex=%7Bc_i%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{c_i}' title='{c_i}' class='latex' /> đi <img src='http://s.wordpress.com/latex.php?latex=%7B1%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{1}' title='{1}' class='latex' />, cho với mọi <img src='http://s.wordpress.com/latex.php?latex=%7Bi%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{i}' title='{i}' class='latex' /> mà <img src='http://s.wordpress.com/latex.php?latex=%7Bm_%7Bij%7D%3D1%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{m_{ij}=1}' title='{m_{ij}=1}' class='latex' />. Ta cũng đếm tổng số <img src='http://s.wordpress.com/latex.php?latex=%7Bc%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{c}' title='{c}' class='latex' /> các gói đã đến cho đến thời điểm này, và giảm hoặc tăng <img src='http://s.wordpress.com/latex.php?latex=%7Bc%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{c}' title='{c}' class='latex' /> tùy theo phần tử mới trong dòng dữ liệu có phải xóa hay không. Tổng số không gian dùng là <img src='http://s.wordpress.com/latex.php?latex=%7BO%28t%5Clog%20m%29%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{O(t\log m)}' title='{O(t\log m)}' class='latex' />. Nếu nhãn <img src='http://s.wordpress.com/latex.php?latex=%7Bj%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{j}' title='{j}' class='latex' /> xuất hiện với tần suất nhiều hơn <img src='http://s.wordpress.com/latex.php?latex=%7Bc%2F%28d%2B1%29%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{c/(d+1)}' title='{c/(d+1)}' class='latex' /> thì <img src='http://s.wordpress.com/latex.php?latex=%7Bc_i%20%3E%20c%2F%28d%2B1%29%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{c_i &gt; c/(d+1)}' title='{c_i &gt; c/(d+1)}' class='latex' /> với mỗi bộ đếm <img src='http://s.wordpress.com/latex.php?latex=%7Bi%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{i}' title='{i}' class='latex' /> mà <img src='http://s.wordpress.com/latex.php?latex=%7Bm_%7Bij%7D%3D1%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{m_{ij}=1}' title='{m_{ij}=1}' class='latex' />. Để đơn giản vấn đề, ta sẽ giả sử rằng các nhãn tần suất thấp xuất hiện với tổng tần suất nhiều nhất là <img src='http://s.wordpress.com/latex.php?latex=%7Bc%2F%28d%2B1%29%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{c/(d+1)}' title='{c/(d+1)}' class='latex' />. (Có cách để làm mềm cái giả thiết này, nhưng điều đó không quan trọng trong ngữ cảnh của bài này.) Như vậy, nếu <img src='http://s.wordpress.com/latex.php?latex=%7Bc_i%20%5Cleq%20m%2F%28d%2B1%29%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{c_i \leq m/(d+1)}' title='{c_i \leq m/(d+1)}' class='latex' /> thì tất cả các nhãn mà bộ đếm này đếm đều là các nhãn tần suất thấp. Vì thế, từ vector bộ đếm ta có thể xây dựng vector kết quả thử nhóm <img src='http://s.wordpress.com/latex.php?latex=%7B%7B%5Cbf%20r%7D%20%5Cin%20%5C%7B0%2C1%5C%7D%5Et%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{{\bf r} \in \{0,1\}^t}' title='{{\bf r} \in \{0,1\}^t}' class='latex' /> bằng cách đặt <img src='http://s.wordpress.com/latex.php?latex=%7Br_i%20%3D%201%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{r_i = 1}' title='{r_i = 1}' class='latex' /> nếu và chỉ nếu <img src='http://s.wordpress.com/latex.php?latex=%7Bc_i%20%3E%20m%2F%28d%2B1%29%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{c_i &gt; m/(d+1)}' title='{c_i &gt; m/(d+1)}' class='latex' />. Theo bài của Cormode-Hadjieleftheriou ở trên thì giải pháp dựa trên thử nhóm cạnh tranh được với các giải pháp khác vì nó có lợi điểm là rất chính xác và nhanh, tuy vẫn còn dùng hơi nhiều không gian.</p>
<p>
Giải pháp này <b>rất cần</b> một thuật toán giải mã chạy trong thời gian poly-log<img src='http://s.wordpress.com/latex.php?latex=%7B%28N%29%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{(N)}' title='{(N)}' class='latex' />, sẽ được thảo luận trong một bài tiếp theo. Đây là một động cơ để chúng ta đi tìm cách giải mã kết quả thử nhóm trong thời gian poly<img src='http://s.wordpress.com/latex.php?latex=%7B%28t%2C%20%5Clog%20N%29%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{(t, \log N)}' title='{(t, \log N)}' class='latex' /> cho một ma trận <img src='http://s.wordpress.com/latex.php?latex=%7Bd%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{d}' title='{d}' class='latex' />-phân-cách <img src='http://s.wordpress.com/latex.php?latex=%7Bt%20%5Ctimes%20N%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{t \times N}' title='{t \times N}' class='latex' />.</p>
<p>
<p><b> 3.2. Hai ứng dụng trong bảo mật </b></p>
<p><p>
Trong bảo mật, chúng ta thường phải kiểm tra tính vẹn toàn dữ liệu (data integrity). Cách thường dùng là kèm với dữ liệu một dạng mã kiểm tra lỗi hoặc mã khôi phục lỗi (error detection, error correction codes). Phương pháp này được dùng mọi nơi, trong đĩa cứng, CD, DVD, gói dữ liệu mạng, vân vân. Đơn giản là ta thường tính giá trị băm (hash value) dùng một hàm băm tốt nào đó và tính lại giá trị này để xác minh tính toàn vẹn dữ liệu. Đây là dạng mã kiểm tra lỗi thông dụng nhất. Giả sử ta phải chứa <img src='http://s.wordpress.com/latex.php?latex=%7BN%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{N}' title='{N}' class='latex' /> món dữ liệu trong một cấu trúc dữ liệu nào đó. Ví dụ như mỗi đỉnh của một cây nhị phân, hoặc mỗi nốt trong một danh sách liên kết (linked list), hoặc mỗi nốt trong một danh sách nhảy quãng (skip list), đều có thể là một món dữ liệu. Để kiểm tra tính toàn vẹn dữ liệu, chúng ta có thể chứa <img src='http://s.wordpress.com/latex.php?latex=%7BN%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{N}' title='{N}' class='latex' /> giá trị băm của từng món. Sau đó, để kiểm tra tính toàn vẹn, ta tính lại giá trị băm của cả <img src='http://s.wordpress.com/latex.php?latex=%7BN%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{N}' title='{N}' class='latex' /> món. <a href="http://www.ics.uci.edu/~goodrich/pubs/forensics.pdf">Goodrich-Atallah-Tamassia</a> gợi ý chúng ta tính giá trị băm của nhiều tập con của các món dữ liệu này. Khi cần kiểm tra, nếu một giá trị băm không trùng thì ta biết một món trong tập con bị thay đổi. Đến đây, các bạn có thể đoán được rằng ta chỉ cần lưu trữ <img src='http://s.wordpress.com/latex.php?latex=%7BO%28d%5E2%5Clog%20N%29%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{O(d^2\log N)}' title='{O(d^2\log N)}' class='latex' /> giá trị băm thôi và đã có thể chỉ ra các món dữ liệu bị thay đổi rồi.</p>
<p>Một ứng dụng thứ hai trong bảo mật là ứng dụng để xác minh chữ ký điện tử. Nếu ta có một văn kiện điện tử đã ký dùng khóa riêng, ta có thể dùng khóa công cộng để xác minh chữ ký dễ dàng. Tuy nhiên, nếu phải làm điều này với hàng triệu văn kiện thì cũng tốn nhiều thời gian. Ý tưởng của môn &#8220;mật mã hàng loạt&#8221; (batch cryptography) là làm thế nào giảm thời gian chạy của các thuật toán mật mã học bằng cách xử lý hàng loạt các tác vụ loại này cùng một lúc. Dĩ nhiên là cái thuật toán chữ ký điện tử phải được thiết kế để nó có thể xác minh hàng loạt một cách hiệu quả được. Thuật toán xác minh chữ ký hàng loạt có tính chất sau đây: có thể đưa cho thuật toán xác minh một nhóm các văn kiện đã ký &#8212; thuật toán trả về <img src='http://s.wordpress.com/latex.php?latex=%7B0%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{0}' title='{0}' class='latex' /> nếu tất cả các văn kiện đều được xác minh và <img src='http://s.wordpress.com/latex.php?latex=%7B1%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{1}' title='{1}' class='latex' /> nếu ít nhất một văn kiện bị lỗi. Một số thuật toán xác minh hàng loạt đã được đề nghị, xem <a href="http://cseweb.ucsd.edu/~mihir/papers/batch.pdf">bài này</a>, và <a href="http://eprint.iacr.org/2009/240">bài này</a> cùng các tham khảo trong chúng. Các bạn có thể đoán phần còn lại: các ma trận <img src='http://s.wordpress.com/latex.php?latex=%7Bd%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{d}' title='{d}' class='latex' />-phân-cách cho ta biết nên nhóm các văn kiện như thể nào để xác minh hàng loạt. Lý do mà ta cân phiên bản bất ứng biến là vì ta có thể có chạy song song các phép thử trên nhiều bộ vi xử lý cùng một lúc. <a href="http://eprint.iacr.org/2009/240">Bài báo</a> của Zaverucha và Stinson so sánh các giải pháp thử nhóm khác nhau cho bài này. Các cấu hình multi-core hứa hẹn sẽ càng ngày càng phổ dụng. Còn các thuật toán ứng biến thì có bản chất tuần tự. Do đó thử nhóm bất ứng biến là một công cụ quan trọng.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.procul.org/blog/2009/12/17/gt-3-%e1%bb%a9ng-d%e1%bb%a5ng-trong-dong-d%e1%bb%af-li%e1%bb%87u-va-b%e1%ba%a3o-m%e1%ba%adt/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>GT 1: Bệnh giang mai, đại số, hồi phục tín hiệu thưa, và dòng dữ liệu</title>
		<link>http://www.procul.org/blog/2009/12/14/gt-1-b%e1%bb%87nh-giang-mai-d%e1%ba%a1i-s%e1%bb%91-h%e1%bb%93i-ph%e1%bb%a5c-tin-hi%e1%bb%87u-th%c6%b0a-va-dong-d%e1%bb%af-li%e1%bb%87u/</link>
		<comments>http://www.procul.org/blog/2009/12/14/gt-1-b%e1%bb%87nh-giang-mai-d%e1%ba%a1i-s%e1%bb%91-h%e1%bb%93i-ph%e1%bb%a5c-tin-hi%e1%bb%87u-th%c6%b0a-va-dong-d%e1%bb%af-li%e1%bb%87u/#comments</comments>
		<pubDate>Mon, 14 Dec 2009 17:31:03 +0000</pubDate>
		<dc:creator>NQH</dc:creator>
				<category><![CDATA[Bảo mật và mật mã học]]></category>
		<category><![CDATA[KHMT và sinh học]]></category>
		<category><![CDATA[Thuật Toán]]></category>
		<category><![CDATA[Xác suất & thống kê]]></category>

		<guid isPermaLink="false">http://www.procul.org/blog/?p=1818</guid>
		<description><![CDATA[1. Đại số và bệnh giang mai Hòa thượng (HT) Thích Học Toán là chuyên gia đại số hàng đầu thế giới. (Tôi học đòi cách viết bài của giáo sư Richard Lipton mà tôi rất thích.) Gần đây HT lại thành celebrity sau bầu chọn của tạp chí Time. Nhất định sẽ có nhiều [...]]]></description>
			<content:encoded><![CDATA[<p><b>1. Đại số và bệnh giang mai </b></p>
<p>
<a href="http://thichhoctoan.wordpress.com/">Hòa thượng (HT) Thích Học Toán</a> là chuyên gia đại số hàng đầu thế giới. (Tôi học đòi <a href="http://rjlipton.wordpress.com/">cách viết bài</a> của giáo sư Richard Lipton mà tôi rất thích.) Gần đây HT lại thành celebrity sau <a href="http://www.time.com/time/specials/packages/article/0,28804,1945379_1944416_1944435,00.html">bầu chọn của tạp chí Time</a>. Nhất định sẽ có nhiều bạn hỏi thế công trình của HT có ý nghĩa như thế nào trong cuộc sống, hoặc ít nhất cũng tìm cách &#8220;diễn Nôm&#8221; ý nghĩa của đóng góp của HT. Để trả lời các câu hỏi kiểu đó, xin mạn phép gợi ý 3 hướng trả lời sau đây. (Hướng cuối cùng là liên quan đến KHMT, cho nên các bạn hủ máy tính có thể nhảy xuống đó mà đọc, bỏ qua các hướng đầu.)</p>
<p><ol>
<li> Kể lại một <a href="http://www.procul.org/blog/2007/06/20/học-toan-dược-gi/">truyền thuyết về Euclid</a>, do Stobaeus kể lại:</p>
<blockquote><p>
 Khi một chú học trò hỏi Euclid: “chúng ta học hình học thì được cái gì?”, Euclid gọi một anh nô lệ vào bảo: “cho nó một đồng xu, vì nó muốn kiếm lời từ cái nó học”.
</p></blockquote>
<li> Kể lại <a href="http://nuocdenchan.wordpress.com/2009/12/13/sieu-giải/">câu chuyện của Cụ Hinh và Anh La</a>:<br />
<blockquote><p>
 Nghe thiên hạ đồn rằng có bộ kinh tiếng Phạn nọ rất thâm sâu. Cụ Hinh cầu cạnh anh La giảng giải cho. Anh La nhíu mày, rít thuốc, nhâm nhi cà fê cả buổi sáng. Đến chiều, anh La dịch toàn bộ kinh sang tiếng Bồ.</p>
<p>Cụ Hinh xem xong gật gù tán thưởng.
</p></blockquote>
<li> Đại số có ứng dụng trong trị bệnh giang mai.
</ol>
<p><span id="more-1818"></span></p>
<p>
Hồi thế chiến thứ 2, Robert Dorfman và David Rosenblatt là hai nhà kinh tế làm việc cho phòng quản lý giá cả (Office of Price Administration) của Mỹ. Họ thiết kế một thủ thục thử máu để chỉ ra ứng viên quân dịch nào có bệnh giang mai. Hồi đó người ta chưa biết chữa giang mai, và rất sợ nó lây lan vào quân dân. (Mặc dù penicillin được Alex Fleming khám phá hồi 1928, phương pháp sản xuất penicilin hàng loạt phải chờ đến đầu thập thiên 40, và sau đệ nhị thế chiến người ta mới thật sự sản xuất penicillin cho đại chúng.) Dorfman <a href="http://projecteuclid.org/DPubS?service=UI&#038;version=1.0&#038;verb=Display&#038;handle=euclid.aoms/1177731363">có một bài</a> ở tạp chí Annals of Mathematical Statistics mô tả bài toán này và một giải pháp đơn giản.</p>
<p>
Số là người ta có thể lẫy mẫu máu của các ứng viên quân dịch. Sau đó có thể dùng <a href="http://en.wikipedia.org/wiki/Wassermann_test">phép thử máu Wasserman</a> để xem mẫu máu có kháng nguyên giang mai hay không. Nếu có kháng nguyên giang mai thì nhiều khả năng là chú nhóc bị bệnh, và vì thế sẽ mất dịp tham gia D-Day. Hãy bỏ qua vụ false positive, và cho rằng phép thử máu không bị lỗi: nếu phép thử bảo có là có! (Chúng ta sẽ quay lại với trường hợp phép thử bị lỗi sau.) Vấn đề là thử nhiều triệu mẫu máu như vậy rất tốn thời gian và công sức. Ý tưởng của Dorfman là bỏ nhiều mẫu máu vào một &#8220;nhóm&#8221; và thử cùng một lúc. Nếu phép thử bảo không thì tất cả các mẫu máu đều âm tính. Nếu phép thử bảo có thì ít nhất một trong các mẫu máu là dương tính. Câu hỏi là, cho trước <img src='http://s.wordpress.com/latex.php?latex=%7BN%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{N}' title='{N}' class='latex' /> mẫu máu, thiết kế các nhóm thử &#8212; càng ít nhóm càng tốt &#8212; để chỉ ra tất cả các mẫu máu dương tính. Mỗi mẫu máu có thể được trích ra để bỏ vào nhiều nhóm. Mỗi nhóm có thể chứa một hoặc nhiều mẫu máu. Phép thử từng cá nhân một cần đến <img src='http://s.wordpress.com/latex.php?latex=%7BN%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{N}' title='{N}' class='latex' /> phép thử. Ý tưởng &#8220;thử nhóm&#8221; có làm giảm đáng kể tổng số các phép thử hay không?</p>
<p>
Từ bài báo đó, <a href="http://www.amazon.com/gp/product/9810241070?ie=UTF8&#038;tag=bk06d-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=9810241070">Môn thử nhóm</a><img src="http://www.assoc-amazon.com/e/ir?t=bk06d-20&#038;l=as2&#038;o=1&#038;a=9810241070" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> ra đời. Lúc đầu, nó có thể được xem là một nhánh của môn thiết kế thí nghiệm thống kê (<a href="http://en.wikipedia.org/wiki/Design_of_experiments">statistical experiment design</a>). Sau nhiều năm, người ta khám phá ra rằng bài toán thử nhóm cũng có thể được đặt theo nhiều cách khác. Thử nhóm là một &#8220;thinking paradigm&#8221; rất lợi hại mà chúng ta sẽ nói chi tiết hơn trong các bài tiếp theo. Sau đây là một số ví dụ về các ứng dụng trực tiếp của bài toán thử nhóm:</p>
<ol>
<li> Thay mẫu máu bằng các đồng tiền, và phép thử máu bằng phép cân tiền thì ta có các biến thể của các bài toán tìm tiền giả rất phổ biến.
<li> Stan Ulam (một đồng tác giả của bom nguyên tử H) trong quyển <a href="http://www.amazon.com/gp/product/0520071549?ie=UTF8&#038;tag=bk06d-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=0520071549">Adventures of a Mathematician</a><img src="http://www.assoc-amazon.com/e/ir?t=bk06d-20&#038;l=as2&#038;o=1&#038;a=0520071549" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> có đặt một bài toán gọi là bài toán &#8220;20 câu hỏi&#8221; như sau: Tí nghĩ trong đầu một số nguyên giữa <img src='http://s.wordpress.com/latex.php?latex=%7B1%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{1}' title='{1}' class='latex' /> và một triệu, Tèo có quyền hỏi Tí các câu hỏi nhị phân (nghĩa là câu trả lời chỉ là Có hoặc Không). Tèo cần hỏi bao nhiêu câu hỏi để đoán được con số mà Tí nghĩ? Ở đây, con số bí mật là mẫu máu bị giang mai, các câu hỏi nhị phân là các phép thử máu. Dĩ nhiên, Tí có thể nghĩ nhiều hơn một số bí mật, và trong một biến thể khác thì Tèo cần phải chỉ ra tất cả các con số bí mật mà Tí nghĩ.
<li> <a href="http://www.amazon.com/gp/product/9812568220?ie=UTF8&#038;tag=bk06d-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=9812568220">Sàng DNA (DNA screening)</a><img src="http://www.assoc-amazon.com/e/ir?t=bk06d-20&#038;l=as2&#038;o=1&#038;a=9812568220" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> trong sinh học tính toán
<li> <a href="http://www.cs.bris.ac.uk/Research/Algorithms/BAD09/Talks/BAD09-Clifford.pdf">Pattern matching</a>
<li> <a href="http://portal.acm.org/citation.cfm?id=1061325">Dòng dữ liệu</a> (data streaming)
<li><a href="http://www.eecs.umich.edu/~martinjs/papers/GS.grouptesting.pdf"> Compressed sensing &#038; sparse signal recovery</a>
<li> <a href="http://portal.acm.org/citation.cfm?id=789793">Nén ảnh</a>
<li> Nhiều ứng dụng trong mạng máy tính như <a href="http://www.springerlink.com/content/d5v6740154vhh452/">Thiết kế MAC-protocol</a> cho các mạng cục bộ và mạng cảm biến, <a href="http://portal.acm.org/citation.cfm?id=1287853.1287857">gán kênh</a> trong mạng không dây</p>
<li> Rất nhiều ứng dụng trong bảo mật như <a href="http://www.ics.uci.edu/~goodrich/pubs/forensics.pdf">Digital forensics</a>, <a href="http://eprint.iacr.org/2009/240">Xác minh các chữ ký điện tử theo nhóm</a>
<li> vân vân
</ol>
<p>
Một biến thể rất quan trọng của bàn toán thử nhóm là &#8220;thử nhóm bất ứng biến&#8221; (non-adaptive group testing), trong đó chúng ta phải thiết kế tất cả các phép thử trước, thử tất các các nhóm cùng một lúc, rồi từ đó chỉ ra các mẫu máu bị bệnh. Nếu cho phép &#8220;ứng biến&#8221; thì mẫu sau có thể tùy thuộc vào kết quả thử của mẫu trước. Ví dụ như Tèo hỏi Tí &#8220;số bạn nghĩ có lớn hơn 500 nghìn không?&#8221;, nếu câu trả lời là Có thì hỏi tiếp &#8220;số bạn nghĩ có lớn hơn 750 nghìn không?&#8221;, còn nếu câu trả lời là Không thì hỏi &#8220;số bạn nghĩ có lớn hơn 250 nghìn không?&#8221; Trong biến thể &#8220;bất ứng biến&#8221; thì không được thiết kế các câu hỏi kiểu đó, mà phải viết tất cả các câu hỏi lên giấy, gửi cho Tí tất cả, rồi dựa trên tất cả các câu trả lời để xác định các con số bí mật.</p>
<p>
Năm 1964, Kautz và Singleton viết một bài báo trên tạp chí IEEE Transactions on Information Theory, trong đó họ đề ra một cách thiết kế các nhóm chỉ cần <img src='http://s.wordpress.com/latex.php?latex=%7BO%28d%5E2%20%5Clog%5E2%20N%29%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{O(d^2 \log^2 N)}' title='{O(d^2 \log^2 N)}' class='latex' /> phép thử, trong đó <img src='http://s.wordpress.com/latex.php?latex=%7Bd%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{d}' title='{d}' class='latex' /> là chặn trên của số mẫu máu dương tính, và <img src='http://s.wordpress.com/latex.php?latex=%7BN%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{N}' title='{N}' class='latex' /> là tổng số mẫu. Họ cũng chứng minh được rằng tồn tại các phép thiết kế chỉ cần <img src='http://s.wordpress.com/latex.php?latex=%7BO%28d%5E2%5Clog%20N%29%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{O(d^2\log N)}' title='{O(d^2\log N)}' class='latex' /> phép thử, nhưng không chỉ ra được cách xây dựng. Trong bài báo này, họ nghiên cứu các &#8220;mã chồng&#8221; (superimposed codes), nhưng hai bài toán xây dựng mã chồng và xây dựng phép thử nhóm bất ứng biến là tương đương nhau. Ý tưởng của họ là dùng một mã phân tách khoảng cách tối đa (<a href="http://en.wikipedia.org/wiki/Singleton_bound">Maximum distance separable codes</a>, viết tắt là mã MDS) để xây dựng các phép thử này. Ý tưởng này là một trường hợp đặc biệt của phép nối mã (code concatenation) khá phổ biến trong lý thuyết mã hóa.</p>
<p>
Mã MDS phổ biến nhất là <a href="http://en.wikipedia.org/wiki/Reed–Solomon_error_correction">mã Reed-Solomon</a>, được dùng hàng ngày trong các ổ đĩa cứng, trong các CD và DVD, trong hệ thống truyền thông xDSL, trong truyền thông vệ tinh, vân vân và vân vân. Ý tưởng chính của mã RS rất đơn giản: để gửi một đa thức bậc <img src='http://s.wordpress.com/latex.php?latex=%7Bd%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{d}' title='{d}' class='latex' /> trên một trường hữu hạn, ta có thể gửi nhiều hơn <img src='http://s.wordpress.com/latex.php?latex=%7Bd%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{d}' title='{d}' class='latex' /> điểm mẫu (&#8220;sample points&#8221;). Mà ta biết, nhờ một định lý cơ bản của đại số về các đa thức <a href="http://thichhoctoan.wordpress.com/2009/07/19/trường-hữu-hạn/">trên trường hữu hạn</a>, là ta có thể xây dựng lại đa thức chỉ cần <img src='http://s.wordpress.com/latex.php?latex=%7Bd%2B1%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{d+1}' title='{d+1}' class='latex' /> điểm mẫu khác nhau.</p>
<p>
Gần đây hơn, mã RS và các mã RS tổng quát còn được chứng minh là có tính chất &#8220;giải mã danh sách&#8221; được (<a href="http://people.csail.mit.edu/madhu/talks/2009/TAMU-List.pdf">list-decodable</a>), liên quan rất mật thiết đến lý thuyết độ phức tạp và <a href="http://www.procul.org/blog/2009/04/07/pcp1/">định lý PCP</a>. Dùng các kết quả này, không những chúng ta có thể thiết kế các phép thử nhóm hiệu quả (chỉ cần <img src='http://s.wordpress.com/latex.php?latex=%7BO%28d%5E2%5Clog%20N%29%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{O(d^2\log N)}' title='{O(d^2\log N)}' class='latex' /> phép thử &#8212; tốt hơn phép xây dựng của Kautz và Singleton) mà còn t<a href="http://www.cse.buffalo.edu/~hungngo/papers/soda10.pdf">hiết kế được các thuật toán</a> chỉ ra các mẫu máu dương tính rất hiệu quả (chạy trong thời gian poly-log<img src='http://s.wordpress.com/latex.php?latex=%7B%28N%29%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{(N)}' title='{(N)}' class='latex' />). Thời gian giải mã nhanh này rất quan trọng trong một số ứng dụng, ví dụ như ứng dụng dòng dữ liệu.</p>
<p>
Hy vọng là mối liên hệ giữa đại số và bệnh giang mai đã được thiết lập. Lần tới chúng ta sẽ đi vào chi tiết kỹ thuật &#8212; không phải của bệnh giang mai &#8212; mà là của cả bài toán thử nhóm, các thuật toán xây dựng phép thử và giải mã kết quả thử, và của cả một số ứng dụng của bài toán thử nhóm.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.procul.org/blog/2009/12/14/gt-1-b%e1%bb%87nh-giang-mai-d%e1%ba%a1i-s%e1%bb%91-h%e1%bb%93i-ph%e1%bb%a5c-tin-hi%e1%bb%87u-th%c6%b0a-va-dong-d%e1%bb%af-li%e1%bb%87u/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

