自分のための備忘録的なブログです。

Ubuntu14.04LTS を使って、ディープラーニングの勉強をしています。
記載されているコードは、他の OS には互換性がない可能性があります。


DNN:
マシン性能別 学習速度の比較, TFチュートリアルをmodifyする

python3:
オブジェクト指向プログラミングとは, モジュールとインポート、パスを通す, システムコマンド(os), ファイル・フォルダ名取得, 画像の前処理,

Ubuntu14 の初期設定:
Ubuntu14初期設定, 初期設定-2, cudaなども, 初期設定-3

dicom を匿名化 (python, pydicom, pycrypto)

python で、pydicom と pycrypto を使って dicom ファイルを匿名化・暗号化します。

 

 

 

暗号化については、pycrypto というライブラリを使い、AES 方式で暗号化する方法がネットに上がっておりましたので、それを利用しました。

 

pycrypto の使い方は

暗号化ライブラリ pycrypto · kamatari

を参考にしました。

 

コードを使う際は、必ず 'secret_key' のところを変更(ThisIsTopSecret! を別の単語に!)して使ってください。この部分が、暗号解読のパスワードになるためです。

(パスワードの文字数は、16、24、32文字のいずれかだそうです。当然長いほうがより secure ですので、できれば長いパスワードをご利用ください)

 

個人情報の大部分を 'no data' で置き換えますが、後で再使用が必要かもしれない

 ID

 age

 性別

は後で確認できるよう、暗号化としています。

 

pycrypto では、暗号化する対象は 半角英数字で、16の倍数の文字数 である必要があるそうです。

下記スクリプトは、

 ID が8桁

 age が2桁

 性別 が1桁

と想定して、文字数を調整しています。桁数がちばう場合には、適宜調整してください。

 

# -*- coding: utf-8 -*-

'''カレントディレクトリ内にある dicom ファイルを Encrypt します

実装かっこ悪くてすみません'''

import os, time, dicom

from Crypto.Cipher import AES

start = time.time()

print('started : ' + time.ctime())

secret_key = 'ThisIsTopSecret!'

#password は半角16,24,32文字

def main():

    print('__encryption started!!__')

    for file_name in os.listdir('.'):

        root, ext = os.path.splitext(file_name)

        if ext == '.dcm':

            ds = dicom.read_file(file_name)

            cryp = AES.new(secret_key)

            ds.PatientAddress = 'no data'

            ds.PatientBirthDate = 'no data'

            ds.PatientBirthName = 'no data'

            ds.PatientName = 'no data'

            ds.PatientSize = 0

            ds.PatientWeight = 0

            ds.PatientMohterBirthName = 'no data'

            ds.PatientTelephoneNumbers = 'no data'

            ds.CountryofResidence = 'no data'

            ds.PatientAge = cryp.encrypt(

              str(ds.PatientAge) + '___4___8__12__'

              )

            ds.PatientID = cryp.encrypt(

              str(ds.PatientID) + '___4___8'

              )

            ds.PatientSex = cryp.encrypt(

              str(ds.PatientSex) + '___4___8__12___'

              )

            ds.save_as(root + '_encrypted.dcm')

            print(

                    '__' + file_name + ' was encrypted as ' +

                    root + '_encrypted.dcm!!__'

                   )

    print('__finished!!__')

    elapsed_time = time.time() - start

    print('finished : ' + time.ctime())

    print('elapsed time : {0} sec'.format(elapsed_time))


if __name__ == '__main__':
    main()

'''こちらを参考にさせていただきました
https://kamatari.github.io/2016/04/23/what-is-pycrypto/'''

 

 

こちらは変更バージョンです。

上記スクリプトで 'no data' で置き換えていたところに 無意味な半角英数字 を挿入し、暗号化しているように見せかけたものです。

 

暗号化の解除に、多少 余計に時間がかかるかもしれないと思い、修正しました。

 

# -*- coding: utf-8 -*-

import os, time, dicom, random

from Crypto.Cipher import AES

 

start = time.time()

print('started : ' + time.ctime())

 

secret_key = 'ThisIsTopSecret!'

#password は半角16,24,32文字

 

def main():

    print('__encryption started!!__')

    for file_name in os.listdir('.'):

        root, ext = os.path.splitext(file_name)

        if ext == '.dcm':

            ds = dicom.read_file(file_name)

 

            cryp = AES.new(secret_key)


            SixteenInt = random.randint(

                1000000000000000,

                9999999999999999

                )

 

            ds.PatientAddress = cryp.encrypt(str(SixteenInt))

            ds.PatientBirthDate = cryp.encrypt(str(SixteenInt))

            ds.PatientBirthName = cryp.encrypt(str(SixteenInt))

            ds.PatientName = cryp.encrypt(str(SixteenInt))

            ds.PatientSize = 0

            ds.PatientWeight = 0

            ds.PatientMohterBirthName = cryp.encrypt(str(SixteenInt))

            ds.PatientTelephoneNumbers = cryp.encrypt(str(SixteenInt))

            ds.CountryofResidence = cryp.encrypt(str(SixteenInt))

 

            ds.PatientAge = cryp.encrypt(

              str(ds.PatientAge) + '___4___8__12'
              )

            ds.PatientID = cryp.encrypt(

              str(ds.PatientID) + '___4___8_'

              )

            ds.PatientSex = cryp.encrypt(

              str(ds.PatientSex) + '___4___8__12___'

              )

 

            ds.save_as(root + '_encrypted.dcm')

 

            print(

                    '__' + file_name + ' was encrypted as ' +

                    root + '_encrypted.dcm!!__'

                   )

 

    print('__finished!!__')

    elapsed_time = time.time() - start

    print('finished : ' + time.ctime())

    print('elapsed time : {0} sec'.format(elapsed_time))

 


if __name__ == '__main__':

    main()

 

'''こちらを参考にさせていただきました
https://kamatari.github.io/2016/04/23/what-is-pycrypto/'''