Code C#: Chuyển đổi văn bản sang hình học

Người đăng: share-nhungdieuhay on Thứ Sáu, 31 tháng 5, 2013


<Window x:Class="GlyphExamples.GlyphClipping"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Glyph Clipping" Height="400" Width="360">
    <Grid HorizontalAlignment="Center" VerticalAlignment="Center" Width="80">
      <Grid.LayoutTransform>
        <ScaleTransform ScaleX="3" ScaleY="3" />
      </Grid.LayoutTransform>
      <Button x:Name="button1" Content="Click" />
    </Grid>
</Window>

//File:Window.xaml.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Threading;

namespace GlyphExamples
{
    public partial class GlyphClipping : System.Windows.Window
    {
        public GlyphClipping()
        {
            InitializeComponent();
            FormattedText text = new FormattedText("CLIP!",              Thread.CurrentThread.CurrentUICulture,  FlowDirection.LeftToRight, new Typeface("Gill Sans Ultra Bold"), 20, Brushes.Black);

            Geometry textGeometry = text.BuildGeometry(new Point(0, 0));
            button1.Clip = textGeometry;
        }
    }
}

More about

ASP.NET: Tạo ra các file XML từ Cơ sở dữ liệu SQL

Người đăng: share-nhungdieuhay on Thứ Năm, 30 tháng 5, 2013


<%@ Page Language="VB" Debug="true" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.XML" %>
<%@ Import Namespace="System.Data.SQLClient" %>
<script language="VB" runat="server">

Sub Page_Load(Source as Object, E as EventArgs)
Dim strCon as string = "Server=127.0.0.1;uid=sa;pwd=123;Database=Northwind;"
Dim strSQL as string = "Select EmployeeID, FirstName, LastName, Address, City, PostalCode, Country from Employees order by EmployeeID desc"
Dim objDataSet as New DataSet()
Dim conn as SQLConnection
Dim objAdapter as SQLDataAdapter

conn = New SQLConnection(strCon)
objAdapter = New SQLDataAdapter(strSQL, conn)

objAdapter.Fill(objDataSet, "Empls")

objDataSet.WriteXml(Server.MapPath("xml_file.xml"))
lbl_hienthi.text = "<a href=xml_file.xml>Check your XML file</a>"
End sub

</script>
<html>
<head>
<title>Generating XML files from SQL Database</title>
</head>
<body>
<asp:label id="lbl_hienthi" runat="server" />
</body>
</html>

More about

Mật mã học: Mật mã Caesar (Mã hóa Caesar)

Người đăng: share-nhungdieuhay on Thứ Ba, 28 tháng 5, 2013


Trong mật mã học, mật mã Caesar, còn gọi là mật mã dịch chuyển, là một trong những mật mã đơn giản và được biết đến nhiều nhất. Mật mã là một dạng của mật mã thay thế, trong đó mỗi ký tự trong văn bản được thay thế bằng một ký tự cách nó một đoạn trong bảng chữ cái để tạo thành bản mã. Vĩ dụ, nếu độ dịch là 3, A sẽ được thay bằng B, Ă sẽ được thay bằng C và cứ thế đến hết. Phương pháp được đặt tên theo Caesar, vị hoàng đế đã sử dụng nó thường xuyên trong công việc.
Bước mã hóa bằng mã Caesar thường được kết hợp với một mã phức tạp hơn, ví dụ như mật mã Vigenère, và hiện nay vẫn được dùng trong các ứng dụng hiên đại nhưROT13. Cũng như các mật mã thay thế dùng một bảng mã khác, mã Xê da dễ dàng bị phá vỡ và không đáp ứng được yêu cầu an toàn thông tin trong truyền thông.
Phép dịch chuyển có thể được biểu diễn bằng hai bảng chữ cái, ví dụ dưới đây bước dịch chuyển là 3, con số này cũng gọi là khóa mã:
Bảng chữ cái thường:   ABCDEFGHIJKLMNOPQRSTUVWXYZ
Bảng chữ cái mật mã:   DEFGHIJKLMNOPQRSTUVWXYZABC

Với bản chữ cái Tiếng Việt:
Bảng chữ cái thường:   AĂÂBCDĐEÊGHIKLMNOÔƠPQRSTUƯVXY
Bảng chữ cái mật mã:   BCDĐEÊGHIKLMNOÔƠPQRSTUƯVXYAĂÂ

Khi mã hóa hay giải mã, người ta thay thế mỗi chữ cái với chữ cái cùng hàng trong bảng trên.
Mật mã cũng có thể được thực hiện bằng số học mô đun. Đầu tiên ta chuyển đổi các chữ cái sang số, A = 0, Ă = 1, Â = 2, B = 3,... Y = 28. Mã hóa ký tự bằng cách dịch chuyển một đoạn n có thể được mô tả bằng công thức toán học dưới đây:
Và giải mã:
(Có nhiều định nghĩa cho phép toán mô đun. Trong trường hợp trên, kết quả phải nằm trong khoảng từ 0...28. Do đó nếu x+n hoặc x-n không nằm trong đoạn 0...28, ta phải cộng hoặc trừ nó với 29.)
Phép thế vẫn giữ nguyên cho toàn bộ văn bản, vì vậy mà mã hóa Xê da được xếp loại vào mã thay thế một bảng chữ cái, khác với mã thay thế nhiều bảng chữ cái.
Giải mã:
Dịch ngược lại dựa theo bảng mật mã trên.
Ví dụ:
Đầu tiên ta có văn bản Help we are being attacked với khóa mã là 15
Mã hóa
Ta tạo ra bảng chữ cái để mã hóa:
Bảng chữ cái thường:   ABCDEFGHIJKLMNOPQRSTUVWXYZ
Bảng chữ cái mật mã:   PQRSTUVWXYZABCDEFGHIJKLMNO
Ta sẽ thay các chữ H=W, E=T, L=A, ...
Văn bản ban đầu: Help we are being attacked
Văn bản mã hóa:  Wtae Lt Pgt Qtxcv Piiprzts
Giải mã
Cũng theo bảng trên, ta thay các chữ W=H, T=E, L=A, ...
Văn bản mã hóa:  Wtae Lt Pgt Qtxcv Piiprzts
Văn bản ban đầu: Help we are being attacked



More about

Mật mã học: Mật mã hóa KHÓA CÔNG KHAI (Khóa bất đối xứng)

Người đăng: share-nhungdieuhay on Thứ Bảy, 25 tháng 5, 2013


Mật mã hóa khóa công khai là một dạng mật mã hóa cho phép người sử dụng trao đổi các thông tin mật mà không cần phải trao đổi các khóa chung bí mật trước đó. Điều này được thực hiện bằng cách sử dụng một cặp khóa có quan hệ toán học với nhau là khóa công khai và khóa cá nhân (hay khóa bí mật).
Thuật ngữ mật mã hóa khóa bất đối xứng thường được dùng đồng nghĩa với mật mã hóa khóa công khai mặc dù hai khái niệm không hoàn toàn tương đương. Có những thuật toán mật mã khóa bất đối xứng không có tính chất khóa công khai và bí mật như đề cập ở trên mà cả hai khóa (cho mã hóa và giải mã) đều cần phải giữ bí mật.
Trong mật mã hóa khóa công khai, khóa cá nhân phải được giữ bí mật trong khi khóa công khai được phổ biến công khai. Trong 2 khóa, một dùng để mã hóa và khóa còn lại dùng để giải mã. Điều quan trọng đối với hệ thống là không thể tìm ra khóa bí mật nếu chỉ biết khóa công khai.
Hệ thống mật mã hóa khóa công khai có thể sử dụng với các mục đích:
  • Mã hóa: giữ bí mật thông tin và chỉ có người có khóa bí mật mới giải mã được.
  • Tạo chữ ký số: cho phép kiểm tra một văn bản có phải đã được tạo với một khóa bí mật nào đó hay không.
  • Thỏa thuận khóa: cho phép thiết lập khóa dùng để trao đổi thông tin mật giữa 2 bên.

Thông thường, các kỹ thuật mật mã hóa khóa công khai đòi hỏi khối lượng tính toán nhiều hơn các kỹ thuật mã hóa khóa đối xứng nhưng những lợi điểm mà chúng mang lại khiến cho chúng được áp dụng trong nhiều ứng dụng.
Hình 1. Chọn một số ngẫu nhiên lớn để sinh cặp khóa
1. Lịch sử
Trong hầu hết lịch sử mật mã học, khóa dùng trong các quá trình mã hóa và giải mã phải được giữ bí mật và cần được trao đổi bằng một phương pháp an toàn khác (không dùng mật mã) như gặp nhau trực tiếp hay thông qua một người đưa thư tin cậy. Vì vậy quá trình phân phối khóa trong thực tế gặp rất nhiều khó khăn, đặc biệt là khi số lượng người sử dụng rất lớn. Mật mã hóa khóa công khai đã giải quyết được vấn đề này vì nó cho phép người dùng gửi thông tin mật trên đường truyền không an toàn mà không cần thỏa thuận khóa từ trước.
Năm 1874, William Stanley Jevons xuất bản một cuốn sách mô tả mối quan hệ giữa các hàm một chiều với mật mã học đồng thời đi sâu vào bài toán phân tích ra thừa số nguyên tố (sử dụng trong thuật toán RSA). Tháng 7 năm 1996, một nhà nghiên cứu đã bình luận về cuốn sách trên như sau:
Trong cuốn The Principles of Science: A Treatise on Logic and Scientific Method được xuất bản năm 1890, William S. Jevons đã phát hiện nhiều phép toán rất dễ thực hiện theo một chiều nhưng rất khó theo chiều ngược lại. Một ví dụ đã chứng tỏ mã hóa rất dễ dàng trong khi giải mã thì không. Vẫn trong phần nói trên ở chương 7 (Giới thiệu về phép tính ngược) tác giả đề cập đến nguyên lý: ta có thể dễ dàng nhân các số tự nhiên nhưng phân tích kết quả ra thừa số nguyên tố thì không hề đơn giản. Đây chính là nguyên tắc cơ bản của thuật toán mật mã hóa khóa công khai RSA mặc dù tác giả không phải là người phát minh ra mật mã hóa khóa công khai.
Thuật toán mật mã hóa khóa công khai được thiết kế đầu tiên bởi James H. Ellis, Clifford Cocks, và Malcolm Williamson tại GCHQ (Anh) vào đầu thập kỷ 1970. Thuật toán sau này được phát triển và biết đến dưới tên Diffie-Hellman, và là một trường hợp đặc biệt của RSA. Tuy nhiên những thông tin này chỉ được tiết lộ vào năm 1997.
Năm 1976, Whitfield Diffie và Martin Hellman công bố một hệ thống mật mã hóa khóa bất đối xứng trong đó nêu ra phương pháp trao đổi khóa công khai. Công trình này chịu sự ảnh hưởng từ xuất bản trước đó của Ralph Merkle về phân phối khóa công khai. Trao đổi khóa Diffie-Hellman là phương pháp có thể áp dụng trên thực tế đầu tiên để phân phối khóa bí mật thông qua một kênh thông tin không an toàn. Kỹ thuật thỏa thuận khóa của Merkle có tên là hệ thống câu đố Merkle.
Thuật toán đầu tiên cũng được Rivest, Shamir và Adleman tìm ra vào năm 1977 tại MIT. Công trình này được công bố vào năm 1978 và thuật toán được đặt tên là RSA. RSA sử dụng phép toán tính hàm mũ môđun (môđun được tính bằng tích số của 2 số nguyên tố lớn) để mã hóa và giải mã cũng như tạo chữ ký số. An toàn của thuật toán được đảm bảo với điều kiện là không tồn tại kỹ thuật hiệu quả để phân tích một số rất lớn thành thừa số nguyên tố.
Hình 2. Dùng khóa công khai để mã hóa, dùng khóa bí mật để giải mã
Kể từ thập kỷ 1970, đã có rất nhiều thuật toán mã hóa, tạo chữ ký số, thỏa thuận khóa.. được phát triển. Các thuật toán như ElGamal (mật mã) do Netscape phát triển hay DSA do NSA và NIST cũng dựa trên các bài toán lôgarit rời rạc tương tự như RSA. Vào giữa thập kỷ 1980, Neal Koblitz bắt đầu cho một dòng thuật toán mới: mật mã đường cong elliptic và cũng tạo ra nhiều thuật toán tương tự. Mặc dù cơ sở toán học của dòng thuật toán này phức tạp hơn nhưng lại giúp làm giảm khối lượng tính toán đặc biệt khi khóa có độ dài lớn.
2. An toàn
Về khía cạnh an toàn, các thuật toán mật mã hóa khóa bất đối xứng cũng không khác nhiều với các thuật toán mã hóa khóa đối xứng. Có những thuật toán được dùng rộng rãi, có thuật toán chủ yếu trên lý thuyết; có thuật toán vẫn được xem là an toàn, có thuật toán đã bị phá vỡ... Cũng cần lưu ý là những thuật toán được dùng rộng rãi không phải lúc nào cũng đảm bảo an toàn. Một số thuật toán có những chứng minh về độ an toàn với những tiêu chuẩn khác nhau. Nhiều chứng minh gắn việc phá vỡ thuật toán với những bài toán nổi tiếng vẫn được cho là không có lời giải trong thời gian đa thức. Nhìn chung, chưa có thuật toán nào được chứng minh là an toàn tuyệt đối (như hệ thống mật mã sử dụng một lần). Vì vậy, cũng giống như tất cả các thuật toán mật mã nói chung, các thuật toán mã hóa khóa công khai cần phải được sử dụng một cách thận trọng.
3. Các ứng dụng

Ứng dụng rõ ràng nhất của mật mã hóa khóa công khai là bảo mật: một văn bản được mã hóa bằng khóa công khai của một người sử dụng thì chỉ có thể giải mã với khóa bí mật của người đó.
Các thuật toán tạo chữ ký số khóa công khai có thể dùng để nhận thực. Một người sử dụng có thể mã hóa văn bản với khóa bí mật của mình. Nếu một người khác có thể giải mã với khóa công khai của người gửi thì có thể tin rằng văn bản thực sự xuất phát từ người gắn với khóa công khai đó.
Các đặc điểm trên còn có ích cho nhiều ứng dụng khác như: tiền điện tử, thỏa thuận khóa...
Hình 3. Dùng khóa bí mật để ký một thông báo, dùng khóa công khai để xác minh chữ ký
4. Những vấn đề trong thực tế

Sự tương tự với bưu chính 
Để thấy rõ hơn ưu điểm của hệ thống mật mã hóa khóa bất đối xứng ta có thể dùng sự tương tự với hệ thống bưu chính trong ví dụ sau: 2 người (Alice và Bob) trao đổi thông tin mật thông qua hệ thống bưu chính. Alice cần gửi một bức thư có nội dung cần giữ bí mật tới cho Bob và sau đó nhận lại thư trả lời (cũng cần giữ bí mật) từ Bob.
Trong hệ thống mật mã hóa khóa đối xứng, Alice sẽ cho bức thư vào hộp và khóa lại rồi gửi hộp theo đường bưu chính bình thường tới cho Bob. Khi Bob nhận được hộp, anh ta dùng một khóa giống hệt như khóa Alice đã dùng để mở hộp, đọc thông tin và gửi thư trả lời theo cách tương tự. Vấn đề đặt ra là Alice và Bob phải có 2 khóa giống hệt nhau bằng một cách an toàn nào đó từ trước (chẳng hạn như gặp mặt trực tiếp).
Trong hệ thống mật mã hóa khóa bất đối xứng, Bob và Alice có hai khóa khác nhau. Đầu tiên, Alice yêu cầu Bob gửi cho mình khóa (công khai) theo đường bưu chính bình thường và giữ lại khóa bí mật. Khi cần gửi thư, Alice sử dụng khóa nhận được từ Bob để khóa hộp. Khi nhận được hộp đã khóa bằng khóa công khai của mình, Bob có thể mở khóa và đọc thông tin. Để trả lời Alice, Bob cũng thực hiện theo quá trình tương tự với khóa của Alice.
Điều quan trọng nhất ở đây là Bob và Alice không cần phải gửi đi khóa bí mật của mình. Điều này làm giảm nguy cơ một kẻ thứ 3 (chẳng hạn như một nhân viên bưu chính biến chất) làm giả khóa trong quá trình vận chuyển và đọc những thông tin trao đổi giữa 2 người trong tương lai. Thêm vào đó, trong trường hợp Bob do sơ suất làm lộ khóa của mình thì các thông tin do Alice gửi cho người khác vẫn giữ bí mật (vì sử dụng các cặp khóa khác).
Thuật toán: liên kết giữa 2 khóa trong cặp
Không phải tất cả các thuật toán mật mã hóa khóa bất đối xứng đều hoạt động giống nhau nhưng phần lớn đều gồm 2 khóa có quan hệ toán học với nhau: một cho mã hóa và một để giải mã. Để thuật toán đảm bảo an toàn thì không thể tìm được khóa giải mã nếu chỉ biết khóa đã dùng mã hóa. Điều này còn được gọi là mã hóa công khai vì khóa dùng để mã hóa có thể công bố công khai mà không ảnh hưởng đến bí mật của văn bản mã hóa. Trong ví dụ ở trên, khóa công khai có thể là những hướng dẫn đủ để tạo ra khóa với tính chất là một khi đã khóa thì không thể mở được nếu chỉ biết những hướng dẫn đã cho. Các thông tin để mở khóa thì chỉ có người sở hữu mới biết.
Những điểm yếu
Tồn tại khả năng một người nào đó có thể tìm ra được khóa bí mật. Không giống với hệ thống mật mã sử dụng một lần (one-time pad) hoặc tương đương, chưa có thuật toán mã hóa khóa bất đối xứng nào được chứng minh là an toàn trước các tấn công dựa trên bản chất toán học của thuật toán. Khả năng một mối quan hệ nào đó giữa 2 khóa hay điểm yếu của thuật toán dẫn tới cho phép giải mã không cần tới khóa hay chỉ cần khóa mã hóa vẫn chưa được loại trừ. An toàn của các thuật toán này đều dựa trên các ước lượng về khối lượng tính toán để giải các bài toán gắn với chúng. Các ước lượng này lại luôn thay đổi tùy thuộc khả năng của máy tính và các phát hiện toán học mới.
Mặc dù vậy, độ an toàn của các thuật toán mật mã hóa khóa công khai cũng tương đối đảm bảo. Nếu thời gian để phá một mã (bằng phương pháp duyệt toàn bộ) được ước lượng là 1000 năm thì thuật toán này hoàn toàn có thể dùng để mã hóa các thông tin về thẻ tín dụng - Rõ ràng là thời gian phá mã lớn hơn nhiều lần thời gian tồn tại của thẻ (vài năm).
Nhiều điểm yếu của một số thuật toán mật mã hóa khóa bất đối xứng đã được tìm ra trong quá khứ. Thuật toán đóng gói ba lô là một ví dụ. Nó chỉ được xem là không an toàn khi một dạng tấn công không lường trước bị phát hiện. Gần đây, một số dạng tấn công đã đơn giản hóa việc tìm khóa giải mã dựa trên việc đo đạc chính xác thời gian mà một hệ thống phần cứng thực hiện mã hóa. Vì vậy, việc sử dụng mã hóa khóa bất đối xứng không thể đảm bảo an toàn tuyệt đối. Đây là một lĩnh vực đang được tích cực nghiên cứu để tìm ra những dạng tấn công mới.
Một điểm yếu tiềm tàng trong việc sử dụng khóa bất đối xứng là khả năng bị tấn công dạng kẻ tấn công đứng giữa (man in the middle attack): kẻ tấn công lợi dụng việc phân phối khóa công khai để thay đổi khóa công khai. Sau khi đã giả mạo được khóa công khai, kẻ tấn công đứng ở giữa 2 bên để nhận các gói tin, giải mã rồi lại mã hóa với khóa đúng và gửi đến nơi nhận để tránh bị phát hiện. Dạng tấn công kiểu này có thể phòng ngừa bằng các phương pháp trao đổi khóa an toàn nhằm đảm bảo nhận thực người gửi và toàn vẹn thông tin. Một điều cần lưu ý là khi các chính phủ quan tâm đến dạng tấn công này: họ có thể thuyết phục (hay bắt buộc) nhà cung cấp chứng thực số xác nhận một khóa giả mạo và có thể đọc các thông tin mã hóa.
Khối lượng tính toán
Để đạt được độ an toàn tương đương, thuật toán mật mã hóa khóa bất đối xứng đòi hỏi khối lượng tính toán nhiều hơn đáng kể so với thuật toán mật mã hóa khóa đối xứng. Vì thế trong thực tế hai dạng thuật toán này thường được dùng bổ sung cho nhau để đạt hiệu quả cao. Trong mô hình này, một bên tham gia trao đổi thông tin tạo ra một khóa đối xứng dùng cho phiên giao dịch. Khóa này sẽ được trao đổi an toàn thông qua hệ thống mã hóa khóa bất đối xứng. Sau đó 2 bên trao đổi thông tin bí mật bằng hệ thống mã hóa đối xứng trong suốt phiên giao dịch.
Mối quan hệ giữa khóa công khai với thực thể sở hữu khóa
Để có thể đạt được những ưu điểm của hệ thống thì mối quan hệ giữa khóa công khai và thực thể sở hữu khóa phải được đảm bảo chính xác. Vì thế các giao thức thiết lập và kiểm tra mối quan hệ này là đặc biệt quan trọng. Việc gắn một khóa công khai với một định danh người sử dụng thường được thực hiện bởi các giao thức thực hiện hạ tầng khóa công khai (PKI). Các giao thức này cho phép kiểm tra mối quan hệ giữa khóa và người được cho là sở hữu khóa thông qua một bên thứ ba được tin tưởng. Mô hình tổ chức của hệ thống kiểm tra có thể theo phân lớp (các nhà cung cấp chứng thực số - X.509) hoặc theo thống kê (mạng lưới tín nhiệm - PGP, GPG) hoặc theo mô hình tín nhiệm nội bộ (SPKI). Không phụ thuộc vào bản chất của thuật toán hay giao thức, việc đánh giá mối quan hệ giữa khóa và người sở hữu khóa vẫn phải dựa trên những đánh giá chủ quan của bên thứ ba bởi vì khóa là một thực thể toán học còn người sở hữu và mối quan hệ thì không. Hạ tầng khóa công khai chính là các thiết chế để đưa ra những chính sách cho việc đánh giá này.
Các vấn đề liên quan tới thời gian thực
Một khóa công khai nào đó có thể liên quan tới một số lượng lớn và khó xác định người sử dụng. Vì thế sẽ tốn rất nhiều thời gian khi muốn thu hồi hoặc thay thế một khóa vì lý do an ninh. Do vậy, các hệ thống hoạt động trong thời gian thực khi áp dụng mã hóa khóa công khai cần phải hết sức thận trọng. Có ít nhất 4 vấn đề cần quan tâm được đề cập sau đây.
Thẩm quyền thu hồi khóa
Việc thu hồi khóa có tính phá hoại hoặc sai sót sẽ có khả năng gây ra ảnh hưởng nghiêm trọng tới hệ thống. Trường hợp này hoàn toàn có thể xảy ra nếu việc thu hồi khóa có thể được thực hiện bởi chỉ một thực thể. Chúng ta có thể làm giảm nguy cơ này bằng cách thực hiện chính sách thu hồi khóa với sự tham gia của hai thực thể trở lên. Chẳng hạn, một khóa chỉ bị thu hồi khi có sự chấp thuận của cả Alice và Bob. Tuy nhiên, xét về phương diện an ninh thì chính sách này tạo nên yếu điểm cho hệ thống. Kẻ tấn công chỉ cần thực hiện tấn công từ chối dịch vụ (DoS) vào Bob hoặc Alice là có thể làm hệ thống ngừng hoạt động.
Do thực thể có thẩm quyền thu hồi khóa rất quan trọng đối với hệ thống nên các cơ chế thực hiện cần đảm bảo càng nhiều bên tham gia càng tốt để chống lại phá hoại đồng thời lại phải đảm bảo càng ít càng tốt để có thể thực hiện việc thu hồi nhanh chóng.
Phân phối khóa mới
Sau khi một khóa bị thu hồi thì một khóa mới cần được phân phối theo một trình tự định trước.
Giả sử khóa của Carol đã bị thu hồi. Trước khi có khóa mới Carol không thể tham gia trao đổi thông tin mật. Không ai có thể gửi thông tin cho Carol mà không vi phạm an ninh hệ thống và các thông tin từ Carol sẽ bị loại bỏ. Điều này cũng có nghĩa phần của hệ thống do Carol kiểm soát ngừng hoạt động. Trong trường hợp này yêu cầu về an ninh được đặt lên trên yêu cầu về tính sẵn sàng của hệ thống.
Trong hệ thống, người có thẩm quyền tạo khóa mới có thể trùng với người có thẩm quyền thu hồi khóa nhưng không bắt buộc như vậy. Nếu xét về phương diện an ninh thì đây không phải là ý tưởng tốt. Vấn đề nảy sinh là chúng ta cần giảm khoảng thời gian giữa thời điểm thu hồi khóa và thời điểm tạo khóa mới tới mức tối thiểu. Để làm tốt việc này lại đòi hỏi một nơi/một thực thể có đủ 2 thẩm quyền nêu trên. Vấn đề là chúng ta phải cân bằng giữa yêu cầu về an ninh và yêu cầu về tính sẵn sàng của hệ thống.
Thông báo thông tin về thu hồi khóa
Thông báo về một khóa nào đó bị thu hồi cần đến được tất cả những người đang sử dụng nó trong thời gian ngắn nhất có thể.
Đối với hệ thống phân phối người ta có 2 cách đưa các thông tin thu hồi khóa đến người dùng: thông tin được đẩy (push) từ điểm trung tâm tới người dùng hoặc người dùng lấy (pull) thông tin từ trung tâm.
Đẩy thông tin từ trung tâm là cách đơn giản nhất để gửi thông tin tới toàn thể người sử dụng. Tuy nhiên không thể đảm bảo là thông tin thực sự tới được đích và đối với một hệ thống lớn thì khả năng gửi thành công tới tất cả người dùng là thấp. Thêm vào đó, thời gian hoàn thành truyền tin sẽ là khá lớn và trong suốt quá trình này thì hệ thống có thể bị lợi dụng. Vì vậy, phương pháp này không đảm bảo an toàn cũng như không tin cậy.
Phương pháp thứ hai người sử dụng lấy thông tin về khóa từ trung tâm trước mỗi lần sử dụng. Điểm yếu của phương pháp này là người sử dụng sẽ bị chặn nếu không kết nối được với trung tâm. Ở đây chúng ta lại thấy một lần nữa mối liên hệ trái chiều giữa an ninh và tính sẵn sàng: càng nhiều server (tăng độ tin cậy) thì thời gian cửa sổ càng lớn (độ an toàn giảm).
Ngoài ra còn một phương án nữa là cung cấp các chứng thực có thời hạn. Việc xác định thời gian sống của mỗi chứng thực sẽ là sự cân bằng giữa yêu cầu an toàn và tính sẵn sàng của hệ thống và người dùng.
Các biện pháp tiến hành khi lộ khóa
Hầu hết các trường hợp thu hồi khóa xảy ra khi có sự kiện nào đó chứng tỏ khóa bí mật đã bị lộ. Ta gọi thời điểm xảy ra sự kiện đó là T.
Điều này dẫn tới 2 hệ quả: Các văn bản mã hóa với khóa công khai sau thời điểm T không còn được xem là bí mật; và các chữ ký số thực hiện với khóa bí mật sau thời điểm T không còn được xem là thật nếu không có những tìm hiểu kỹ lưỡng các sự kiện để tìm ra nơi thực hiện chữ ký.
Nếu nguyên nhân của việc lộ bí mật là lỗi hệ thống thì cần tiến hành ngay lập tức chiến lược phục hồi. Chiến lược này sẽ xác định người có quyền thu hồi khóa, cách thức truyền thông tin tới người dùng, cách thức xử lý các văn bản mã hóa với khóa bị lộ sau thời điểm T. Quy trình phục hồi có thể rất phức tạp và trong lúc tiến hành thì hệ thống rất dễ bị tấn công từ chối dịch vụ (DoS).
5. Một số ví dụ

Một số thuật toán mã hóa khóa công khai được đánh giá cao:

  • Diffie-Hellman
  • DSS (Tiêu chuẩn chữ ký số)
  • ElGamal
  • Các kỹ thuật Mã hóa đường cong elliptic
  • Các kỹ thuật Thỏa thuật khóa chứng thực bằng mật khẩu
  • Hệ thống mật mã Paillier
  • Thuật toán mã hóa RSA (PKCS)

Một số thuật toán mã hóa khóa công khai KHÔNG được đánh giá cao:

  • Merkle-Hellman (sử dụng bài toán cái balô)

Một số ví dụ về giao thức sử dụng mã hóa khóa công khai:

  • GPG thực hiện giao thức OpenPGP
  • IKE
  • Pretty Good Privacy
  • SSH
  • Secure Socket Layer tiêu chuẩn IETF -- TLS
  • SILC
Nguồn: Wikipedia.org
More about

Mật mã học: Thuật toán khóa đối xứng (Symmetric-Key Algorithms)

Người đăng: share-nhungdieuhay on Thứ Ba, 21 tháng 5, 2013


Trong mật mã học, các thuật toán khóa đối xứng (tiếng Anh: symmetric-key algorithms) là một lớp các thuật toán mật mã hóa trong đó các khóa dùng cho việc mật mã hóa và giải mã có quan hệ rõ ràng với nhau (có thể dễ dàng tìm được một khóa nếu biết khóa kia).
Khóa dùng để mã hóa có liên hệ một cách rõ ràng với khóa dùng để giải mã có nghĩa chúng có thể hoàn toàn giống nhau, hoặc chỉ khác nhau nhờ một biến đổi đơn giản giữa hai khóa. Trên thực tế, các khóa này đại diện cho một bí mật được phân hưởng bởi hai bên hoặc nhiều hơn và được sử dụng để giữ gìn sự bí mật trong kênh truyền thông tin.
Nhiều thuật ngữ khác dành cho việc mã hóa dùng chìa khóa đối xứng bao gồm các phương pháp mã hóa đơn khóa (single-key), phương pháp mã hóa một khóa (one-key) và phương pháp mã hóa khóa cá nhân (private-key). Cách sử dụng thuật ngữ sau cùng đôi khi gây xung đột với thuật ngữ khóa cá nhân (private-key) dùng trong mật mã hóa khóa công khai (public key cryptography).
Các loại thuật toán khóa đối xứng
Thuật toán đối xứng có thể được chia ra làm hai thể loại: mật mã luồng (stream ciphers) và mật mã khối (block ciphers). 

  • Mật mã luồng mã hóa từng bit của thông điệp
  • Mật mã khối gộp một số bit lại và mật mã hóa chúng như một đơn vị. 

Cỡ khối được dùng thường là các khối 64 bit. Thuật toán tiêu chuẩn mã hóa tân tiến (Advanced Encryption Standard), được NIST công nhận tháng 12 năm 2001, sử dụng các khối gồm 128 bit.
Các thuật toán đối xứng thường không được sử dụng độc lập. Trong thiết kế của các hệ thống mật mã hiện đại, cả hai thuật toán bất đối xứng (asymmetric) (dùng chìa khóa công khai) và thuật toán đối xứng được sử dụng phối hợp để tận dụng các ưu điểm của cả hai. Những hệ thống sử dụng cả hai thuật toán bao gồm những cái như SSL (Secure Sockets Layer), PGP (Pretty Good Privacy) và GPG (GNU Privacy Guard) v.v. Các thuật toán chìa khóa bất đối xứng được sử dụng để phân phối chìa khóa mật cho thuật toán đối xứng có tốc độ cao hơn.
Một số ví dụ các thuật toán đối xứng nổi tiếng và khá được tôn trọng bao gồm Twofish, Serpent, AES (còn được gọi là Rijndael), Blowfish, CAST5, RC4, Tam phần DES (Triple DES), và IDEA (International Data Encryption Algorithm - Thuật toán mật mã hóa dữ liệu quốc tế).
Tốc độ
Các thuật toán đối xứng nói chung đòi hỏi công suất tính toán ít hơn các thuật toán khóa bất đối xứng (asymmetric key algorithms). Trên thực tế, một thuật toán khóa bất đối xứng có khối lượng tính toán nhiều hơn gấp hằng trăm, hằng ngàn lần một thuật toán khóa đối xứng (symmetric key algorithm) có chất lượng tương đương.
Hạn chế

Hạn chế của các thuật toán khóa đối xứng bắt nguồn từ yêu cầu về sự phân hưởng chìa khóa bí mật, mỗi bên phải có một bản sao của chìa. Do khả năng các chìa khóa có thể bị phát hiện bởi đối thủ mật mã, chúng thường phải được bảo an trong khi phân phối và trong khi dùng. Hậu quả của yêu cầu về việc lựa chọn, phân phối và lưu trữ các chìa khóa một cách không có lỗi, không bị mất mát là một việc làm khó khăn, khó có thể đạt được một cách đáng tin cậy.
Để đảm bảo giao thông liên lạc an toàn cho tất cả mọi người trong một nhóm gồm n người, tổng số lượng chìa khóa cần phải có là

Hiện nay người ta phổ biến dùng các thuật toán bất đối xứng có tốc độ chậm hơn để phân phối chìa khóa đối xứng khi một phiên giao dịch bắt đầu, sau đó các thuật toán khóa đối xứng tiếp quản phần còn lại. Vấn đề về bảo quản sự phân phối chìa khóa một cách đáng tin cậy cũng tồn tại ở tầng đối xứng, song ở một điểm nào đấy, người ta có thể kiểm soát chúng dễ dàng hơn. Tuy thế, các khóa đối xứng hầu như đều được sinh tạo tại chỗ.
Các thuật toán khóa đối xứng không thể dùng cho mục đích xác thực (authentication) hay mục đích chống thoái thác (non-repudiation) được.
Tính thuận nghịch

Theo định nghĩa, các hàm số dùng trong mật mã học phải có khả năng đảo ngược (reversible), vì chúng ta cần phải có khả năng vừa mật mã hóa các thông điệp song cũng đồng thời giải mã chúng (với điều kiện chúng ta có chìa khóa đúng của nó).
Trong quá khứ, nhiều phương pháp đã được sử dụng để giải quyết việc này. Trước đây, người ta đã từng dùng sách mật mã - trong đó chìa khóa phân hưởng liên quan đến nội dụng của quyển sách, mật mã khóa tự động - trong đó chìa khóa có thể được suy ra từ một phần của văn bản thuần túy (plaintext), mã đục lỗ (grill) (Có giả thuyết rằng phương pháp này đầu tiên được nhà toán học người Ý Gerolamo Cardano sáng chế), v.v....
Trong thời đại hiện nay, khi máy tính trở nên sẵn có, đa số các phương pháp mật mã đối xứng đều dựa trên cơ sở 'vòng' tuần hoàn (các lượt tính toán được nhắc đi nhắc lại). Thường thì một lượt được nhắc đi nhắc lại nhiều lần, theo một sự bố trí khá đơn giản. 
Những bit dùng để mã hóa được phân ra là hai phần, P1 và P2. P1 được giữ nguyên, không thay đổi, P2 được cộng (hay được XOR) với một hàm băm một chiều (one-way hashed function) f (được biến thiên bởi một chìa khóa hay một nhân tố (salt)) của P1. Hai kết quả này sau đó được đổi chỗ cho nhau. Mỗi quá trình này được gọi là 'một lượt' (hay một vòng).
Chẳng hạn với p1, p2, chìa khóa là các vectơ bit; Dấu phẩy (',') là toán tử phép ghép chuỗi và f là hàm sốhầu cho:  (key = chìa khóa)
Vì kết quả của lượt tính này vẫn còn cho phép truy cập giá trị của P1, và tính cộng là một phép toán có thể đảo ngược được, cho nên phép toán có thể được giải ngược, đối với bất cứ một hàm số f nào đấy.
Tuy đã chạy qua một vòng toán, song kết quả của nó vẫn chưa được an toàn cho lắm, vì p1 vẫn còn giữ nguyên giá trị và chưa bị thay đổi, nhưng nếu chúng ta lặp lại phép toán một hoặc nhiều lần, thường là bởi nhiều hàm số khác và với 'các chìa khóa của vòng toán' ('round keys'), thì kết quả sẽ tăng cường tính đảm bảo của nó rất nhiều (greatly improves the strength).
Để giải mã bội số lượt, mỗi lượt phải được giải theo trật tự ngược lại và vì thế, trong khi giải mã, các chìa khóa cũng phải được áp dụng theo trật tự ngược lại.
Sau nhiều lần (đa số là từ 8 đến 64 lần) thi hành, kết quả trở nên bị xáo trộn đến mức, như trong trường hợp khi các mã được thiết kế khá tốt, không có phương pháp giải mã nào nhanh hơn là phương pháp brute force key search và chỉ có phương pháp này mới có thể giải được.
Tấn công với các mật mã đối xứng

Trong quá khứ, các mã đối xứng thường rất dễ bị ảnh hưởng bởi các loại tấn công gọi là tấn công với văn bản thuần túy biết trước (known-plaintext attacks), tấn công với văn bản thuần túy chọn trước (chosen plaintext attacks), thám mã vi phân (differential cryptanalysis) và thám mã tuyến tính (linear cryptanalysis). Nếu mỗi hàm số sử dụng trong các vòng toán được thiết kế một cách cẩn thận, thì nó sẽ giảm khả năng chìa khóa của mã bị tấn công một cách thành công rất nhiều.
Khi được sử dụng với mật mã đối xứng để truyền tin chìa khóa mật mã, các trình sinh tạo chìa khóa giả ngẫu nhiên (pseudorandom key generators) thường được sử dụng để sinh tạo các chìa khóa dùng trong phiên giao dịch sử dụng mật mã đối xứng. Song trong quá khứ, sự thiếu hụt trong tính ngẫu nhiên của các trình sinh tạo ngẫu số hay trong các vectơ khởi tạo (initialization vectors) của chúng thường gây ra những thảm họa và thường dẫn đến các vụ mật mã bị bẻ gãy. Việc thực hiện và triển khai thận trọng, với khởi tạo (initialization) dựa trên những nguồn entropi có chất lượng cao là một yếu tố cần thiết để thuyên giảm sự mất mát trong an ninh.



More about

Mật mã học: Tổng quan về mật mã học

Người đăng: share-nhungdieuhay on Thứ Hai, 20 tháng 5, 2013


Mật mã học là gì 
Mật mã học là một lĩnh vực liên quan với các kỹ thuật ngôn ngữ và toán học để đảm bảo an toàn thông tin, cụ thể là trong thông tin liên lạc. Về phương diện lịch sử, mật mã học gắn liền với quá trình mã hóa; điều này có nghĩa là nó gắn với các cách thức để chuyển đổi thông tin từ dạng này sang dạng khác nhưng ở đây là từ dạng thông thường có thể nhận thức được thành dạng không thể nhận thức được, làm cho thông tin trở thành dạng không thể đọc được nếu như không có các kiến thức bí mật. Quá trình mã hóa được sử dụng chủ yếu để đảm bảo tính bí mật của các thông tin quan trọng, chẳng hạn trong công tác tình báo, quân sự hay ngoại giao cũng như các bí mật về kinh tế, thương mại. Trong những năm gần đây, lĩnh vực hoạt động của mật mã hóa đã được mở rộng: mật mã hóa hiện đại cung cấp cơ chế cho nhiều hoạt động hơn là chỉ duy nhất việc giữ bí mật và có một loạt các ứng dụng như: chứng thực khóa công khai, chữ ký số, bầu cử điện tử hay tiền điện tử. Ngoài ra, những người không có nhu cầu thiết yếu đặc biệt về tính bí mật cũng sử dụng các công nghệ mật mã hóa, thông thường được thiết kế và tạo lập sẵn trong các cơ sở hạ tầng của công nghệ tính toán và liên lạc viễn thông.
Mật mã học là một lĩnh vực liên ngành, được tạo ra từ một số lĩnh vực khác. Các dạng cổ nhất của mật mã hóa chủ yếu liên quan với các kiểu mẫu trong ngôn ngữ. Gần đây thì tầm quan trọng đã thay đổi và mật mã hóa sử dụng và gắn liền nhiều hơn với toán học, cụ thể là toán học rời rạc, bao gồm các vấn đề liên quan đến lý thuyết số, lý thuyết thông tin, độ phức tạp tính toán, thống kê và tổ hợp. Mật mã hóa cũng được coi là một nhánh của công nghệ, nhưng nó được coi là không bình thường vì nó liên quan đến các sự chống đối ngầm (xem công nghệ mật mã hóa và công nghệ an ninh). Mật mã hóa là công cụ được sử dụng trong an ninh máy tính và mạng.
Lĩnh vực có liên quan với nó là steganography — là lĩnh vực nghiên cứu về việc che giấu sự tồn tại của thông điệp mà không nhất thiết phải che giấu nội dung của thông điệp đó (ví dụ: ảnh điểm, hay mực không màu).
Một số thuật ngữ về mật mã học

Việc nghiên cứu tìm các phương thức để phá vỡ việc sử dụng mật mã được gọi là phân tích mật mã, hay phá mã. Mật mã hóa và phân tích mật mã đôi khi được nhóm lại cùng nhau dưới tên gọi chung mật mã học, nó bao gồm toàn bộ các chủ đề liên quan đến mật mã. Trong thực tế, thuật ngữ mật mã hóa thông thường được sử dụng để nói đến ngành này một cách tổng thể.
Trong một số ngôn ngữ như tiếng Anh nó là cryptography, có nguồn gốc từ tiếng Hy Lạp kryptós tức là "ẩn", và gráphein, "viết ra". Việc sử dụng từ 'cryptography' lần đầu tiên có lẽ diễn ra trong bài diễn thuyết của Sir Thomas Browne năm 1658 có tên gọi The Garden of Cyrus: "the strange Cryptography of Gaffarel in his Starrie Booke of Heaven".
Mật mã hóa là quá trình chuyển đổi các thông tin thông thường (văn bản thường hay văn bản rõ hay văn bản trơn) thành dạng không đọc trực tiếp được, là văn bản mã hóa. Giải mật mã hay giải mã là quá trình ngược lại, phục hồi lại văn bản thường từ văn bản mã. Mật mã là thuật toán để mật mã hóa và giải mật mã. Hoạt động chính xác của mật mã thông thường được kiểm soát bởi các khóa — một đoạn thông tin bí mật nào đó cho phép tùy biến cách thức tạo ra văn bản mã. Các giao thức mật mã chỉ rõ các chi tiết về việc mật mã (và các nền tảng mật mã hóa khác) được sử dụng như thế nào để thu được các nhiệm vụ cụ thể. Một bộ các giao thức, thuật toán, cách thức quản lý khóa và các hành động quy định trước bởi người sử dụng cùng phối hợp chặt chẽ tạo thành hệ thống mật mã.
Trong cách nói thông thường, "mã" bí mật thông thường được sử dụng đồng nghĩa với "mật mã". Trong mật mã học, thuật ngữ này có ý nghĩa kỹ thuật đặc biệt: Các mã là các phương pháp lịch sử tham gia vào việc thay thế các đơn vị văn bản lớn hơn, thông thường là các từ hay câu văn (ví dụ, "qua tao" thay thế cho "tan cong luc rang dong"). Ngược lại, mật mã hóa cổ điển thông thường thay thế hoặc sắp xếp lại các chữ cái riêng biệt (hoặc một nhóm nhỏ các chữ cái) - ví dụ, "tan cong luc rang dong" trở thành "ubo dpoh mvd sboh epoh" bằng cách thay thế.
Sơ đồ khái quát về một hệ thống mật mã.
Như vậy trong một hệ thống mật mã khái quát sẽ có các thành phần sau:
  • Văn bản trơn (plaintext), tức là thông điệp nguyên gốc chưa được mã hóa.
  • Văn bản mã hóa (ciphertext), tức là thông điệp đã được mã hóa.
  • Thuật toán mã hóa (enciphering algorithm) là các giao thức hoặc hướng dẫn có tác dụng chuyển đổi văn bản trơn thành văn bản mã hóa. Đối với các hệ thống mật mã truyền thống, chỉ có người gửi thông điệp biết được thuật toán mã hóa, tuy nhiên đối với các hệ thống dùng mật mã hóa khóa công khai (Public key code - PKC), tất cả mọi người đều có thể biết thuật toán mã hóa mà không ảnh hưởng tiêu cực đến an ninh của hệ thống.
  • Khóa mã hóa (enciphering key) là một hoặc nhiều đối tượng (thường là các con số hay là các hướng dẫn quan trọng nào đó) được dùng trong việc mã hóa văn bản trơn. Ngoại trừ trong hệ thống PKC, để đảm bảo bí mật an toàn thì khóa mã hóa thường chỉ được người gửi biết.
  • Thuật toán giải mã (deciphering algorithm) là các giao thức hoặc hướng dẫn có tác dụng chuyển đổi văn bản mã hóa trở về văn bản trơn. Để đảm bảo bí mật, chỉ có người nhận thông điệp biết được thuật toán giải mã.
  • Khóa giải mã (deciphering key) là một hoặc nhiều đối tượng (thường là các con số hay là các hướng dẫn quan trọng nào đó) được dùng trong việc giải mã văn bản bị mã hóa. Để đảm bảo bí mật, chỉ có người nhận thông điệp biết được khóa giải mã.

Lịch sử của mật mã học

Mật mã học có lịch sử lâu dài và đầy màu sắc. Nói chung, những dạng sớm nhất của cách viết bí mật (ngày nay gọi chung là mật mã hóa cổ điển) chỉ cần có bút và giấy. Hai phạm trù chính của mật mã cổ điển là mật mã hoán vị, trong đó người ta sắp xếp lại trật tự các chữ cái của thông điệp, và mật mã thay thế, trong đó người ta thay thế có hệ thống các chữ cái hay các nhóm chữ cái bằng các chữ cái hay các nhóm chữ cái khác. Văn bản được mật mã hóa bằng mật mã cổ điển có xu hướng lộ ra các thông tin thống kê nhất định về văn bản thường. Bằng cách sử dụng các thông tin này, mật mã cổ điển rất dễ bị dò ra (ví dụ bằng phân tích tần suất). Mật mã cổ điển vẫn còn được phổ biến tới ngày nay, chủ yếu thông qua việc giải các ô đố chữ (xem tài liệu viết bằng mật mã).
Các thiết bị và các kỹ thuật khác nhau đã được sử dụng để mật mã hóa. Một trong những thiết bị sớm nhất có lẽ là gậy mật mã (tiếng Hy Lạp: σκυτάλη). Trong nửa đầu thế kỷ 20, một số thiết bị cơ khí đã được phát minh để thực hiện mật mã hóa, bao gồm rotor machines — nổi tiếng nhất là máy Enigma được người Đức sử dụng trong Đại chiến thế giới 2. Mật mã thực hiện bằng các máy móc này đã tăng độ phức tạp lên đáng kể đối với công việc phân tích mã.
Với sự ra đời của máy tính kỹ thuật số và điện tử học thì các mật mã cực kỳ phức tạp đã có thể được thực hiện. Đặc trưng của mật mã máy tính là chúng thực hiện trên các chuỗi nhị phân, không giống như trong các mô hình mật mã hóa cổ điển và cơ học (chỉ sử dụng bảng chữ cái với khoảng 26 ký tự-phụ thuộc vào từng ngôn ngữ). Mật mã máy tính cũng có khả nănmg chịu đựng việc phân tích mật mã tốt hơn; rất ít các mật mã như thế dễ bị tổn thương chỉ bởi kiểu tấn công biết bản mã.
Các nghiên cứu rộng rãi có tính học thuật về mật mã hóa hiện đại là tương đối gần đây — nó chỉ được bắt đầu trong cộng đồng mở kể từ những năm thập niên 1970 với các chi tiết kỹ thuật của DES (viết tắt trong tiếng Anh của Data Encryption Standard tức Tiêu chuẩn Mật mã hóa Dữ liệu) và sự phát minh ra RSA. Kể từ đó, mật mã hóa đã trở thành công cụ được sử dụng rộng rãi trong liên lạc và bảo mật máy tính.
Cũng giống như các bài học thu được từ trong lịch sử của nó, các nhà mật mã hóa cũng rất thận trọng khi nhắc đến tương lai. Định luật Moore thông thường được nhắc đến khi nói về độ lớn khóa, và các hiệu ứng tiềm năng của máy tính lượng tử cũng đã được nói.
Ứng dụng của mật mã học
Mật mã hóa được sử dụng phổ biến để đảm bảo an toàn cho thông tin liên lạc. Các thuộc tính được yêu cầu là:

  • Bí mật: Chỉ có người nhận đã xác thực có thể lấy ra được nội dung của thông tin chứa đựng trong dạng đã mật mã hóa của nó. Nói khác đi, nó không thể cho phép thu lượm được bất kỳ thông tin đáng kể nào về nội dung của thông điệp.
  • Nguyên vẹn: Người nhận cần có khả năng xác định được thông tin có bị thay đổi trong quá trình truyền thông hay không.
  • Xác thực: Người nhận cần có khả năng xác định người gửi và kiểm tra xem người gửi đó có thực sự gửi thông tin đi hay không.
  • Không từ chối: Người gửi không thể từ chối việc mình đã gửi thông tin đi.
  • Chống lặp lại: Không cho phép bên thứ ba copy lại văn bản và gửi nhiều lần đến người nhận mà người gửi không hề hay biết.

Mật mã học có thể cung cấp cơ chế để giúp đỡ thực hiện điều này. Tuy nhiên, một số mục tiêu không phải bao giờ cũng là cần thiết, trong nghĩa cảnh của thực tế hay mong muốn của người sử dụng. Ví dụ, người gửi thông tin có thể mong muốn giữ mình là nặc danh; trong trường hợp này tính không từ chối rõ ràng là không thích hợp.




More about

JavaScript: Khai báo và sử dụng hàm trong JavaScript

Người đăng: share-nhungdieuhay on Thứ Sáu, 17 tháng 5, 2013


1. ĐỊNH NGHĨA
Hàm là một đọan chương trình có thể được sử dụng nhiều lần trong một chương trình để thực hiện một tác vụ nào đó.
1.1. Xây dựng hàm: Trong JavaScript, dùng từ khoá function để định nghĩa hàm. Một hàm có cấu trúc như sau:
- NameFunction: là tên hàm do người lập trình tự đặt. 
- Qui tắc đặt tên hàm giống như tên biến. Sau NameFunction là cặp dấu ngoặc ( ) chứa danh sách tham số hình thức. Nếu hàm không có tham số thì cặp dấu ngoặc ( ) cũng phải viết sau NameFunction. 
- List_Parameter: là danh sách các tham số hình thức, nếu có nhiều tham số có thì các tham số phài cách nhau bởi dấu phẩy, các tham số này không chỉ ra kiểu dữ liệu cụ thể và cũng không cần từ khoá var.
Ví dụ:
function  Display(user , pwd)
{
    document.write(“UserName cua ban la:” + user) ;
    document.write(“Password cua ban la:” + pwd) ;
    return;
}
- Câu lệnh return: là câu lệnh kết thúc hàm. Câu lệnh này là tùy chọn. Có thể bỏ qua, nếu hàm có giá trị trả về thì cần có câu lệnh Return để trả về giá trị. Sau return có thể chứa hoặc không chứa một giá trị cụ thể hoặc một biểu thức tính toán.
Ví dụ: 
Function total(a,b)
{     c=a+b;
      Return c;
}
1.2. Cách gọi hàm  
- Hàm sẽ không thực hiện cho đến khi nó được gọi.
- Đối với hàm có đối số ta gọi tên hàm và danh sách các giá trị truyền cho đối số đó 
FunctionName(argument1,argument2, ...)
- Đối với hàm không có đối số ta chỉ cần gọi tên hàm là được. 
FunctionName()
- Đối với hàm không có giá trị trả về:
NameFunction(parameter) . 
- Đối với hàm có giá trị trả về :
variable = NameFunction(parameter) .
Ví dụ:
<html>
<head><title>Function</title></head>
<body>
<script>
function Area(Width, Length)
{
size=Width*Length;
return size;
}
x=eval(prompt("Nhap x: ")) ;
y= eval(prompt("Nhap y: "));
document.write(Area(x,y))
</script>
</body>
</html>
2. CÁC HÀM THÔNG DỤNG TRONG JAVASCRIPT
2.1. Hàm alert(): dùng hiển thị một hộp thông báo có nút OK
Cú pháp:
alert(“nội dung thông báo”)
ví dụ:
<html>
<head><title>Function</title></head>
<body>
<script>
alert("Hello World")
</script>
</body>
</html>
2.2. Hàm prompt():tạo hộp thoại chứa 2 nút OK và Cancel, và một textbox để người sử dụng nhập nội dung, giá trị trả về của hàm prompt là nội dung nhập trong textbox
Cú pháp:
variable = prompt(“nội dung đối thoại”,giá trị khởi tạo);
Ví dụ:
<html>
<head><title>Function</title></head>
<body>
<script>
a=prompt("Your Lastname:");
b=prompt("Your FirstName");
document.write("Your FullName is :"+ a + ' ' + b)
</script>
</body>
</html>

2.3. Hàm confirm(): Hiển thị hộp thông báo có 2 nút OK và Cancel. Hàm trả về giá trị true nếu người sử dụng click OK và ngược lại thì trả về giá trị false.
Cú pháp:
variable=confirm(“Chuoi thong bao”);
Ví dụ:
<html>
<head><title>Function</title></head>
<body>
<script>
a=prompt("nhap so a :");
b=prompt("nhap so b:");
c=confirm( a +' lon hon '+ b+'?')
if(c = =true)
document.write( a +" > "+b  )
else
document.write( a +" < "+b  )
</script>
</body>
</html>
2.4. Các hàm thông dụng của chuổi và số:
a. Hàm eval(): Trả về giá trị số của một chuổi số
Cú pháp:
eval(chuổi số)
Ví dụ:
<script>
var str1=”123”, str2=”456”;
 str= str1+str2;
document.write(str); kết quả :123456
</script>
<script>
var str1=”123”, str2=”456”;
str=eval(str1)+eval(str2) ;
document.write(str)kết quả: 579
</script>
b. Hàm ParseInt(strNum) 
Trả về một số nguyên từ chuổi  strNum. Nếu strNum theo sau là ký tự chữ thì các ký tự này sẽ bị bỏ qua. Nếu strNum không bắt đầu bằng số thì hàm này trả về giá trị NaN (Not a Number)
Ví dụ :
var  strNum=”123.8” , kq;
kq=parseInt(strNum) =>kq=123
strNum=”a123”
kq=parseInt(strNum) =>kq=NaN
strNum=”123.8abc” 
kq=parseInt(strNum)=>kq=123
c. Hàm parseFloat(strNum):
Hàm trả về một số thực từ chuổi strNum. Nếu chuổi strNum bắt đầu là số và theo sau là các ký tự chữ thì các ký tự này bị bỏ qua. Nếu chuổi strNum bắt đầu từ ký tự chữ thì hàm trả về giá trị NaN.
Ví dụ:
var  strNum=”123.8” , kq;
kq=parseFloat(strNum) =>kq=123.8
strNum=”a123.8”
kq=parseFloat(strNum) =>kq=NaN
strNum=”123.8abc” 
kq=parseFloat(strNum)=>kq=123.8
d. Hàm isNaN(str): 
Hàm trả về giá trị True nếu str là chuỗi, ngược lại là False nếu str là chuổi số.
Ví dụ :
Var str=”123abc”, kq;
kq=isNaN(str) =>kq=true;
str=”123.8”
kq=isNaN(str) =>kq=false ;
2.5. Các hàm thiết lập thời gian:  
a. Hàm Timeout( ): Báo cho JavaScript thực hiện một lệnh JavaScript sau một khoảng thời gian nào đó. Hàm trả về một ID(duy nhất đối với mỗi hàm setTimeout thực hiện một lệnh) Giá trị ID này dùng để xoá khoảng thời gian đã thiết lập nếu không cần thực hiện hàm Timeout nữa 
Cú pháp:
IdTime=setTimeout(“Command JavaScript”, delayTime);
­ Command JavaScript  : có thể là lời gọi hàm hoặc là một câu lệnh đơn 
­ delayTime :là khoảng thời gian chờ để thi hành Command JavaScript, được tính bằng mili giây. 
Ví dụ: 
Idq=setTimeout(“alert(‘Da het gio’)”,1000) ; 
Cứ 1000 mili giây thì thông báo đã hết giờ một lần.
b. Hàm clearTimeout():Huỷ thời gian đã thiết lập bởi setTimeout(). 
Cú pháp:
clearTimeout(IdTime );
Ví dụ:
clearTimeout(Idq);
c. Hàm setInterval() và clearInterval() với ý nghĩa và tham số giống như setTimeout() và clearTimeout() .

More about

HTML: Tổng quan về JavaScript

Người đăng: share-nhungdieuhay on Thứ Tư, 15 tháng 5, 2013


1. GIỚI THIỆU VỀ JAVASCRIPT: 
Javascript ra đời với tên gọi LiveScript, sau đó Nescape đổi tên thành Javascript. Tuy nhiên giữa Java và Javascript có rất ít các điểm chung dù cú pháp của chúng có thể có những điểm giống nhau.
Javascript là một ngôn ngữ kịch bản (script) để viết kịch bản cho phía client. Client side là những yêu cầu của người sử dụng được xử lý tại máy khách. Thông thường những yêu cầu này là tính toán, kiểm tra tính hợp lệ của dữ liệu hay các hiệu ứng, các yêu cầu này thường không liên quan đến nguồn cơ sở dữ liệu trên server.
1.1. Đặc điểm của JAVASCRIPT:

  • Javascript là một ngôn ngữ kịch bản được viết chung với HTML. 
  • Không biên dịch như các ngôn ngữ khác. Khi trang web load xuống nó được trình duyệt thông dịch.
  • Javascript là ngôn ngữ thiết kế động vì các đối tựơng có khả năng tương tác với nhau thông qua người sử dụng hoặc các sự kiện. 
  • Là ngôn ngữ hướng đối tượng. Phân biệt chữ hoa, chữ thường 
  • Được hỗ trợ bởi tất cả các trình duyệt như Nescape và Internet Explorer
  • JavaScript có khả năng tạo và sử dụng các đối tượng (Object), các đối tượng gồm 2 nhóm:

- Các Object do người sử dụng tạo ra gồm :

  • Định nghĩa thuộc tính cho đối tượng
  • Cú pháp: Object Name.Properties
  • Thêm phương thức cho đối tượng
  • Tạo một instance của đối tượng

- Các object có sẵn: JavaScript cung cấp một bộ các Built–in Object để cung cấp các thông tin về sự hiện hành của các đối tượng được load trong trang Web và nội dung của nó, các đối tượng này gồm phương pháp (method) làm việc với các thuộc tính (properties) của nó.
1.2. Cấu trúc của đoạn Javascript:
<Script language=”JavaScript”>
       Các lệnh Javascript
</Script>
1.3. JAVASCRIPT trong một trang HTML

  • Đặt các dòng mã lệnh của Javascript giữa cặp thẻ <script></script>
  • Có thể viết nhiều đoạn mã lệnh Javascript trong cùng một tập tin HTML. Các khối mã lệnh Javascript có thể đặt bất kỳ nơi nào của trang HTML. Có thể đặt trong cặp thẻ <head></head> hoặc trong cặp thẻ <body> </body> tuy nhiên ta nên đặt trong cặp thẻ <head> để dễ kiểm soát mã lệnh và cũng dễ sửa đổi chương trình. 
  • Có thể viết một tập tin Javascript riêng và sau đó kết nối với một hoặc nhiều tập tin trang web khác nhau.

Cách 1: Viết đoạn mã Script trong cùng trang HTML
Ví dụ 1: 
<HTML>
<HEAD>
<script language="javascript" >
document.write(“What is your name? ”);
</script>
</HEAD>
<BODY>
Nội dung của trang
</BODY>
</HTML>
Ví dụ 2: 
<HTML>
<BODY>
<script language="javascript">
document.write("Hello World!")
</script>
</BODY>
</HTML> 
Ví dụ 3: 
<html>
<head>
<script type="text/javascript">
      some statements
</script>
</head>
<body>
<script type="text/javascript">
      some statements
</script>
</body>
</html>
Cách 2: Mở trình soạn thảo Notepad, viết đoạn chương trình Javascript. Lưu lại với phần mở rộng là .js (lưu ý trong  tập tin này không chứa bất kỳ một thẻ nào của ngôn ngữ HTML).
- Liên kết với một file JavaScript.js đã được xây dựng trước 
Cú pháp:
<HTML>
<BODY>
<Script SRC=”fileJavascript.js” Language="javascript" >
JavaScript comments
</Script>
</BODY>
</HTML>

Lưu ý: trong thẻ JavaScript ta có thể bỏ thuộc tính SRC và Language, khi đó ngôn ngữ mặc định là JavaScript.
1.4. Môi trường viết JAVASCRIPT:
Có thể dùng chương trình soạn thảo: Frontpage, Notepad, Visual InterDev, Dreamweaver để viết mã Javascript, trong giáo trình này sẽ sử dụng môi trường Dreaweaver, chọn chế độ code, Dreamweaver hổ trợ phân biệt từ khóa bằng màu chữ, hổ trợ các hàm, thuộc tính của các tag, giúp người sử dụng thuận tiên trong việc thiết kế và viết chương trình
1.5. Lệnh đơn và khối lệnh:
a) Lệnh đơn: 
Lệnh đơn là một câu lệnh được kết thúc bằng dấu chấm phẩy(;). Trong JavaScript cuối mỗi câu lệnh ta có thể dùng dấu (;) hoặc không dùng dấu gì cả.
b) Khối lệnh: 
Khối lệnh là tập hợp nhiều câu lệnh đơn được bao bọc bởi cặp dấu {}
c) Lời chú thích trong chương trình: 
Lời chú thích này trình duyệt sẽ bỏ qua khi thông dịch chương trình. JavaScript hổ trợ 2 loại chú thích:

  • Chú thích trên một dòng: dùng cặp dấu //
  • Chú thích trên nhiều dòng: dùng cặp dấu   /*…*/

1.6. Xuất dữ liệu ra trang Web
JavaScript hỗ trợ 2 phương thức hiển thị dữ liệu ra trang Web là: 

  • document.write(“Text”) 
  • document.writeln(“Text”)

Text là chuỗi dữ liệu muốn hiển thị ra trang Web, phải được đặt trong cặp nháy kép. 
Nếu xuất giá trị của biến thị không cần đặt trong nháy. Có thể dùng dấu + để nối các chuỗi và biến
document.write(“String ” + variable );
Nếu xuất thẻ HTML thì cặp thẻ đó cũng phải đặt trong cặp dấu nháy kép
­ document.writeln: nếu đặt trong cặp tag<pre></pre> thì lệnh document.writeln xuất dữ liệu và xuống dòng. Nếu không có cặp thẻ <pre></pre> thì nó cách ra một khoảng trắng
Ví dụ:
<BODY  >
<Script Language=”JavaScript”>
document.write ("<H1>Hello<H1>");
document.write ("<font color=red>World</font>");
</Script>
</BODY>
Ví dụ:
<body>
<pre>
<script>
document.writeln("<b>Hello</b>");
document.writeln("<b>Wordl</b>");
</script>
</pre>
</body>
2. BIẾN VÀ DỮ LIỆU TRONG JAVASCRIPT
2.1. Biến
- Khái niệm: Biến là tên của một phần tử trong chương trình, được sử dụng để lưu trữ thông tin do người dùng nhập vào hoặc kết quả trung gian của quá trình tính toán. Khi khai báo biến trong Javascript không cần xác định kiểu dữ liệu cho biến cho nên khi một biến được khai báo xong nó có thể chứa bất kỳ kiểu dữ liệu nào.
- Cách khai báo biến: Trong JavaScript, để khai báo biến dùng từ khoá var, cũng có thể bỏ qua từ khóa var.
var NameVariable ;
Một biến có thể được khai báo và khởi tạo hoặc không khởi tạo giá trị ban đầu
Muốn khai báo nhiều biến cùng một lúc thì liệt kê tên biến kế tiếp nhau cách nhau bởi dấu (,)
Ví dụ: Var x = 7 ;
           var y,z = "19" ; 
Trong JavaScript, 1 biến có thể chứa bất kỳ kiểu dữ liệu gì 
Ví dụ:
           var a=”Hello World”;
           a=1999 ;
- Cách xuất giá trị của biến: 
document.write(NameVariable )
- Quy tắc đặt tên biến: 
Tên biến gồm các chữ cái và số, không dùng các ký tự đặc biệt như: ( , [ , { , # , & …. theo nguyên tắc sau:

  • Tên biến phải bắt đầu bằng ký tự hoặc ký tự gạch dưới( _ )
  • Không bắt đầu bằng ký tự số.
  • Không chứa khoảng trắng, tên biến phải gợi nhớ
  • Không trùng với từ khoá của JavaScript 
  • Các từ khoá trong JavaScript 

- Tầm vực của biến: là tầm ảnh hưởng của biến trong chương trình. Có 2 loại biến:
­ Biến toàn cục: được khai báo ngoài các hàm. Phạm vi hoạt động của biến là từ vị trí khai báo trở về sau trong chương trình.
­ Biến cục bộ: được khai báo trong chương trình con. Phạm vi hoạt động của biến là từ vị trí khai báo đến kết thúc chương trình con.
Lưu ý: Nếu tên biến toàn cục và cục bộ trùng nhau thì biên được sử dụng trong hàm là biến cục bộ.
2.2. Dữ liệu: Có 4 loại dữ liệu
­ Kiểu số: một biến kiểu số chứa bất kỳ giá trị số nào: số thập phân, số nguyên, số dạng chấm phẩy động.
­ Kiểu chuỗi: một biến kiểu chuổi có thể chứa một nhóm ký tự (Chữ cái, ký tự số, khoảng trắng, các ký tự đặc biệt, …). Giá trị chuổi phải đặt trong cặp dấu nháy đôi (“ “) hoặc đơn (‘ ‘) 
Ví dụ: 
var  s1, s2, s3 ;
s1=”Hello  World” ;
s2=’Hello World ‘ ;
­ Kiểu Boolean: Là dữ liệu chỉ có 2 giá trị False hoặc True thường dùng trong trường hợp biến hoặc hàm chỉ nhận một trong 2 trạng thái đúng hoặc sai.
Ví dụ: var bl;
bl=true ;
­ Kiểu Null: là biến không gán cho giá trị  
2.3. Toán tử:
- Toán tử số học 
Tóan Tử
Chức Năng
Ví dụ
Kết quả
+
cộng
x=2
x+2
4
-
Trừ
x=2
5-x
3
*
Nhân
x=4
x*5
20
/
Chia
15/5
5/2
3
2.5
%
Lấy phần dư
5%2
10%8
10%2
1
2
0
++
Tăng giá trị lên 1
x=5
x++
x=6
--
Giảm giá trị  xuống 1
x=5
x--
x=4


- Toán tử gán 
Tóan Tử
Ví dụ
Tương đương
=
x = y
x= y
+=
x += y
x = x+y
-=
x -= y
x = x-y
*=
x *= y
x = x*y
/=
x /= y
x= x/y
%=
x%=y
x = x%y


- Toán tử so sánh

Tóan Tử
Chức Năng
Ví dụ
= =
bằng
5==8 returns false
!=
Không bằng
5!=8 returns true
> 
lớn hơn
5>8 returns false
< 
nhỏ hơn
5<8 returns true
>=
lớn hợn hoặc bằng
5>=8 returns false
<=
nhỏ hơn hoặc bằng
5<=8 returns true

- Toán Tử logic
Tóan Tử
Chức Năng
Ví dụ
&&
x =6; y =3 ;
(x < 10 && y > 1) returns true
||
hoặc
x = 6 ; y =3
(x==5 || y==5) returns false
!
not
x=6; y =3;
!(x==y) returns true

- Toán tử chuỗi 
Ký hiệu + : Là phép toán nối hai chuỗi với nhau 

Ví dụ:
<html>
<script>
txt1=”What a very”;
txt2="nice day!";
document.write('<h2>'+txt1+txt2+'</h2>'); 
</script>
</html>

- Một số ký tự đặc biệt: \n ( new line), \t (tab), \b (BackSpace), \& (dấu &), \”(“)
Ví dụ:
<html>
<script>
document.write ("You \& i sing \"Happy Birthday\".") 
</script>
</html>

- Toán tử điều kiện: 
Cú pháp:
(Điều kiện) ? value1: value2

  • Nếu biểu thức điều kiện đúng thì trả về giá trị value 1 
  • Nếu biểu thức điều kiện sai thì trả về giá trị value 2 

Ví dụ:
<html>
<script>
a=5; b=6;
document.write((a>b)? 'a lon hon b':'b lon hon a');
</script>
</html>


More about