[PS1] Powershell で DES の暗号化と復号化を行う

2015年12月30日

 Oracle で password という文字列を、秘密鍵 'key12345' で DES で暗号化してみます。

SQL> select
  2      rawtohex(
  3          dbms_obfuscation_toolkit.desencrypt(
  4              input_string => 'password',
  5              key_string   => 'key12345'
  6          )
  7      ) as Encrypted
  8  from dual;

ENCRYPTED
-----------------------------------------------------
3437EBBCAD1BB618

 dbms_obfuscation_toolkit.desencrypt で暗号化するわけですが、戻ってくるものは文字列ではないので、rawtohex で16進数表示化をしています。

 この結果を Powershell で正しいかどうかを検証します。

 暗号化を行うコマンドレットは標準では用意されていないようなので、まずは以下のような関数を作成します。
 要するに .net のクラスライブラリの力を借ります。

function Encrypt($inputString, $keyString) {

    # 暗号化プロバイダの生成とモードの設定
    $des = New-Object System.Security.Cryptography.DESCryptoServiceProvider
    $des.Padding = [System.Security.Cryptography.PaddingMode]::Zeros

    # 秘密鍵と初期化ベクタ(IV)の設定
    $des.Key = [System.Text.Encoding]::ASCII.GetBytes($keyString)
    $des.IV  = [Byte[]](0,0,0,0,0,0,0,0)

    # 暗号化対象の設定
    $inputBytes = [System.Text.Encoding]::ASCII.GetBytes($inputString)
    $params = ($inputBytes, 0, $inputBytes.Length)

    # 暗号化
    $encrypter = $des.CreateEncryptor()
    $encBytes = [System.Security.Cryptography.ICryptoTransform].GetMethod("TransformFinalBlock").Invoke($encrypter , $params)
    $encrypter.Dispose()

    #リターン
    Write-Output $encBytes
}

# パラメータ
$inputString = "password"
$keyString   = "key12345"    # 8byte以上が必要

# 暗号化
$encBytes = Encrypt $inputString $keyString
[System.BitConverter]::ToString($encBytes)

 実行結果

34-37-EB-BC-AD-1B-B6-18

 ついでに、この暗号が復号できるかを確認してみます。

function Decrypt($inputBytes, $keyString) { #(★)

    # 暗号化プロバイダの生成とモードの設定
    $des = New-Object System.Security.Cryptography.DESCryptoServiceProvider
    $des.Padding = [System.Security.Cryptography.PaddingMode]::Zeros

    # 秘密鍵と初期化ベクタ(IV)の設定
    $des.Key = [System.Text.Encoding]::ASCII.GetBytes($keyString)
    $des.IV  = [Byte[]](0,0,0,0,0,0,0,0)

    # 暗号化対象の設定
    $params = ($inputBytes, 0, $inputBytes.Length)

    # 復号化(★)
    $decrypter = $des.CreateDecryptor()
    $decBytes = [System.Security.Cryptography.ICryptoTransform].GetMethod("TransformFinalBlock").Invoke($decrypter , $params)
    $decrypter.Dispose()

    #リターン(★)
    $decString = [System.Text.Encoding]::ASCII.GetString($decBytes)
    Write-Output $decString
}
# パラメータ
$inputBytes = [Byte[]](0x34, 0x37, 0xEB, 0xBC, 0xAD, 0x1B, 0xB6, 0x18)
$keyString  = "key12345"    # 8byte以上が必要

# 復号化
Decrypt $inputBytes $keyString

 結果

password





カテゴリー: Oracle, PowerShell, Program, データベース

Follow comments via the RSS Feed | Leave a comment | Trackback URL

コメントを投稿する

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


«   »
 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org