►index

     スポンサーサイト

    --------

    上記の広告は1ヶ月以上更新のないブログに表示されています。
    新しい記事を書く事で広告が消せます。

     VB.NET 256ビットのAES暗号化&復号化クラス

    2013-05-28

    256ビットのAES暗号対応クラスサンプルを作成しました。

    EncryptAnyクラスの_saltStringは、サンプルでは固定文字列を指定していますが、実際使う時は、外部ファイルで管理するのがよいと思います。サンプル中で、_saltString=””の時、_saltString文字列を生成するロジックも入れておきました。参考にして下さい。
    尚、AES256以外の暗号処理も出来るロジックになっていますが、AES256しか動作確認はしておりません(^^;)あしからず・・・。


    【使用例】

    Public Class From

     

        Private Sub btn暗号化_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn暗号化.Click

          'Me.TextBox1.Textの文字列を暗号化し、Me.TextBox2.Textへセットする。

            Me.TextBox2.Text = EncryptAny.EncryptString(Me.TextBox1.Text, "abc")

     

        End Sub

     

        Private Sub btn復号化_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn複合化.Click

          'Me.TextBox2.Textの文字列を複合化し、Me.TextBox1.Textへセットする。

            Me.TextBox1.Text = EncryptAny.DeEncryptString(Me.TextBox2.Text, "abc")

        End Sub

    End Class


    Imports System.Security.Cryptography

     

    Public Class EncryptAny

        Public Enum EncryptType As Integer

            AdvancedEncryptionStandard256 = 5

            DataEncryptionStandard = 4

            RivestisCipher2 = 3

            TripleDES = 2

            Rijndael = 1

            AdvancedEncryptionStandard128 = 0

        End Enum

     

        Public Shared _saltString As String = "SpHvWa+WKgSNSN95Dy0yVSHTqEnEyaiTZOQy9/UA5YSGlgYOqVSJUvFrM2DhDs6RxSmOcenWLNNLEkgRC1jZnA=="

     

        '''<summary>

        ''' パスワードから共有キーと初期化ベクタを作成する

        '''</summary>

        '''<param name="password">基になるパスワード</param>

        '''<param name="keySize">共有キーのサイズ(ビット)</param>

        '''<param name="key">作成された共有キー</param>

        '''<param name="blockSize">初期化ベクタのサイズ(ビット)</param>

        '''<param name="iv">作成された初期化ベクタ</param>

        Private Shared Sub gfp(ByVal password As String, ByVal keySize As Integer, _

                               ByRef key As Byte(), ByVal blockSize As Integer, ByRef iv As Byte())

            ' Random クラスの新しいインスタンスを生成する

            Dim Rnd As New System.Random()

     

            '反復処理回数を指定する

            Dim myIterations As Integer = 1000

            '

            'saltを決める(64文字=8バイト(64ビット)必要。数が異なってはいけない。): バイト配列に、暗号化に使用するランダムな値の厳密なシーケンスを設定します。

            Dim saltTmp(63) As Byte 'バイト配列数は64でなければならない。

            If _saltString = "" Then

                'バイト配列に、暗号化に使用するランダムな値の厳密なシーケンスを設定します。

                Dim rngCsp As New RNGCryptoServiceProvider()

                rngCsp.GetBytes(saltTmp)

     

                _saltString = System.Convert.ToBase64String(saltTmp) 'ToBase64Stringメソッドで文字列化すると88文字となる。

            End If

     

            Debug.Print("len={0} str={1}", _saltString.Length, _saltString)

     

            Dim salt() As Byte = System.Convert.FromBase64String(_saltString)

     

            'Rfc2898DeriveBytesオブジェクトを作成する

            Dim deriveBytes As New System.Security.Cryptography.Rfc2898DeriveBytes(password, salt, myIterations)

     

            '共有キーと初期化ベクタを生成する

            key = deriveBytes.GetBytes(keySize \ 8)

            iv = deriveBytes.GetBytes(blockSize \ 8)

        End Sub

     

     

     

        ' <summary>

        ' 文字列を暗号化する

        ' </summary>

        ' <param name="pSourceString">暗号化する文字列</param>

        ' <param name="password">暗号化パスワード</param>

        Public Shared Function EncryptString(ByVal pSourceString As String, _

                                  ByVal password As String, _

                                  Optional ByVal etype As EncryptType = EncryptType.AdvancedEncryptionStandard256)

            'System.Security.Cryptography.AesCryptoServiceProvider rijndael =

            '    new System.Security.Cryptography.AesCryptoServiceProvider();

     

            Dim rijndael As SymmetricAlgorithm

            If etype = EncryptType.AdvancedEncryptionStandard128 Then '←.Net Framework 3.5以上

                rijndael = New AesCryptoServiceProvider()

                rijndael.KeySize = 128

            ElseIf etype = EncryptType.AdvancedEncryptionStandard256 Then '←.Net Framework 3.5以上

                rijndael = New AesCryptoServiceProvider()

                rijndael.KeySize = 256

            ElseIf etype = EncryptType.DataEncryptionStandard Then

                rijndael = New DESCryptoServiceProvider()

            ElseIf etype = EncryptType.Rijndael Then

                rijndael = New RijndaelManaged()

            ElseIf etype = EncryptType.RivestisCipher2 Then

                rijndael = New RC2CryptoServiceProvider()

            ElseIf etype = EncryptType.TripleDES Then

                rijndael = New TripleDESCryptoServiceProvider()

            Else

                Throw New Exception("暗号化中にエラー" & vbLf & "暗号化タイプの未選択")

            End If

     

            '文字列をバイト型配列にする

            Dim bytesIn As Byte() = System.Text.Encoding.UTF8.GetBytes(pSourceString)

     

            'パスワードから共有キーと初期化ベクタを作成

            Dim key As Byte(), iv As Byte()

            gfp(password, rijndael.KeySize, key, rijndael.BlockSize, iv)

            rijndael.Key = key

            rijndael.IV = iv

            rijndael.Padding = PaddingMode.Zeros 'エラー対策:「パディングは無効なので、削除できません。」

     

     

            '暗号化されたデータを書き出すためのMemoryStream

            Dim msOut As New System.IO.MemoryStream

            '暗号化オブジェクトの作成

            Dim desencrypt As System.Security.Cryptography.ICryptoTransform = rijndael.CreateEncryptor()

     

            '書き込むためのCryptoStreamの作成

            Dim cryptStreem As New System.Security.Cryptography.CryptoStream( _

                msOut, desencrypt, _

                System.Security.Cryptography.CryptoStreamMode.Write)

     

            '書き込む

            cryptStreem.Write(bytesIn, 0, bytesIn.Length)

            cryptStreem.FlushFinalBlock()

            '暗号化されたデータを取得

            Dim bytesOut As Byte() = msOut.ToArray()

     

            '閉じる

            cryptStreem.Close()

            msOut.Close()

     

     

            'Base64で文字列に変更して結果を返す

            Return System.Convert.ToBase64String(bytesOut)

     

        End Function

     

     

        ' <summary>

        ' 文字列を復号化する

        ' </summary>

        ' <param name="pSourceString">復号化する文字列</param>

        ' <param name="password">暗号化に使用したパスワード</param>

        Shared Function DeEncryptString(ByVal pSourceString As String, _

                                    ByVal password As String, _

                                    Optional ByVal etype As EncryptType = EncryptType.AdvancedEncryptionStandard256)

            Dim rijndael As SymmetricAlgorithm

            If etype = EncryptType.AdvancedEncryptionStandard128 Then '←.Net Framework 3.5以上

                rijndael = New AesCryptoServiceProvider()

                rijndael.KeySize = 128

            ElseIf etype = EncryptType.AdvancedEncryptionStandard256 Then '←.Net Framework 3.5以上

                rijndael = New AesCryptoServiceProvider()

                rijndael.KeySize = 256

            ElseIf etype = EncryptType.DataEncryptionStandard Then

                rijndael = New DESCryptoServiceProvider()

            ElseIf etype = EncryptType.Rijndael Then

                rijndael = New RijndaelManaged()

            ElseIf etype = EncryptType.RivestisCipher2 Then

                rijndael = New RC2CryptoServiceProvider()

            ElseIf etype = EncryptType.TripleDES Then

                rijndael = New TripleDESCryptoServiceProvider()

            Else

                Throw New Exception("暗号化中にエラー" & vbLf & "暗号化タイプの未選択")

            End If

     

            'パスワードから共有キーと初期化ベクタを作成

            Dim key As Byte(), iv As Byte()

            gfp(password, rijndael.KeySize, key, rijndael.BlockSize, iv)

            rijndael.Key = key

            rijndael.IV = iv

            rijndael.Padding = PaddingMode.Zeros 'エラー対策:「パディングは無効なので、削除できません。」

     

            'Base64で文字列をバイト配列に戻す

            Dim bytesIn As Byte() = System.Convert.FromBase64String(pSourceString)

     

            '暗号化されたデータを読み込むためのMemoryStream

            Dim msIn As New System.IO.MemoryStream(bytesIn)

            '復号化オブジェクトの作成

            Dim desdecrypt As System.Security.Cryptography.ICryptoTransform = _

                rijndael.CreateDecryptor()

            '読み込むためのCryptoStreamの作成

            Dim cryptStreem As New System.Security.Cryptography.CryptoStream( _

                msIn, desdecrypt, _

                System.Security.Cryptography.CryptoStreamMode.Read)

     

            '復号化されたデータを取得するためのStreamReader

            Dim srOut As New System.IO.StreamReader(cryptStreem, System.Text.Encoding.UTF8)

            '復号化されたデータを取得する

            Dim result As String = srOut.ReadToEnd()

     

            '閉じる

            srOut.Close()

            cryptStreem.Close()

            msIn.Close()

     

            Return result

        End Function

     

    End Class

     



    【転載元】http://ameblo.jp/sdw7/entry-11026149730.html

    上記URLのC#ロジックをVB.NETに変換して、微調整させて頂きました。


    トラックバック

    コメントの投稿

    非公開コメント

    PR
    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。