Tiêu chuẩn PKCS #7 v1.5: Cú pháp Thông điệp Mật mã Phiên bản 1.5 

PCKS #7 Phiên bản 1.5 (Bản xin ý kiến RFC 2315) mô tả cú pháp chung cho dữ liệu có thể có áp dụng mật mã, ví dụ như chữ ký số (digital signatures) và phong bì số (digital envelopes), Cú pháp thừa nhận đệ quy, ví dụ, một phong bì có thể được lồng bên trong một phong bì khác, hoặc một bên có thể ký một số dữ liệu điện tử được chứa từ trước...

Tổng quan

PCKS #7 Phiên bản 1.5 (Bản xin ý kiến RFC 2315) mô tả cú pháp chung cho dữ liệu có thể có áp dụng mật mã, ví dụ như chữ ký số (digital signatures) và phong bì số (digital envelopes), Cú pháp thừa nhận đệ quy, ví dụ, một phong bì có thể được lồng bên trong một phong bì khác, hoặc một bên có thể ký một số dữ liệu điện tử được chứa từ trước. Nó cũng cho phép các thuộc tính tùy ý, chẳng hạn như thời gian ký, được xác thực cùng với nội dung thông điệp và cung cấp các thuộc tính khác như thứ tự ký có liên quan đến một chữ ký. Trong trường hợp suy biến cấu trúc, nó cung cấp một phương tiện để phổ biến các các danh sách các chứng thư hoặc danh sách các chứng thư thu hồi.

Các kiểu hữu ích

  1. CertificateRevocationLists

Kiểu CertificateRevocationLists đưa ra một tập danh sách các chứng thư thu hồi. Nó dự kiến chứa các thông tin đủ để xác định xem các chứng thư cùng với những thông tin liên quan được đưa vào danh sách ưu tiên, nhưng cũng có thể chứa nhiều hoặc ít thông tin về danh sách chứng thư thu hồi hơn cần thiết.

CertificateRevocationLists ::=
SET OF CertificateRevocationList
  1. ContentEncryptionAlgorithmIdentifier

Kiểu ContentEncryptionAlgorithmIdentifier xác định một thuật toán mã hóa nội dung, chẳng hạn như DES (Data Encryption Standard - Tiêu chuẩn Mã hóa Dữ liệu). Một thuật toán mã hóa nội dung hỗ trợ các hoạt động mã hóa và giải mã. Hoạt động mã hóa ánh xạ một chuỗi octet (thông điệp) với các chuỗi octet khác (bản mã) dưới sự điểu khiển của khóa mã hóa nội dung. Các hoạt động giải mã là ngược với hoạt động mã hóa. Bối cảnh sẽ xác định hoạt động nào được sử dụng.

ContentEncryptionAlgorithmIdentifier ::=
AlgorithmIdentifier
  1. DigestAlgorithmIdentifier

Kiểu DigestAlgorithmIdentifier xác định một thuật toán phân loại thông điệp, ví dụ như MD2 và MD5 (Message-Digest Algorithm – Thuật toán Phân loại Thông điệp). Một thuật toán phân loại thông điệp ánh xạ một chuỗi octet (thông điệp) với các chuỗi octet khác (phân loại thông điệp).

   DigestAlgorithmIdentifier ::= AlgorithmIdentifier
  1. DigestEncryptionAlgorithmIdentifier

Kiểu DigestEncryptionAlgorithmIdentifier xác định một thuật toán phân loại mã hóa, theo đó, một phân loại thông điệp có thể được mã hóa. Một ví dụ là rsaEncryption trong PKCS #1. Thuật toán phân loại mã hóa hỗ trợ các hoạt động mã hóa và giải mã. Hoạt động mã hóa ánh xạ một chuỗi octet (phân loại thông điệp) tới các chuỗi octet khác dưới sự điều khiển của khóa phân loại mã hóa. Hoạt động giải mã ngược lại với hoạt động mã hóa. Bối cảnh sẽ xác định hoạt động nào được sử dụng.

   DigestEncryptionAlgorithmIdentifier ::=
     AlgorithmIdentifier
  1. ExtendedCertificateOrCertificate

Kiểu ExtendedCertificateOrCertificate đưa ra hoặc là một chứng thư PKCS #6 hoặc là một chứng thư X.509. Kiểu này theo cú pháp được khuyến nghị trong Phần 6 của PKCS #6:

   ExtendedCertificateOrCertificate ::= CHOICE {
     certificate Certificate, -- X.509
     extendedCertificate [0] IMPLICIT ExtendedCertificate }
  1. ExtendedCertificatesAndCertificates

Kiểu ExtendedCertificatesAndCertificates đưa ra một tập các chứng thư mở rộng và chứng thư X.509. Dự kiến rằng, tập đủ để bao gồm các chuỗi từ một “root” được công nhận hoặc từ “cơ quan chứng thực cấp cao nhất” đến tất cả những người ký mà tập này có liên quan, nhưng nó có thể nhiều chứng thư hơn cần thiết, hoặc ít chứng thư hơn cần thiết.

 

   ExtendedCertificatesAndCertificates ::=
     SET OF ExtendedCertificateOrCertificate
  1. IssuerAndSerialNumber

Kiểu IssuerAndSerialNumber xác định một chứng thư (và do đó một thực thể và một khóa công khai) bằng tên được phân biệt của nhà cung cấp chứng thư và một mã số xác định nhà cung cấp chứng thư.

      IssuerAndSerialNumber ::= SEQUENCE {
     issuer Name,
     serialNumber CertificateSerialNumber }
  1. KeyEncryptionAlgorithmIdentifier

Kiểu KeyEncryptionAlgorithmIdentifier xác định một thuật toán mã hóa khóa (key-encryption) mà theo đó một khóa mã hóa nội dung có thể được mã hóa. Ví dụ như rsaEncryption trong PKCS #1. Một thuật toán mã hóa khóa hỗ trợ các hoạt động mã hóa và giải mã. Hoạt động mã hóa ánh xạ một chuỗi octet (khóa) với một chuỗi octet khác (khóa được mã hóa) theo sự điều khiển của một khóa mã hóa. Hoạt động giải mã ngược lại với hoạt động mã hóa. Bối cảnh sẽ xác định hoạt động nào được sử dụng.

   KeyEncryptionAlgorithmIdentifier ::=
     AlgorithmIdentifier
  1. Version

Kiểu Version đưa ra cú pháp số phiên bản để tương thích với những sửa đổi trong tương lai của tài liệu này

   Version ::= INTEGER

Cú pháp chung

Cú pháp chung cho nội dung được trao đổi giữa các thực thể theo tài liệu này liên kết một kiểu nội dung với nội dung. Cú pháp sẽ có kiểu ASN.1 Content Info:

   ContentInfo ::= SEQUENCE {
     contentType ContentType,
     content
       [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL }
   ContentType ::= OBJECT IDENTIFIER

Các trường của kiểu ContentInfo phải có ý nghĩa như sau:

  • contentType cho biết kiểu nội dung. Nó là một định danh đối tượng, có nghĩa là nó một chuỗi duy nhất các số nguyên được gán bởi cơ quan có thẩm quyền xác định kiểu nội dung. Tài liệu này định nghĩa sáu loại nội dung (xem phần: data, signedData, envelopedData, signedAndEnvelopedData, digestedData, and encryptedData).
  • content là nội dung. Trường này không bắt buộc và nếu nó không được trình bày, giá trị dự kiến của nó phải được cung cấp bằng cách khác. Nó là kiểu được xác định cùng với định danh đối tượng của contentType.

Kiểu nội dung dữ liệu

Nội dung dữ liệu chỉ là một chuỗi octet, nó sẽ có kiểu ASN.1 Data:

   Data ::= OCTET STRING

Kiểu nội dung dữ liệu được dự kiến để chỉ các chuỗi octet tùy ý, chẳng hạn như các tệp văn bản ASCII. Các chuỗi như vậy không cần phải có cấu trúc bên trong (mặc dù chúng có thể có cấu trúc hoặc thậm chí chúng có thể là các mã hóa DER).

Kiểu nội dung dữ kiệu đã được ký

Kiểu nội dung dữ liệu đã được ký bao gồm các nội dung có kiểu bất kỳ và các phân loại thông điệp đã được mã hóa của nội dung không được ký hoặc do một hoặc nhiều người ký. Phân loại đã được mã hóa cho một người ký là một “chữ ký số” về nội dung của người ký đó. Kiểu nội dung có thể được ký song song bởi người ký bất kỳ. Hơn nữa, trong một trường hợp suy biến, có thể không có người ký về nội dung. Trường hợp suy biến, nó cung cấp phương tiện để phổ biến danh sách chứng thư và chứng thư thu hồi.

  1. Kiểu SignedData

Kiểu nội dung dữ liệu đã ký sẽ có kiểu ASN.1 SignedData:

   SignedData ::= SEQUENCE {
     version Version,
     digestAlgorithms DigestAlgorithmIdentifiers,
     contentInfo ContentInfo,
     certificates
        [0] IMPLICIT ExtendedCertificatesAndCertificates
          OPTIONAL,
     crls
       [1] IMPLICIT CertificateRevocationLists OPTIONAL,
     signerInfos SignerInfos }
 
   DigestAlgorithmIdentifiers ::=
     SET OF DigestAlgorithmIdentifier
   SignerInfos ::= SET OF SignerInfo

Các trường của kiểu SignedData có ý nghĩa như sau:

  • version là số phiên bản cú pháp. Trong tài liệu này phiên bản là 1
  • digestAlgorithms là tập hợp các định danh thuật toán phân loại thông điệp. Có thể có bất kỳ số các phần tử trong tập hợp này, bao gồm cả số 0. Mỗi phần tử xác định thuật toán phân loại thông điệp theo nội dung được phân loại cho một vài người ký. Tập hợp này dự định lên danh sách các thuật toán phân loại thông điệp được sử dụng bởi tất cả người ký, trong bất kỳ yêu cầu nào để tạo điều kiện xác minh chữ ký một lần.
  • contentInfo là nội dung được ký. Nó có thể có kiểu nội dung bất kỳ đã được định nghĩa.
  • certificates là một bộ các chứng thư mở rộng PKCS #6 và các chứng thư X.509.
  • crls là bộ danh sách chứng thư thu hồi.
  • signerInfos là tập hợp thông tin mỗi người ký.
  1. SignerInfo type

Thông tin của mỗi người ký được thể hiện trong kiểu SignerInfo:

   SignerInfo ::= SEQUENCE {
     version Version,
     issuerAndSerialNumber IssuerAndSerialNumber,
     digestAlgorithm DigestAlgorithmIdentifier,
     authenticatedAttributes
       [0] IMPLICIT Attributes OPTIONAL,
     digestEncryptionAlgorithm
       DigestEncryptionAlgorithmIdentifier,
     encryptedDigest EncryptedDigest,
     unauthenticatedAttributes
       [1] IMPLICIT Attributes OPTIONAL }
   EncryptedDigest ::= OCTET STRING

Các trường của kiểu SignerInfo có ý nghĩa như sau:

  • version là số phiên bản cú pháp. Trong tài liệu này phiên bản là 1.
  • issuerAndSerialNumber quy định chứng thư của người ký (do đó là tên riêng biệt của người ký và khóa công khai) bởi tên được phân biệt và mã số xác định nhà cung cấp.
  • digestAlgorithm xác định thuật toán phân loại thông điệp theo nội dung và các thuộc tính xác thực (nếu có) được phân loại.
  • authenticatedAttributes là một bộ các thuộc tính được ký bởi người ký. Trường này là tùy chọn, nhưng phải có nếu giá trị kiểu nội dung của ContentInfor đang được ký không có dữ liệu.
  • digestEncryptionAlgorithm xác định thuật toán phân loại mã hóa (và các tham số liên quan) theo phân loại thông điệp và thông tin có liên quan được mã hóa với khóa bí mật của người ký.
  • encryptedDigest là kết quả của việc mã hóa phân loại thông điệp và các thông tin có liên quan cùng với khóa khóa bí mật của người ký.
  • unauthenticatedAttributes là một bộ các thuộc tính không được ký bởi người ký. Trường này là tùy chọn.

(3) Quy trình phân loại thông điệp

Quy trình phân loại thông điệp tính toán phân loại thông điệp theo nội dung được ký hoặc nội dung cùng với các thuộc tính đã được xác thực của người ký. Trong cả hai trường hợp, đầu vào ban đầu của quy trình phân loại thông điệp là “giá trị” của nội dung đang được ký. Cụ thể, đầu vào ban đầu là các octets nội dung của việc mã hóa DER (Distinguished Encoding Rules – Quy tắc Mã hóa Phân biệt) của trường nội dung có giá trị ContentInfo mà quy trình ký được áp dụng. Chỉ các thành phần octets của mã hóa DER của trường đó được phân loại, việc nhận dạng octets hay độ dài của các octets thì không được phân loại.

(4) Quy trình phân loại mã hóa

Đầu vào của quy trình phân loại mã hóa – giá trị được cung cấp cho thuật toán mã hóa phân loại – bao gồm kết quả của quy trình phân loại thông điệp và nhận dạng thuật toán phân loại (hoặc nhận dạng đối tượng). Kết quả của quy trình mã hóa phân loại là việc mã hóa với khóa bí mật của người ký với giá trị mã hóa kiểu DigestInfo:

   DigestInfo ::= SEQUENCE {
     digestAlgorithm DigestAlgorithmIdentifier,
     digest Digest }
   Digest ::= OCTET STRING

Các trường của kiểu DigestInfo có ý nghĩa như sau:

o digestAlgorithm xác định thuật toán phân loại thông điệp mà nội dung và các thuộc tính được xác thực tương tự như trường của giá trị SignerInfo.

o digest là kết quả của phân loại thông điệp.

(5) Tương thích với Privacy-Enhanced Mail

Tương thích với các kiểu quy trình MIC-ONLY và MIC-CLEAR trong PEM.

Kiểu nội dung Enveloped-data (Dữ liệu được đóng gói)

(1) Kiểu EnvelopedData

Kiểu nội dung enveloped-data nên có kiểu ASN.1 EnvelopedData:

   EnvelopedData ::= SEQUENCE {
     version Version,
     recipientInfos RecipientInfos,
     encryptedContentInfo EncryptedContentInfo }
   RecipientInfos ::= SET OF RecipientInfo
   EncrypteContentInfo ::= SEQUENCE {
     contentType ContentType,
     contentEncryptionAlgorithm
       ContentEncryptionAlgorithmIdentifier,
     encryptedContent
       [0] IMPLICIT EncryptedContent OPTIONAL }
   EncryptedContent ::= OCTET STRING

Các trường của kiểu EnvelopedData có ý nghĩa như sau:

o version là số phiên bản cú pháp. Trong tài liệu này nó là 0.

o recipientInfos là tập hợp thông tin của mỗi nơi nhận. Phải có ít nhất một phần tử trong tập hợp này.

o encryptedContentInfo la thông tin nội dung được mã hóa.

(2) Kiểu RecipientInfo

Thông tin mỗi nơi nhận được trình bày trong kiểu RecipientInfo:

  RecipientInfo ::= SEQUENCE {
     version Version,
     issuerAndSerialNumber IssuerAndSerialNumber,
     keyEncryptionAlgorithm
       KeyEncryptionAlgorithmIdentifier,
     encryptedKey EncryptedKey }
   EncryptedKey ::= OCTET STRING

(3) Quy trình mã hóa nội dung (Content-encryption)

Đầu vào của quy trình mã hóa nội dung là giá trị của nội dung đang được mã hóa.

(4) Quy trình mã hóa khóa (Key-encryption)

Đầu vào của quy trình mã hóa khóa – giá trị được cung cấp cho thuật toán mã hóa chính của nơi nhận – là giá trị của khóa mã hóa nội dung.

Kiểu nội dung Dữ liệu được ký và đóng gói (Signed-and-enveloped-data)

Phần này định nghĩa kiểu nội dung dữ liệu được ký và đóng gói.

Kiểu nội dung dữ liệu được ký và đóng gói gồm dữ liệu được mã hóa với kiểu bất kỳ, khóa nội dung mã hóa đã được mã hóa cho một hoặc nhiều nơi nhận và phân loại thông điệp được mã hóa hai lần cho một hoặc nhiều người ký.

(1) Kiểu SignedAndEnvelopedData

Kiểu nội dung dữ liệu đã được ký và đóng gói là kiểu ASN.1 SignedAndEnvelopedData:

   SignedAndEnvelopedData ::= SEQUENCE {
     version Version,
     recipientInfos RecipientInfos,
     digestAlgorithms DigestAlgorithmIdentifiers,
     encryptedContentInfo EncryptedContentInfo,
     certificates
        [0] IMPLICIT ExtendedCertificatesAndCertificates
          OPTIONAL,
     crls
       [1] IMPLICIT CertificateRevocationLists OPTIONAL,
     signerInfos SignerInfos }

(2) Quy trình mã hóa phân loại (Digest-encryption)

Đầu vào cho quy trình mã hóa phân loại giống như trong Phần kiểu nội dung dữ liệu được ký, nhưng bản thân các quy trình thì khác nhau. Quy trình này tương thích với kiểu quy trình mã hóa trong Privacy-Enhanced Mail.

(3) Tương thích với Privacy-Enhanced Mail

Tương thích với kiểu quy trình mã hóa trong PEM xảy ra khi nội dung dữ liệu của giá trị ContentInfo được ký và được đóng gói là dữ liệu, thuật toán phân loại thông điệp là MD2 hoặc MD5, thuật toán nội dung mã hóa là DES trong chế độ CBC, thuật toán mã hóa phân loại là rsaEncryption của PKCS #1 và thuật toán mã hóa khóa rsaEncryption của PKCS #1.

Kiểu nội dung Phân loại dữ liệu (Digested-data)

Kiểu nội dung phân loại dữ liệu gồm nội dung của kiểu phân loại dữ liệu bất kỳ về nội dung.

Kiểu nội dung phân loại dữ liệu phải là kiểu ASN.1 DigestedData:

   DigestedData ::= SEQUENCE {
     version Version,
     digestAlgorithm DigestAlgorithmIdentifier,
     contentInfo ContentInfo,
     digest Digest }
   Digest ::= OCTET STRING

Kiểu nội dung dữ liệu được mã hóa (Encrypted-data)

Kiểu nội dung dữ liệu được mã hóa gồm nội dung được mã hóa theo kiểu bất. Không giống như kiểu nội dung dữ liệu được đóng gói, kiểu nội dung dữ liệu được mã hóa hoặc là người nhận hoặc là khóa nội dung mã hóa đã được mã hóa. Các khóa được giả định được quản lý bằng các Phương tiện khác nhau.

Kiểu nội dung dữ liệu được mã hóa có kiểu ASN. EncryptedData:

   EncryptedData ::= SEQUENCE {
     version Version,
     encryptedContentInfo EncryptedContentInfo }

Xác định đối tượng

Tài liệu này định nghĩa 7 loại đối tượng: pkcs-7, data, signedData, envelopedData, signedAndEnvelopedData, digestedData và encryptedData.

Xác định đối tượng pkcs-7

   pkcs-7 OBJECT IDENTIFIER ::=
     { iso(1) member-body(2) US(840) rsadsi(113549)
         pkcs(1) 7 }

Đối tượng xác định data, signedData, envelopedData, signedAndEnvelopedData, digestedData, và encryptedData một cách tương ứng với các dữ liệu signed-data, enveloped-data, signed-and-enveloped-data, digested-data.

   data OBJECT IDENTIFIER ::= { pkcs-7 1 }
   signedData OBJECT IDENTIFIER ::= { pkcs-7 2 }
   envelopedData OBJECT IDENTIFIER ::= { pkcs-7 3 }
   signedAndEnvelopedData OBJECT IDENTIFIER ::=
      { pkcs-7 4 }
   digestedData OBJECT IDENTIFIER ::= { pkcs-7 5 }
   encryptedData OBJECT IDENTIFIER ::= { pkcs-7 6 }

Các đối tượng xác định được dự định sử dụng trong trường contentType của giá trị của kiểu ContentInfo. Trường nội dung của kiểu có cú pháp kiểu nội dung cụ thể ANY DEFINED BY contentType, sẽ có kiểu ASN.1 tương ứng Data, SignedData, EnvelopedData, SignedAndEnvelopedData, DigestedData và EncryptedData. Những xác định đối tượng này cũng dự kiến được sử dụng trong các thuộc tính kiểu nội dung PKCS #9.

Áp dụng

Tài liệu này tương thích với Tăng cường Tính riêng tư Thư điện tử (Privacy Enhanced Mail - PEM), trong đó, nội dung dữ liệu đã ký và nội dung dữ liệu đã ký được đóng gói sẽ được xây dựng trong một chế độ PEM tương thích, có thể được chuyển đổi sang thông điệp PEM mà không đòi hỏi bất kỳ hoạt động mã hóa nào. Thông điệp PEM có thể được chuyển đổi tương tự sang các kiểu nội dung dữ liệu đã ký và nội dung dữ liệu đã ký được đóng gói.

Tài liệu này có thể hỗ trợ một loạt các kiến trúc quản lý khóa dựa trên chứng thư, chẳng hạn như một trong những đề xuất cho Tăng cường Tính riêng tư Thư điện tử thuộc RFC 1422.

Trong Thông tư số 22/2013/TT-BTTTT ngày 23/12/2013 của Bộ trưởng Bộ Thông tin và Truyền thông Công bố Danh mục tiêu chuẩn kỹ thuật về ứng dụng công nghệ thông tin trong cơ quan nhà nước quy định Khuyến nghị áp dụng (PKCS#7 v1.5 RFC 2315) và được xếp vào nhóm Tiêu chuẩn về an toàn thông tin (Hạ tầng khóa công khai).

 

Nguồn tham khảo

[1] Https://tools.ietf.org/html/rfc2315

[2] Https://en.wikipedia.org/wiki/PKCS

[3] FIPS PUB 46-1 National Bureau of Standards. FIPS PUB 46-1: Data Encryption Standard. January 1988.

[4] PKCS #1 RSA Laboratories. PKCS #1: RSA Encryption. Version 1.5, November 1993.

[5] PKCS #6 RSA Laboratories. PKCS #6: Extended-Certificate Syntax. Version 1.5, November 1993.

[6] PKCS #9 RSA Laboratories. PKCS #9: Selected Attribute Types. Version 1.1, November 1993.

 

Lê Nhật 

3993 Go top

Sự kiện nổi bật

Ý kiến về Trang thông tin điện tử Cục Chuyển đổi số quốc gia?
1. Đạt yêu cầu, 1180 phiếu (88 %)
2. Chưa đạt yêu cầu, 107 phiếu (8 %)
3. Cần thêm chủ đề, 57 phiếu (4 %)
Tổng số phiếu: 1344
THÔNG KÊ TRUY CẬP
  • Người trực tuyến Người trực tuyến
    • Khách Khách 64
    • Thành viên Thành viên 0
    • Tổng Tổng 64
    • Tổng lượt truy cập: Tổng lượt truy cập: 19817978