2008年6月13日金曜日

.NET 文字列を暗号化するには?(DES暗号化)

System.Security.Cryptography.DESCryptoServiceProvider クラスを使用し、DES (Data Encryption Standard) アルゴリズムにより文字列の暗号化、復号化を行います。

''' <summary>
''' 文字列を暗号化します。
''' </summary>
''' <param name="value">暗号化する文字列</param>
''' <param name="key">暗号キー</param>
''' <returns>暗号化後の文字列</returns>
''' <remarks></remarks>
Public Shared Function Encrypt(ByVal value As String, ByVal key As String) As String

'キーをバイト型配にし、8バイトにリサイズします。
Dim bKey As Byte() = System.Text.Encoding.UTF8.GetBytes(key)
Array.Resize(bKey, 8)

'DES暗号化プロバイダオブジェクトを作成します。
Dim des As New System.Security.Cryptography.DESCryptoServiceProvider
des.Key = bKey
des.IV = bKey

'暗号化されたデータを書き出すためのメモリーストリームオブジェクトを作成します。
Using memStream As New System.IO.MemoryStream()

'データ ストリームを暗号変換にリンクするストリームを定義します。 
Using cryptStream As New System.Security.Cryptography.CryptoStream( _
memStream, des.CreateEncryptor, _
System.Security.Cryptography.CryptoStreamMode.Write)

'書き込むためのストリームライターを作成します。
Using sw As New System.IO.StreamWriter(cryptStream)

'暗号化前の文字列を書き込みます。
sw.WriteLine(value)

sw.Close()
cryptStream.Close()
End Using 'sw
End Using 'cryptStream

'メモリーストリームから暗号化後のバイト配列を取得します。
Dim bRet As Byte() = memStream.ToArray()

memStream.Close()

'Base64で文字列に変更し返します。
Return System.Convert.ToBase64String(bRet)

End Using 'memStream

End Function

''' <summary>
''' 文字列を復号化します。
''' </summary>
''' <param name="value">復号化する文字列</param>
''' <param name="key">暗号キー</param>
''' <returns>復号化後の文字列</returns>
''' <remarks></remarks>
Public Shared Function Decrypt(ByVal value As String, ByVal key As String) As String

'キーをバイト型配にし、8バイトにリサイズします。
Dim bKey As Byte() = System.Text.Encoding.UTF8.GetBytes(key)
Array.Resize(bKey, 8)

'DES暗号化プロバイダオブジェクトを作成します。
Dim des As New System.Security.Cryptography.DESCryptoServiceProvider
des.Key = bKey
des.IV = bKey

'Base64で文字列をバイト配列に戻します。
Dim bValue As Byte() = System.Convert.FromBase64String(value)

'暗号化されたデータを読み込むためのメモリーストリームオブジェクトを作成します。
Using memStream As New System.IO.MemoryStream(bValue)

'データ ストリームを暗号変換にリンクするストリームを定義します。 
Using cryptStream As New System.Security.Cryptography.CryptoStream( _
memStream, des.CreateDecryptor, _
System.Security.Cryptography.CryptoStreamMode.Read)

'読み込むためのストリームリーダーオブジェクトを作成します。
Using sr As New System.IO.StreamReader(cryptStream, _
System.Text.Encoding.UTF8)

'メモリーストリームから復号化後のバイト配列を取得します。
Dim vRet As String = sr.ReadLine

'ストリームを閉じます。
sr.Close()
cryptStream.Close()
memStream.Close()

Return vRet

End Using
End Using 'cryptStream

End Using 'memStream
End Function




他にもSystem.Security.Cryptography名前空間には暗号化複号化を行うクラスとして、以下のものがあります。いずれも使い方はほとんど同じです。


  • DESCryptoServiceProvider
  • RC2CryptoServiceProvider
  • RijndaelManaged
  • TripleDESCryptoServiceProvider

0 件のコメント: