⚠️ これは 非公式の翻訳サイトです。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;

}