Chương 3 : Xây dựng ứng dụng ký số cho tài liệu lưu trữ quốc gia
3.3. Xây dựng ứng dụng và ký số tài liệu
3.3.1. Quá trình ký số file tài liệu
Trước tiên ứng dụng sẽ chuyển file định dạng JPEG sang file PDF sau đó sẽ sử dụng thuật toán hàm băm SHA-256 để băm dữ liệu ra thành 256 bit (gọi là bản tóm lược). Sau đó sử dụng thuật toán RSA và khóa bí mật của người gửi để ký số lên file dữ liệu thành file chữ ký sau đó lưu thông tin vào file PDF.
Hình 3.1: Mô hình ký số tài liệu lưu trữ 3.3.2. Quá trình mã hóa
Người dùng không muốn để lộ thông tin trong file tài liệu nên mã hóa file tài liệu. Từ file JPEG chuyển đổi sang file PDF sau đó, sử dụng thuật toán mã hóa RSA và lấy khóa công khai để mã hóa tạo ra file dữ liệu mã hóa.
File định dạng JPEG Hàm Băm SHA-256 Bản tóm lược Ký số RSA Khóa bí mật(lấy từ USB Token) Lưu chữ ký vào file PDF Chuyển đổi sang
Bảng 3.1: Mô hình mã hóa file
Sau khi mã hóa người dùng đã có 1 file PDF đã được mã hóa 3.3.3. Quá trình giải mã:
Sau khi người nhận thực hiện việc nhận các tệp dữ liệu. Lúc này, sẽ có quá trình kiểm tra: kiểm tra file có đúng người nhận hay không? kiểm tra tính toàn vẹn của dữ liệu? Để thực hiện được các quá trình kiểm tra này phải thực hiện các công việc sau:
Bên nhận phải giải mã file dữ liệu mã hóa.
Hình 3.3: Mô hình giải mã
- Sử dụng thuật toán RSA để giải mã file dữ liệu bằng khóa bí mật; - Nếu giải mã không thành công có nghĩa file đó đã bị thay đổi dữ liệu. - Nếu giải mã thành công khi đó người dùng có nghĩa là file đó vẹn toàn
dữ liệu.
File PDF
Mã hóa RSA
File PDF đã được mã hóa Lấy khóa công khai
để mã hóa File JPEG File PDF đã được mã hóa Giải mã RSA Khóa bí mật Để giải mã File DPF không mã hóa
3.3.4. Quá trình xác thực
Xác thực chữ ký, khi xác thực chữ ký sẽ sử dụng lấy khóa công khai, từ đó xác định chữ ký đúng hay sai, dữ liệu cũng được băm trước bằng cùng một thuật toán với lúc ký.
Bảng 3.2: Mô hình xác thực
- Từ file PDF người dùng khóa công khai của người gửi, sử dụng thuật toán băm SHA 1 và thuật toán RSA để xác thực.
- Kiểm tra Bản tóm lược 1 và Bản tóm lược 2 có giống nhau hay không? Nếu giống nhau thì file nhận được là vẹn toàn (không bị thay đổi hay tác động), nếu không giống nhau là file đã bị thay đổi.
3.3.5. Yêu cầu của ứng dụng xây dựng
- Chức năng chuyển đổi toàn bộ file tài liệu đinh dạng JPEG sang file tài liệu định dạng PDF trong thư mục đã được chọn;
- Chức năng tự động ký số toàn bộ tài liệu trong thư mục đã được chọn;
- Có thể đưa hình ảnh chữ ký số vào trang PDF;
- Chức năng mã hóa dữ liệu;
- Chức năng xác thực tài liệu.
Phần mềm này có sử dụng 2 thư viện mã nguồn mở ItextSharp và
PdfSharp
Không Bản tóm lược 1
Bản tóm lược 1
File dữ liệu toàn vẹn File dữ liệu bị thay đổi Có giống File PDF đã ký Giải mã RSA Khóa công khai
để Giải mã
Lấy chữ ký số trong File
Trich rút dữ liệu
3.3.5.1. Module tự động chuyển file tài liệu từ nhiều file JPG sang file PDF
- Module này có chức năng tìm kiếm tất cả các file JPEG trong thư mục đã chọn sau đó sẽ tự động tạo một file PDF và đưa file JPEG trong cùng thư mục vào file PDF, Thư mục mới có tên của thư mục cũ và thêm từ “_PDF” và lưu vào đó. Các bước thực hiện
- Bước 1: Chọn thư mục file JPEG cần chuyển đổi
- Bước 2: Chon thư mục lưu file PDF;
- Bước 3: Bấm nút Chuyển sang PDF khi đó ứng dụng sẽ đọc tất cả các file JPEG trong cùng thư mục và chuyển thành 1 file pdf và lưu vào thu mục mới có tên giông thư mục cũ và thêm từ “_PDF” vào đằng sau.
3.3.5.2. Module Module mã hóa và ký số vào file PDF;
- Module này có chức năng tìm kiếm tất cả các file PDF trong thư mục đã chọn sau đó sẽ tự động tạo một file PDF và đưa file JPEG trong cùng thư mục vào file PDF. thư mục mới có tên của thư mục cũ và thêm từ “_Signed” và lưu vào đó;
- Bước 1: Chọn thư mục file PDF cần ký;
- Bước 2: Chọn thư mục file PDF đã ký;
- Bước 3: Chọn chứng thư số cần ký;
ỨNG DỤNG KÝ SỐ TÀI LIỆU LƢU TRỮ QUÔC GIA
Chuyển đổi fie JPEG sang PDF
Ký số PDF
(Tùy chọn hiển thị ảnh ký số)
Mã hóa dữ liệu
- Bước 4: Nếu muốn mã hóa dữ liệu tích và nút mã hóa( nếu không mã hóa bỏ qua bước này);
- Bước 5: Bấm nút ký số để ký số cho toàn bộ tài liệu đã được chọn; 3.3.5.3. Module xác thực file PDF
Module này có chức năng kiểm tra tính vẹn toàn của tà PDF.
- Bước 1: chọn thư file PDF cần xác thực;
- Bước 2: Ấn nút xác thực tài liệu;
Ứng dụng có thông báo kết quả cùa file dữ liệu đó có ven toàn hay đã thay đổi.
3.3.6. Một số hình ảnh của ứng dụng ký số
Bảng 3.4: Chức năng chuyển đổi file JPEG sang PDF và ký số tài liệu
Bảng 3.5: Giao diện chọn chứng thư số và tùy chọn hình ảnh đại diện
ChuChuyển đổi JPEG sang PDF
ChuKý số PDF
Bảng 3.6: Lựa chọn hình ảnh đại diện
M
4. Kết luận
Với mục tiêu là nghiên cứu chữ ký số và ứng dụng chữ ký số trong quản lý tài liệu quốc gia, xét về mặt kết quả tổng quan, Luận văn đã đạt được các yêu cầu sau
Nội dung đạt đƣợc
- Nghiên cứu tổng quan về bảo mật an toàn thông tin, an toàn thông tin trong tài liệu lưu trữ.
- Khảo sát thực trạng tài liệu đang được lưu trữ tại câc trung tâm Lưu trữ quốc gia, đưa ra được số liệu cụ thể tài liệu số đang được lưu trữ tại các Trung tâm Lưu trữ quốc gia.
- Nghiên cứu tổng quan về chữ ký số, hàm Băm, hạ tầng khóa công khai - Xây dựng ứng dụng ký số cho tài liệu lưu trữ quôc gia.
Hạn chế
- Ứng dụng mới chỉ ký số cho tài liệu định dạng JPEG, chưa ký số cho các định dạng khác
Hƣớng phát triển
Trong thời gian tới ứng dụng sẽ bổ sung thêm tính năng ký các file ghi âm, và các định dạng video khác. Ngoài ra ứng dụng cũng cần hoàn tiện thêm khi triển khai thực tế tại các Trung tâm Lưu trữ quốc gia giúp đảm bảo tính toàn vẹn và xác thực của tài liệu cũng như tính bảo mật của tài liệu./.
5. Tài liệu tham khảo Tiếng Việt Tiếng Việt
1. Trịnh Nhật Tiến, Giáo trình An toàn dữ liệu;
2. TS. Hồ Văn Hương, Ths Đào Thị Ngọc Thuỳ, Ứng dụng hệ thống kiểm soát truy nhập mạng theo mô hình truy nhập một lần, Tạp chí An toàn thông tin, số 1 (025) 2013.
3. TS. Hồ Văn Hương, KS. Hoàng Chiến Thắng, Ký số và xác thực trên nền tảng web, Tạp chí An toàn thông tin, số 2 (026) năm 2013;
4. TS. Hồ Văn Hương, KS. Hoàng Chiến Thắng, KS. Nguyễn Quốc Uy Giải pháp bảo mật và xác thực thư điện tử, Tạp chí An toàn thông tin số 04 (028), 2013;
5. Vnisa, Báo cáo hiện trạng ATTT tại Việt Nam 2010.
6. Báo cáo tổng hợp tình hình lưu trữ và sử dụng cơ sở dữ liệu tài liệu lưu trữ tại các Trung tâm Lưu trữ quốc gia năm 2014 của Cục văn thư và Lưu trữ nhà nước.
Tiếng Anh
7. William Stallings, Cryptography and Network Security Principles and Practices, Fourth Edition, November 16, 2005;
8. Whitfield Diffie and Martin E. Hellman, New Directions in Cryptography, 1976;
9. Bart Van Rompay. Analysis and Desigbn of Cryptographic Hash Functions, MAC Algorithms and Block Ciphers, Juni 2004;
10.Burt Kaliski,RSA Laboratories, The Mathematics of the RSA Public- Key Cryptosystem; Website 11.www.antoanthongtin.vn 12.www.en.wikipedia.org 13.www.vi.wikipedia.org 14.www.pki.openca.org 15.www.ckca.vn
6. Phụ lục: Mã nguồn chƣơng trình
private void btnConvert_Click(object sender, EventArgs e) {
if (txtSrcFdr.Text == "") {
MessageBox.Show("Bạn chưa chọn thư mục nguồn"); return;
}
if (!Directory.Exists(txtSrcFdr.Text)) {
MessageBox.Show("Thư mục nguồn bạn chọn không tồm tại"); return;
}
if (txtDestFdr.Text == "") {
MessageBox.Show("Bạn chưa chọn thư mục đích"); return; } if (!Directory.Exists(txtDestFdr.Text)) { try { Directory.CreateDirectory(txtDestFdr.Text); } catch {
MessageBox.Show("Không tạo được thư mục file ký số"); return;
} }
success = false; bw.RunWorkerAsync();
toolStripProgressBar1.Style = ProgressBarStyle.Marquee; }
private void bw_RunWorkerCompleted(object sender,
RunWorkerCompletedEventArgs e)
{
toolStripProgressBar1.Style = ProgressBarStyle.Blocks; toolStripProgressBar1.Value = 0;
if (success)
MessageBox.Show("Bạn đã chuyển đổi thành công: " + TongFileTao +
"/" + TongFileTao + TongFileLoi, "Hoan thanh", MessageBoxButtons.OK,
MessageBoxIcon.Information);
PdfSharp.Pdf.PdfDocument AddPage(PdfSharp.Pdf.PdfDocument doc, XSize
size, string strFileName, int intPage) {
double Height = 0, Width = 0;
XGraphics xgr = XGraphics.FromPdfPage(doc.Pages[intPage]); XImage img = XImage.FromFile(strFileName);
if (XUnit.FromPoint(size.Height) < XUnit.FromPoint(img.Height)) {
Height = Math.Round((XUnit.FromPoint(size.Height) -
XUnit.FromPoint(img.Height)) / 2);
}
if (XUnit.FromPoint(img.Width) < XUnit.FromPoint(size.Width)) {
Width = Math.Round((XUnit.FromPoint(size.Width) -
XUnit.FromPoint(img.Width)) / 2);
}
xgr.DrawImage(img, 20, 20); return doc;
}
void CreateAllFilePDF(string strSounrcetFolder, ref int TongFileTao, ref int TongFileLoi)
{
CreateFilePDF(strSounrcetFolder, ref TongFileTao, ref TongFileLoi); string[] subdirectoryEntries =
Directory.GetDirectories(strSounrcetFolder);
foreach (string subdirectory in subdirectoryEntries) {
CreateAllFilePDF(subdirectory, ref TongFileTao, ref TongFileLoi);
} }
void CreateFilePDF(string strSounrcetFolder, ref int TongFileTao, ref int TongFileLoi)
{ try {
XSize size = new XSize(XUnit.FromMillimeter(297),
XUnit.FromMillimeter(210));
PdfSharp.Pdf.PdfDocument doc = new PdfSharp.Pdf.PdfDocument(); string strTargetFile = txtDestFdr.Text +
strSounrcetFolder.Substring(txtSrcFdr.Text.Length, strSounrcetFolder.Length - txtSrcFdr.Text.Length);
strTargetFile += "\\" + new
DirectoryInfo(strSounrcetFolder).Name + ".pdf";
string strTarrgetFolder = Path.GetDirectoryName(strTargetFile); if (CreateDir(strTarrgetFolder) != 1)
string[] filePaths = Directory.GetFiles(strSounrcetFolder,
"*.jpg", SearchOption.TopDirectoryOnly); if (filePaths.Length >= 0) {
for (int intThutu = 0; intThutu < filePaths.Length; intThutu++)
{
doc.Pages.Add(new PdfSharp.Pdf.PdfPage());
AddPage(doc, size, filePaths[intThutu], intThutu); } } doc.Save(strTargetFile); doc.Close(); success = true; TongFileTao += 1; }
catch (Exception ex) {
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK,
MessageBoxIcon.Information);
TongFileLoi += 1; }
}
private void bw_DoWork(object sender, DoWorkEventArgs e) {
try {
TongFileTao = 0; TongFileLoi = 0;
CreateAllFilePDF(txtSrcFdr.Text, ref TongFileTao, ref TongFileLoi);
}
catch (Exception ex) {
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK,
MessageBoxIcon.Error); } } Class Ký số using System; using System.Collections.Generic; using System.Text; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.X509; using System.Collections; using Org.BouncyCastle.Pkcs;
using iTextSharp.text.pdf; using System.IO; using iTextSharp.text.xml.xmp; using Org.BouncyCastle.Security; namespace TTTH.DAITD.KYSO { class PDFSigner {
private string inputPDF = ""; private string outputPDF = ""; private Cert myCert;
private MetaData metadata;
public PDFSigner(string input, string output) {
this.inputPDF = input; this.outputPDF = output; }
public PDFSigner(string input, string output, Cert cert) {
this.inputPDF = input; this.outputPDF = output; this.myCert = cert; }
public PDFSigner(string input, string output, MetaData md) {
this.inputPDF = input; this.outputPDF = output; this.metadata = md; }
public PDFSigner(string input, string output, Cert cert, MetaData md) { this.inputPDF = input; this.outputPDF = output; this.myCert = cert; this.metadata = md; }
public void Sign(PDFSignatureAP sigAP, bool encrypt, PDFEncryption Enc) {
PdfReader reader = new PdfReader(this.inputPDF);
FileStream fs = new FileStream(this.outputPDF, FileMode.Create,
FileAccess.Write);
PdfStamper st;
if (this.myCert == null) {
st = new PdfStamper(reader, fs); }
else {
st = PdfStamper.CreateSignature(reader, fs, '\0', null, sigAP.Multi);
}
if (encrypt && Enc != null) Enc.Encrypt(st);
//st.SetEncryption(PdfWriter.STRENGTH128BITS, "user", "owner", PdfWriter.ALLOW_COPY);
st.MoreInfo = this.metadata.getMetaData();
st.XmpMetadata = this.metadata.getStreamedMetaData();
if (this.myCert == null) //No signature just write meta-data and quit
{
st.Close(); return; }
PdfSignatureAppearance sap = st.SignatureAppearance; sap.SetCrypto(this.myCert.Akp, this.myCert.Chain, null,
PdfSignatureAppearance.WINCER_SIGNED); sap.Reason = sigAP.SigReason; sap.Contact = sigAP.SigContact; sap.Location = sigAP.SigLocation; if (sigAP.Visible) {
iTextSharp.text.Rectangle rect = st.Reader.GetPageSize(sigAP.Page);
sap.Image = sigAP.RawData == null ? null : iTextSharp.text.Image.GetInstance(sigAP.RawData);
sap.Layer2Text = sigAP.CustomText;
sap.SetVisibleSignature(new iTextSharp.text.Rectangle(sigAP.SigX,
sigAP.SigY, sigAP.SigX + sigAP.SigW, sigAP.SigY + sigAP.SigH), sigAP.Page, null); }
PdfSignature dic = new PdfSignature(PdfName.ADOBE_PPKLITE, new
PdfName("adbe.pkcs7.detached"));
dic.Reason = sap.Reason; dic.Location = sap.Location; dic.Contact = sap.Contact;
dic.Date = new PdfDate(sap.SignDate); sap.CryptoDictionary = dic;
int contentEstimated = 15000;
// Preallocate excluded byte-range for the signature content (hex
encoded)
Dictionary<PdfName, int> exc = new Dictionary<PdfName, int>(); exc[PdfName.CONTENTS] = contentEstimated * 2 + 2;
sap.PreClose(exc);
"SHA-256", false);
IDigest messageDigest = DigestUtilities.GetDigest("SHA-256"); Stream data = sap.RangeStream;
byte[] buf = new byte[8192]; int n;
while ((n = data.Read(buf, 0, buf.Length)) > 0) {
messageDigest.BlockUpdate(buf, 0, n); }
byte[] hash = new byte[messageDigest.GetDigestSize()]; messageDigest.DoFinal(hash, 0);
DateTime cal = DateTime.Now; byte[] ocsp = null;
if (this.myCert.Chain.Length >= 2) {
String url = PdfPKCS7.GetOCSPURL(this.myCert.Chain[0]); if (url != null && url.Length > 0)
ocsp = new OcspClientBouncyCastle(this.myCert.Chain[0], this.myCert.Chain[1], url).GetEncoded();
}
byte[] sh = sgn.GetAuthenticatedAttributeBytes(hash, cal, ocsp); sgn.Update(sh, 0, sh.Length);
byte[] paddedSig = new byte[contentEstimated];
if (this.myCert.Tsc != null) {
byte[] encodedSigTsa = sgn.GetEncodedPKCS7(hash, cal, this.myCert.Tsc, ocsp);
System.Array.Copy(encodedSigTsa, 0, paddedSig, 0, encodedSigTsa.Length);
if (contentEstimated + 2 < encodedSigTsa.Length) throw new Exception("Không đủ không gian để ký"); }
else {
byte[] encodedSig = sgn.GetEncodedPKCS7(hash, cal); System.Array.Copy(encodedSig, 0, paddedSig, 0, encodedSig.Length);
if (contentEstimated + 2 < encodedSig.Length)
throw new Exception("Không đủ không gian để ký"); }
PdfDictionary dic2 = new PdfDictionary(); dic2.Put(PdfName.CONTENTS, new
PdfString(paddedSig).SetHexWriting(true));
sap.Close(dic2); }
} }