⚠️ これは 非公式の翻訳サイトです。DCMTK / OFFIS とは無関係です。正確な情報は 原文(https://support.dcmtk.org/docs/mod_dcmsign.html) を参照してください。

dcmsign: デジタル署名ライブラリとユーティリティアプリ

このモジュールには、DICOM データセットへのデジタル署名の作成、署名の検証、署名の削除を行うクラスが含まれます。署名は DICOM の「Digital Signatures」拡張(旧 Supplement 41)に準拠します。本モジュールは外部ライブラリの OpenSSL を必要とします。

主なインターフェースクラスは次のとおりです。

ツール

このモジュールには次のコマンドラインツールが含まれます。

例

次の例は、DICOM ファイル内のすべての署名を検証する方法を示します。

DcmFileFormat fileformat;
if (fileformat.loadFile("test.dcm").good())
{
 // Load a root Certification Authority certificate from "ca_cert.pem"
 // and declare it as trusted. All certificates issued by this CA will
 // be considered trustworthy (if within their validity time).
 SiCertificateVerifier certVerifier;
 if (certVerifier.addTrustedCertificateFile("ca_cert.pem",
    X509_FILETYPE_PEM).bad())
  {
    cerr << "unable to load CA certificate" << endl;
 return;
  }

 // Verify all signatures in the dataset, and verify the signer
 // certificate against the root CA defined above.
 // Fail if no signature is present in the dataset, but do not require
 // any specific DICOM signature profile. Verify a secure timestamp
 // if present, but do not fail signature verification if no timestamp
 // is there.
 int result = DcmSignatureHelper::do_verify(fileformat.getDataset(),
    certVerifier, ESVP_requireSignature, ETVP_verifyTSIfPresent);

 if (result == 0)
    std::cerr << "signature(s) found and successfully verified" << endl;
 else
    std::cerr << "signature absent or verification failed"  << endl;
}

次の例は、DICOM ファイルに署名する方法を示します。

DcmFileFormat fileformat;
if (fileformat.loadFile("test.dcm").good())
{
 // dataset to be signed
 DcmDataset *dataset = fileformat.getDataset();

 // select transfer syntax in which digital signature will be created
 E_TransferSyntax xfer = dataset->getOriginalXfer();

 // use Little Endian Explicit for uncompressed files
 if ((xfer == EXS_LittleEndianImplicit) ||
      (xfer == EXS_BigEndianExplicit))
     xfer = EXS_LittleEndianExplicit;

 SiCreatorProfile profile;  // use the "RSA Creator Profile"
  SiRIPEMD160 mac;           // use RIPEMD160 as MAC algorithm
 SiCertificate cert;        // our certificate
 if (cert.loadCertificate("certificate.pem", X509_FILETYPE_PEM).bad())
  {
    cerr << "unable to load certificate" << endl;
 return;
  }
 SiPrivateKey key;  // private key, must be unencrypted here
 if (key.loadPrivateKey("privkey.pem", X509_FILETYPE_PEM).bad())
  {
    cerr << "unable to load private key" << endl;
 return;
  }

 // list of attributes to be signed. It can remain empty here
 // since we're using the RSA Creator Profile to determine the
 // list of attributes that needs to be signed
 DcmAttributeTag tags;

 // now create the signature
 int result = DcmSignatureHelper::do_sign(dataset,
    key, cert, &mac, &profile, &tags, xfer, NULL,
 SiSignaturePurpose::ESP_none, NULL);

 if (result == 0)
     std::cerr << "signature successfully created" << endl;
 else
     std::cerr << "signature creation failed"  << endl;
}