[HOW TO] Visual Basic .NET を使用してファイルの暗号化および復号化を行う方法

文書翻訳 文書翻訳
文書番号: 301070 - 対象製品
この記事は、以前は次の ID で公開されていました: JP301070
すべて展開する | すべて折りたたむ

目次

概要

この資料では、Microsoft .NET Framework によって提供される暗号化クラスを使用して、テキスト ファイルを読み取り不可の状態に暗号化した後、その情報を復号化して元の形式に戻す方法を紹介します。

要件

必要なハードウェア、ソフトウェア、ネットワーク インフラストラクチャ、Service Pack は次のとおりです。
  • Microsoft Windows XP Professional、Microsoft Windows 2000 Professional、Windows 2000 Server、Windows 2000 Advanced Server、または Windows NT 4.0 Server
  • Microsoft Visual Studio .NET

暗号化と復号化

Microsoft .NET Framework 内の System.Security.Cryptography 名前空間には、暗号化と復号化に役立つさまざまなツールがあります。CryptoStream クラスは、提供されている多くのクラスの 1 つで、ファイルにストリーム出力されるコンテンツの暗号化または復号化を行います。

ファイルを暗号化するには、以下の手順に従います。
  1. Visual Studio .NET を起動します。
  2. Microsoft Visual Basic .NET で新しいコンソール アプリケーションを作成します。Visual Basic .NET によって、モジュールおよび空の Main() プロシージャが作成されます。
  3. System、System.Security、System.Security.Cryptography、System.Text、および System.IO 名前空間に対して Imports ステートメントを使用します。これにより、以降のコードでこれらの名前空間からの宣言を修飾する必要がなくなります。これらのステートメントは、他のすべての宣言より前に配置する必要があります。
    Imports System
    Imports System.IO
    Imports System.Security
    Imports System.Security.Cryptography
    Imports System.Text
    
  4. クラスまたはモジュールに、暗号化および復号化の秘密キーを表す定数を追加します。
    '64 ビット、8 バイトでなければなりません。
    Private Const sSecretKey As String = "Password"
    
  5. クラス内に EncryptFile という名前のメソッドを作成し、sInputFilesOutputFile、および sKey (ファイルの暗号化および復号化に使用される秘密キー) という 3 つのパラメータを追加します。
        Sub EncryptFile(ByVal sInputFilename As String, _
                       ByVal sOutputFilename As String, _
                       ByVal sKey As String)
        End Sub
    
  6. EncryptFile プロシージャの中に、対象ファイルの読み書きを処理する入力用および出力用の FileStream オブジェクトを作成します。
            Dim fsInput As New FileStream(sInputFilename, _
                                        FileMode.Open, FileAccess.Read)
            Dim fsEncrypted As New FileStream(sOutputFilename, _
                                        FileMode.Create, FileAccess.Write)
    
  7. DESCryptoServiceProvider クラスのインスタンスを宣言します。このクラスは、ファイルに対して使用される実際の暗号化および復号化の手法を表しています。RSA またはその他の暗号化技術を使用する場合は、ここで異なるプロバイダを作成することもできます。
    Dim DES As New DESCryptoServiceProvider()
    
  8. 暗号化プロバイダには、秘密キーをバイト配列として提供する必要があります。System.Text 名前領域は、そのエンコード機能の一部として、文字列を受け取ってバイト配列を返す GetBytes() という便利な関数を提供しています。キーのサイズは各暗号化技術によって異なり、DES の場合は 64 ビット キーを使用します。これは、8 バイトまたは 8 文字に相当します。

    キーを提供しない場合、プロバイダによってランダムにキーが作成されます。これによってファイルは正常にエンコードされますが、復号化する方法は実質上ありません。また、初期化ベクタ (IV) も提供する必要があります。この値は暗号化の一部として使用されるもので、キーと同様、提供しないとランダムに生成されます。暗号化と復号化において値が同じでなければならないため、ランダムに生成されると役に立たないことがあります。
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey)
    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)
    
  9. 暗号化プロバイダを使用して、暗号化するオブジェクト (CreateEncryptor) と既存の出力用 FileStream オブジェクトをコンストラクタの一部として取得し、CryptoStream クラスのインスタンスを作成します。
    Dim desencrypt As ICryptoTransform = DES.CreateEncryptor()
    Dim cryptostream As New CryptoStream(fsEncrypted, _
                                         desencrypt, _
                                         CryptoStreamMode.Write)
  10. 入力ファイルを読み取り、CryptoStream オブジェクトを通して、出力ファイルに書き込みます (ここで、提供したキーを使用した暗号化が行われます)。
    Dim bytearrayinput(fsInput.Length - 1) As Byte
    fsInput.Read(bytearrayinput, 0, bytearrayinput.Length)
    cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length)
    
  11. 最後にストリームを閉じます
    cryptostream.Close()
    fsEncrypted.Close()
    fsInput.Close()
    
  12. DecryptFile という名前のメソッドを作成します。復号化のプロセスは暗号化のプロセスとよく似ていますが、DecryptFile の場合、EncryptFile プロシージャとは主に次の 2 つの点が異なります。まず、CryptoStream オブジェクトの作成には、CreateEncryptor の代わりに CreateDecryptor が使用され、オブジェクトの用途を指定します。また、復号化されたテキストを出力先のファイルに書き込む際には、ソースとして、出力先ストリームの代わりに CryptoStream オブジェクトが使用されます。
    Sub DecryptFile(ByVal sInputFilename As String, _
        ByVal sOutputFilename As String, _
        ByVal sKey As String)
    
        Dim DES As New DESCryptoServiceProvider()
        'このプロバイダには 64 ビット キーと IV が必要です。
        'DES アルゴリズム用の秘密キーを設定します。
        DES.Key() = ASCIIEncoding.ASCII.GetBytes(sKey)
        '初期化ベクタを設定します。
        DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)
    
        '暗号化されたファイルを読み込むためのファイル ストリームを作成します。
        Dim fsread As New FileStream(sInputFilename, FileMode.Open, FileAccess.Read)
        'DES のインスタンスから DES Decryptor を作成します。
        Dim desdecrypt As ICryptoTransform = DES.CreateDecryptor()
        '受けとったバイトに対して読み取りと DES 復号化変換を行うように設定された CryptoStream を作成します。
        Dim cryptostreamDecr As New CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read)
        '復号化されたファイルの内容を出力します。
        Dim fsDecrypted As New StreamWriter(sOutputFilename)
        fsDecrypted.Write(New StreamReader(cryptostreamDecr).ReadToEnd)
        fsDecrypted.Flush()
        fsDecrypted.Close()
    End Sub
    
  13. Main () プロシージャに、EncryptFile および DecryptFile の両方を呼び出すコードを追加します。
    Public Sub Main()
        EncryptFile("c:\temp\test.txt", _
                        "c:\temp\Encrypted.txt", _
                        sSecretKey)
        DecryptFile("c:\temp\Encrypted.txt", _
                    "c:\temp\Decrypted.txt", _
                    sSecretKey)
    End Sub
    
  14. アプリケーションを保存し、実行します。入力ファイル名として使用するパスが、既存のファイル (重要でないもの) を指していることを確認してください。

動作の確認

このコードをテキスト (.txt) ファイルでテストし、ファイルが正しく暗号化され、復号化されることを確認します。復号化先は、元のファイルではなく新しいファイルを指定するようにします (この資料の Sub Main() プロシージャを参照のこと)。復号化後のファイルを調べ、元のファイルと比較します。

完全なコード リスト

Imports System
Imports System.IO
Imports System.Security
Imports System.Security.Cryptography
Imports System.Text


Module Module1
    '64 ビット、8 バイトでなければなりません。
    Private Const sSecretKey As String = "Password"

    Public Sub Main()
        EncryptFile("c:\temp\test.txt", _
                        "c:\temp\Encrypted.txt", _
                        sSecretKey)
        DecryptFile("c:\temp\Encrypted.txt", _
                    "c:\temp\Decrypted.txt", _
                    sSecretKey)
    End Sub

    Sub EncryptFile(ByVal sInputFilename As String, _
                   ByVal sOutputFilename As String, _
                   ByVal sKey As String)

        Dim fsInput As New FileStream(sInputFilename, _
                                    FileMode.Open, FileAccess.Read)
        Dim fsEncrypted As New FileStream(sOutputFilename, _
                                    FileMode.Create, FileAccess.Write)

        Dim DES As New DESCryptoServiceProvider()

        'DES アルゴリズム用の秘密キーを設定します。
        'このプロバイダには 64 ビット キーと IV が必要です。
        DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey)

        '初期化ベクタを設定します。
        DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)

        'このインスタンスから DES Encryptor を作成します。
        Dim desencrypt As ICryptoTransform = DES.CreateEncryptor()
        'DES 暗号化を使用してファイル ストリームを変換する CryptoStream を作成します。
        Dim cryptostream As New CryptoStream(fsEncrypted, _
                                            desencrypt, _
                                            CryptoStreamMode.Write)

        'ファイルのテキストをバイト配列に読み込みます。
        Dim bytearrayinput(fsInput.Length - 1) As Byte
        fsInput.Read(bytearrayinput, 0, bytearrayinput.Length)
        'DES で暗号化されたファイルを書き出します。
        cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length)
        cryptostream.Close()
        fsEncrypted.Close()
        fsInput.Close()

    End Sub

    Sub DecryptFile(ByVal sInputFilename As String, _
        ByVal sOutputFilename As String, _
        ByVal sKey As String)

        Dim DES As New DESCryptoServiceProvider()
        'このプロバイダには 64 ビット キーと IV が必要です。
        'DES アルゴリズム用の秘密キーを設定します。
        DES.Key() = ASCIIEncoding.ASCII.GetBytes(sKey)
        '初期化ベクタを設定します。
        DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)

        '暗号化されたファイルを読み込むためのファイル ストリームを作成します。
        Dim fsread As New FileStream(sInputFilename, FileMode.Open, FileAccess.Read)
        'DES のインスタンスから DES Decryptor を作成します。
        Dim desdecrypt As ICryptoTransform = DES.CreateDecryptor()
        '受け取ったバイトに対して読み取りと DES 復号化変換を行うように設定された CryptoStream を作成します。
        Dim cryptostreamDecr As New CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read)
        '復号化されたファイルの内容を出力します。
        Dim fsDecrypted As New StreamWriter(sOutputFilename)
        fsDecrypted.Write(New StreamReader(cryptostreamDecr).ReadToEnd)
        fsDecrypted.Flush()
        fsDecrypted.Close()
        fsread.Close()

    End Sub

End Module

関連情報

.NET の暗号化機能の使用方法、および暗号化一般についての詳細は、以下の Web サイトを参照してください。

関連情報

この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 301070 (最終更新日 2002-02-15) をもとに作成したものです。



プロパティ

文書番号: 301070 - 最終更新日: 2002年8月22日 - リビジョン: 1.0
この資料は以下の製品について記述したものです。
  • Microsoft Visual Basic .NET 2002 Standard Edition
キーワード:?
kbhowto kbhowtomaster KB301070
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com