┏第17号━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ .NETプログラミング研究 ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜メニュー
■.NET Tips
・秘密鍵暗号方式による暗号化
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜メニュー
───────────────────────────────
■.NET Tips
───────────────────────────────
●秘密鍵暗号方式による暗号化
ここでは共有キー暗号方式 (対称暗号化方式、秘密鍵暗号方式)による
暗号化、復号化について説明します。共有キー暗号方式では、単一の
共有キーを使用してデータの暗号化と復号化が行われます。「秘密鍵
暗号システム」に関して「アスキー デジタル用語辞典」
(http://yougo.ascii24.com/)では次のように説明されています。
「暗号システムにおいて、暗号化に使用する鍵と復号化に使用する鍵
が同じもののこと。従来の暗号システムはほとんどすべてがこれに相
当するため、慣用暗号システムとも呼ばれる。鍵が1種類しかないた
め、暗号化に使用した鍵を、通信路とは別の安全な手段を使って、通
信相手に届けておく必要がある。」
ファイルを暗号化する方法は「マイクロソフト サポート技術情報
- 307010」にて詳しく説明されています。
・マイクロソフト サポート技術情報 - 307010
http://support.microsoft.com/default.aspx?scid=kb;ja;307010
ただしこのサンプルには2つの欠点があります。パスワードを必ず8バ
イトにする必要がある点と、暗号化されるファイルがUTF-8エンコーデ
ィングである必要がある(復号化の時、元のファイルがUTF-8として読
み込み、UTF-8で出力している)という点です。
これではほとんど役に立たないので、この2点を修正したものを書いて
みました。共有キー(秘密キー)と初期化ベクタは、与えられたパス
ワードが何バイトであるかにかかわらず、適切なバイト数に調節して
設定しています。また、暗号化するファイルのエンコーディングは
Shift JISとしています。
//[C#]・・・・・・・・・・・・・・・・・・・・・・・・・・・・
///
/// ファイルを暗号化する
///
///
/// 暗号化されたファイルは"(ファイル名).enc"として保存される
///
/// 暗号化するファイル名
/// パスワード
public static void EncryptFile(string fileName, string key)
{
//暗号化するファイルを読み込む
System.IO.FileStream fsIn =
new System.IO.FileStream(fileName,
System.IO.FileMode.Open, System.IO.FileAccess.Read);
//すべて読み込む
byte[] bytesIn = new byte[fsIn.Length];
fsIn.Read(bytesIn, 0, bytesIn.Length);
//閉じる
fsIn.Close();
//DESCryptoServiceProviderオブジェクトの作成
System.Security.Cryptography.DESCryptoServiceProvider des =
new System.Security.Cryptography.DESCryptoServiceProvider();
//共有キーと初期化ベクタを決定
//パスワードをバイト配列にする
byte[] bytesKey = System.Text.Encoding.UTF8.GetBytes(key);
//共有キーと初期化ベクタを設定
des.Key = ResizeBytesArray(bytesKey, des.Key.Length);
des.IV = ResizeBytesArray(bytesKey, des.IV.Length);
//暗号化されたファイルの保存先
string outFileName = fileName + ".enc";
//暗号化されたファイルを書き出すためのFileStream
System.IO.FileStream fsOut =
new System.IO.FileStream(outFileName,
System.IO.FileMode.Create, System.IO.FileAccess.Write);
//DES暗号化オブジェクトの作成
System.Security.Cryptography.ICryptoTransform desdecrypt =
des.CreateEncryptor();
//書き込むためのCryptoStreamの作成
System.Security.Cryptography.CryptoStream cryptStreem =
new System.Security.Cryptography.CryptoStream(fsOut,
desdecrypt,
System.Security.Cryptography.CryptoStreamMode.Write);
//書き込む
cryptStreem.Write(bytesIn, 0, bytesIn.Length);
//閉じる
cryptStreem.Close();
fsOut.Close();
}
///
/// ファイルを復号化する
///
/// 復号化するファイル名
/// パスワード
public static void DecryptFile(string fileName, string key)
{
//DESCryptoServiceProviderオブジェクトの作成
System.Security.Cryptography.DESCryptoServiceProvider des =
new System.Security.Cryptography.DESCryptoServiceProvider();
//共有キーと初期化ベクタを決定
//パスワードをバイト配列にする
byte[] bytesKey = System.Text.Encoding.UTF8.GetBytes(key);
//共有キーと初期化ベクタを設定
des.Key = ResizeBytesArray(bytesKey, des.Key.Length);
des.IV = ResizeBytesArray(bytesKey, des.IV.Length);
//暗号化されたファイルを読み込むためのFileStream
System.IO.FileStream fsIn =
new System.IO.FileStream(fileName,
System.IO.FileMode.Open, System.IO.FileAccess.Read);
//DES復号化オブジェクトの作成
System.Security.Cryptography.ICryptoTransform desdecrypt =
des.CreateDecryptor();
//読み込むためのCryptoStreamの作成
System.Security.Cryptography.CryptoStream cryptStreem =
new System.Security.Cryptography.CryptoStream(fsIn,
desdecrypt,
System.Security.Cryptography.CryptoStreamMode.Read);
//復号化されたファイルの保存先
string outFileName;
if (fileName.ToLower().EndsWith(".enc"))
outFileName = fileName.Substring(0, fileName.Length - 4);
else
outFileName = fileName + ".dec";
//復号化されたデータを書き出すためのStreamWriter
System.IO.StreamWriter sw =
new System.IO.StreamWriter(outFileName, false,
System.Text.Encoding.GetEncoding("sjis"));
//復号化されたデータを読み込む
System.IO.StreamReader sr =
new System.IO.StreamReader(cryptStreem,
System.Text.Encoding.GetEncoding("sjis"));
//復号化されたデータを書き出す
sw.Write(sr.ReadToEnd());
sw.Flush();
//閉じる
sr.Close();
sw.Close();
cryptStreem.Close();
fsIn.Close();
}
///
/// 共有キー用に、バイト配列のサイズを変更する
///
/// サイズを変更するバイト配列
/// バイト配列の新しい大きさ
/// サイズが変更されたバイト配列
private static byte[] ResizeBytesArray(byte[] bytes, int newSize)
{
byte[] newBytes = new byte[newSize];
if (bytes.Length < newSize)
{
for (int i = 0; i < bytes.Length; i++)
newBytes[i] = bytes[i];
}
else
{
int pos = 0;
for (int i = newSize; i < bytes.Length; i++)
{
newBytes[pos++] ^= bytes[i];
if (pos >= newBytes.Length)
pos = 0;
}
}
return newBytes;
}
//・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
'[VB.NET]・・・・・・・・・・・・・・・・・・・・・・・・・・
'C#のコードを'C# to VB.NET Translator'で変換し、修正したコードです
'http://www.aspalliance.com/aldotnet/examples/translate.aspx
'
'/
'/ ファイルを暗号化する
'/
'/
'/ 暗号化されたファイルは"(ファイル名).enc"として保存される
'/
'/ 暗号化するファイル名
'/ パスワード
Public Shared Sub EncryptFile(ByVal fileName As String, _
ByVal key As String)
'暗号化するファイルを読み込む
Dim fsIn As New System.IO.FileStream(fileName, _
System.IO.FileMode.Open, System.IO.FileAccess.Read)
'すべて読み込む
Dim bytesIn(fsIn.Length) As Byte
fsIn.Read(bytesIn, 0, bytesIn.Length)
'閉じる
fsIn.Close()
'DESCryptoServiceProviderオブジェクトの作成
Dim des As New System.Security.Cryptography.DESCryptoServiceProvider
'共有キーと初期化ベクタを決定
'パスワードをバイト配列にする
Dim bytesKey As Byte() = System.Text.Encoding.UTF8.GetBytes(key)
'共有キーと初期化ベクタを設定
des.Key = ResizeBytesArray(bytesKey, des.Key.Length)
des.IV = ResizeBytesArray(bytesKey, des.IV.Length)
'暗号化されたファイルの保存先
Dim outFileName As String = fileName + ".enc"
'暗号化されたファイルを書き出すためのFileStream
Dim fsOut As New System.IO.FileStream(outFileName, _
System.IO.FileMode.Create, System.IO.FileAccess.Write)
'DES暗号化オブジェクトの作成
Dim desdecrypt As System.Security.Cryptography.ICryptoTransform = _
des.CreateEncryptor()
'書き込むためのCryptoStreamの作成
Dim cryptStreem As New System.Security.Cryptography.CryptoStream( _
fsOut, desdecrypt, _
System.Security.Cryptography.CryptoStreamMode.Write)
'書き込む
cryptStreem.Write(bytesIn, 0, bytesIn.Length)
'閉じる
cryptStreem.Close()
fsOut.Close()
End Sub
'/
'/ ファイルを復号化する
'/
'/ 復号化するファイル名
'/ パスワード
Public Shared Sub DecryptFile(ByVal fileName As String, _
ByVal key As String)
'DESCryptoServiceProviderオブジェクトの作成
Dim des As New System.Security.Cryptography.DESCryptoServiceProvider
'共有キーと初期化ベクタを決定
'パスワードをバイト配列にする
Dim bytesKey As Byte() = System.Text.Encoding.UTF8.GetBytes(key)
'共有キーと初期化ベクタを設定
des.Key = ResizeBytesArray(bytesKey, des.Key.Length)
des.IV = ResizeBytesArray(bytesKey, des.IV.Length)
'暗号化されたファイルを読み込むためのFileStream
Dim fsIn As New System.IO.FileStream(fileName, _
System.IO.FileMode.Open, System.IO.FileAccess.Read)
'DES復号化オブジェクトの作成
Dim desdecrypt As System.Security.Cryptography.ICryptoTransform = _
des.CreateDecryptor()
'読み込むためのCryptoStreamの作成
Dim cryptStreem As New System.Security.Cryptography.CryptoStream( _
fsIn, desdecrypt, _
System.Security.Cryptography.CryptoStreamMode.Read)
'復号化されたファイルの保存先
Dim outFileName As String
If fileName.ToLower().EndsWith(".enc") Then
outFileName = fileName.Substring(0, fileName.Length - 4)
Else
outFileName = fileName + ".dec"
End If
'復号化されたデータを書き出すためのStreamWriter
Dim sw As New System.IO.StreamWriter( _
outFileName, False, System.Text.Encoding.GetEncoding("sjis"))
'復号化されたデータを読み込む
Dim sr As New System.IO.StreamReader( _
cryptStreem, System.Text.Encoding.GetEncoding("sjis"))
'復号化されたデータを書き出す
sw.Write(sr.ReadToEnd())
sw.Flush()
'閉じる
sr.Close()
sw.Close()
cryptStreem.Close()
fsIn.Close()
End Sub
'/
'/ 共有キー用に、バイト配列のサイズを変更する
'/
'/ サイズを変更するバイト配列
'/ バイト配列の新しい大きさ
'/ サイズが変更されたバイト配列
Private Shared Function ResizeBytesArray(ByVal bytes() As Byte, _
ByVal newSize As Integer) As Byte()
Dim newBytes(newSize - 1) As Byte
If bytes.Length < newSize Then
Dim i As Integer
For i = 0 To bytes.Length - 1
newBytes(i) = bytes(i)
Next i
Else
Dim pos As Integer = 0
Dim i As Integer
For i = newSize To bytes.Length - 1
newBytes(pos) = newBytes(pos) Xor bytes(i)
pos += 1
If pos >= newBytes.Length Then
pos = 0
End If
Next i
End If
Return newBytes
End Function 'ResizeBytesArray
'・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
上記の例では、共有キーと初期化ベクタを決定するために、与えられ
たパスワード(パスワードをバイト型配列に変換したもの)が短けれ
ば残りを0で埋め、長ければ切り詰めるようにしています。切り詰め方
としては単にカットするのではなく(そのようにしているサンプルも
多いようですが、こうしてしまうとパスワードのはじめ数文字があっ
ていればOKとなってしまう)、切り詰める部分をXORで合成しています
(果たしてこれがよい方法であるかは分かりませんが)。また、共有
キーと初期化ベクタのサイズの決定は、DESCryptoServiceProviderの
KeyとIVプロパティで取得されるバイト配列の大きさと同じとしていま
すが、DESCryptoServiceProvider.LegalKeySizesやLegalBlockSizesプ
ロパティを調べて決めた方がよりよいでしょう。
上記の方法では暗号化されるファイルはShift JISである必要がありま
すが、DecryptFileを次のように変えることにより、どんなファイルで
も暗号化、復号化できるようになるでしょう。
//[C#]・・・・・・・・・・・・・・・・・・・・・・・・・・・・
///
/// ファイルを復号化する
///
/// 復号化するファイル名
/// パスワード
public static void DecryptFile(string fileName, string key)
{
//DESCryptoServiceProviderオブジェクトの作成
System.Security.Cryptography.DESCryptoServiceProvider des =
new System.Security.Cryptography.DESCryptoServiceProvider();
//共有キーと初期化ベクタを決定
//パスワードをバイト配列にする
byte[] bytesKey = System.Text.Encoding.UTF8.GetBytes(key);
//共有キーと初期化ベクタを設定
des.Key = ResizeBytesArray(bytesKey, des.Key.Length);
des.IV = ResizeBytesArray(bytesKey, des.IV.Length);
//暗号化されたファイルを読み込むためのFileStream
System.IO.FileStream fsIn =
new System.IO.FileStream(fileName,
System.IO.FileMode.Open, System.IO.FileAccess.Read);
//DES復号化オブジェクトの作成
System.Security.Cryptography.ICryptoTransform desdecrypt =
des.CreateDecryptor();
//読み込むためのCryptoStreamの作成
System.Security.Cryptography.CryptoStream cryptStreem =
new System.Security.Cryptography.CryptoStream(fsIn,
desdecrypt,
System.Security.Cryptography.CryptoStreamMode.Read);
//復号化されたファイルの保存先
string outFileName;
if (fileName.ToLower().EndsWith(".enc"))
outFileName = fileName.Substring(0, fileName.Length - 4);
else
outFileName = fileName + ".dec";
//復号化されたファイルを書き出すためのFileStream
System.IO.FileStream fsOut =
new System.IO.FileStream(outFileName,
System.IO.FileMode.Create, System.IO.FileAccess.Write);
//復号化されたデータを書き出す
byte[] bs = new byte[256];
int readLen;
while ((readLen = cryptStreem.Read(bs, 0, bs.Length)) > 0)
fsOut.Write(bs, 0, readLen);
//閉じる
cryptStreem.Close();
fsIn.Close();
fsOut.Close();
}
//・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
'[VB.NET]・・・・・・・・・・・・・・・・・・・・・・・・・・
'C#のコードを'C# to VB.NET Translator'で変換し、修正したコードです
'http://www.aspalliance.com/aldotnet/examples/translate.aspx
'
'/
'/ ファイルを復号化する
'/
'/ 復号化するファイル名
'/ パスワード
Public Shared Sub DecryptFile(ByVal fileName As String, _
ByVal key As String)
'DESCryptoServiceProviderオブジェクトの作成
Dim des As New System.Security.Cryptography.DESCryptoServiceProvider
'共有キーと初期化ベクタを決定
'パスワードをバイト配列にする
Dim bytesKey As Byte() = System.Text.Encoding.UTF8.GetBytes(key)
'共有キーと初期化ベクタを設定
des.Key = ResizeBytesArray(bytesKey, des.Key.Length)
des.IV = ResizeBytesArray(bytesKey, des.IV.Length)
'暗号化されたファイルを読み込むためのFileStream
Dim fsIn As New System.IO.FileStream(fileName, _
System.IO.FileMode.Open, System.IO.FileAccess.Read)
'DES復号化オブジェクトの作成
Dim desdecrypt As System.Security.Cryptography.ICryptoTransform = _
des.CreateDecryptor()
'読み込むためのCryptoStreamの作成
Dim cryptStreem As New System.Security.Cryptography.CryptoStream( _
fsIn, desdecrypt, _
System.Security.Cryptography.CryptoStreamMode.Read)
'復号化されたファイルの保存先
Dim outFileName As String
If fileName.ToLower().EndsWith(".enc") Then
outFileName = fileName.Substring(0, fileName.Length - 4)
Else
outFileName = fileName + ".dec"
End If '復号化されたファイルを書き出すためのFileStream
Dim fsOut As New System.IO.FileStream(outFileName, _
System.IO.FileMode.Create, System.IO.FileAccess.Write)
'復号化されたデータを書き出す
Dim bs(255) As Byte
Dim readLen As Integer
Do
readLen = cryptStreem.Read(bs, 0, bs.Length)
If readLen > 0 Then
fsOut.Write(bs, 0, readLen)
End If
Loop While (readLen > 0)
'閉じる
cryptStreem.Close()
fsIn.Close()
fsOut.Close()
End Sub 'DecryptFile
'・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
ここでは、DESCryptoServiceProvider クラスを使用し、DES (Data
Encryption Standard) アルゴリズムによる暗号化、復号化の例を示し
ましたが、.NET Framework では、共有キー暗号化アルゴリズムを実装
するクラスとして、他にも3つ用意されています(
RC2CryptoServiceProvider , RijndaelManaged ,
TripleDESCryptoServiceProvider)。使い方はDESCryptoServiceProvider
と全く同じですので、上記の例の"DESCryptoServiceProvider"を適当なクラス
名で置き換えるだけでも動くでしょう。
次にファイルではなく、文字列を暗号化する方法を紹介します。
上記の方法では、ファイルから読み込んだデータを暗号化し、ファイ
ルに書き込んでいるため、CryptoStreamオブジェクトを作成する際に、
暗号化の対象とするストリームとしてFileStreamオブジェクトを使用
しましたが、ここではMemoryStreamオブジェクトを使用することにし
ます。
//[C#]・・・・・・・・・・・・・・・・・・・・・・・・・・・・
///
/// 文字列を暗号化する
///
/// 暗号化する文字列
/// パスワード
/// 暗号化された文字列
public static string EncryptString(string str, string key)
{
//文字列をバイト型配列にする
byte[] bytesIn = System.Text.Encoding.UTF8.GetBytes(str);
//DESCryptoServiceProviderオブジェクトの作成
System.Security.Cryptography.DESCryptoServiceProvider des =
new System.Security.Cryptography.DESCryptoServiceProvider();
//共有キーと初期化ベクタを決定
//パスワードをバイト配列にする
byte[] bytesKey = System.Text.Encoding.UTF8.GetBytes(key);
//共有キーと初期化ベクタを設定
des.Key = ResizeBytesArray(bytesKey, des.Key.Length);
des.IV = ResizeBytesArray(bytesKey, des.IV.Length);
//暗号化されたデータを書き出すためのMemoryStream
System.IO.MemoryStream msOut = new System.IO.MemoryStream();
//DES暗号化オブジェクトの作成
System.Security.Cryptography.ICryptoTransform desdecrypt =
des.CreateEncryptor();
//書き込むためのCryptoStreamの作成
System.Security.Cryptography.CryptoStream cryptStreem =
new System.Security.Cryptography.CryptoStream(msOut,
desdecrypt,
System.Security.Cryptography.CryptoStreamMode.Write);
//書き込む
cryptStreem.Write(bytesIn, 0, bytesIn.Length);
cryptStreem.FlushFinalBlock();
//暗号化されたデータを取得
byte[] bytesOut = msOut.ToArray();
//閉じる
cryptStreem.Close();
msOut.Close();
//Base64で文字列に変更して結果を返す
return System.Convert.ToBase64String(bytesOut);
}
///
/// 暗号化された文字列を復号化する
///
/// 暗号化された文字列
/// パスワード
/// 復号化された文字列
public static string DecryptString(string str, string key)
{
//DESCryptoServiceProviderオブジェクトの作成
System.Security.Cryptography.DESCryptoServiceProvider des =
new System.Security.Cryptography.DESCryptoServiceProvider();
//共有キーと初期化ベクタを決定
//パスワードをバイト配列にする
byte[] bytesKey = System.Text.Encoding.UTF8.GetBytes(key);
//共有キーと初期化ベクタを設定
des.Key = ResizeBytesArray(bytesKey, des.Key.Length);
des.IV = ResizeBytesArray(bytesKey, des.IV.Length);
//Base64で文字列をバイト配列に戻す
byte[] bytesIn = System.Convert.FromBase64String(str);
//暗号化されたデータを読み込むためのMemoryStream
System.IO.MemoryStream msIn =
new System.IO.MemoryStream(bytesIn);
//DES復号化オブジェクトの作成
System.Security.Cryptography.ICryptoTransform desdecrypt =
des.CreateDecryptor();
//読み込むためのCryptoStreamの作成
System.Security.Cryptography.CryptoStream cryptStreem =
new System.Security.Cryptography.CryptoStream(msIn,
desdecrypt,
System.Security.Cryptography.CryptoStreamMode.Read);
//復号化されたデータを取得するためのStreamReader
System.IO.StreamReader srOut =
new System.IO.StreamReader(cryptStreem,
System.Text.Encoding.UTF8);
//復号化されたデータを取得する
string result = srOut.ReadToEnd();
//閉じる
srOut.Close();
cryptStreem.Close();
msIn.Close();
return result;
}
///
/// 共有キー用に、バイト配列のサイズを変更する
///
/// サイズを変更するバイト配列
/// バイト配列の新しい大きさ
/// サイズが変更されたバイト配列
private static byte[] ResizeBytesArray(byte[] bytes, int newSize)
{
byte[] newBytes = new byte[newSize];
if (bytes.Length < newSize)
{
for (int i = 0; i < bytes.Length; i++)
newBytes[i] = bytes[i];
}
else
{
int pos = 0;
for (int i = newSize; i < bytes.Length; i++)
{
newBytes[pos++] ^= bytes[i];
if (pos >= newBytes.Length)
pos = 0;
}
}
return newBytes;
}
//・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
'[VB.NET]・・・・・・・・・・・・・・・・・・・・・・・・・・
'C#のコードを'C# to VB.NET Translator'で変換し、修正したコードです
'http://www.aspalliance.com/aldotnet/examples/translate.aspx
'
'/
'/ 文字列を暗号化する
'/
'/ 暗号化する文字列
'/ パスワード
'/ 暗号化された文字列
Public Shared Function EncryptString(ByVal str As String, _
ByVal key As String) As String
'文字列をバイト型配列にする
Dim bytesIn As Byte() = System.Text.Encoding.UTF8.GetBytes(str)
'DESCryptoServiceProviderオブジェクトの作成
Dim des As New System.Security.Cryptography.DESCryptoServiceProvider
'共有キーと初期化ベクタを決定
'パスワードをバイト配列にする
Dim bytesKey As Byte() = System.Text.Encoding.UTF8.GetBytes(key)
'共有キーと初期化ベクタを設定
des.Key = ResizeBytesArray(bytesKey, des.Key.Length)
des.IV = ResizeBytesArray(bytesKey, des.IV.Length)
'暗号化されたデータを書き出すためのMemoryStream
Dim msOut As New System.IO.MemoryStream
'DES暗号化オブジェクトの作成
Dim desdecrypt As System.Security.Cryptography.ICryptoTransform = _
des.CreateEncryptor()
'書き込むためのCryptoStreamの作成
Dim cryptStreem As New System.Security.Cryptography.CryptoStream( _
msOut, desdecrypt, _
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 'EncryptString
'/
'/ 暗号化された文字列を復号化する
'/
'/ 暗号化された文字列
'/ パスワード
'/ 復号化された文字列
Public Shared Function DecryptString(ByVal str As String, _
ByVal key As String) As String
'DESCryptoServiceProviderオブジェクトの作成
Dim des As New System.Security.Cryptography.DESCryptoServiceProvider
'共有キーと初期化ベクタを決定
'パスワードをバイト配列にする
Dim bytesKey As Byte() = System.Text.Encoding.UTF8.GetBytes(key)
'共有キーと初期化ベクタを設定
des.Key = ResizeBytesArray(bytesKey, des.Key.Length)
des.IV = ResizeBytesArray(bytesKey, des.IV.Length)
'Base64で文字列をバイト配列に戻す
Dim bytesIn As Byte() = System.Convert.FromBase64String(str)
'暗号化されたデータを読み込むためのMemoryStream
Dim msIn As New System.IO.MemoryStream(bytesIn)
'DES復号化オブジェクトの作成
Dim desdecrypt As System.Security.Cryptography.ICryptoTransform = _
des.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 'DecryptString
'/
'/ 共有キー用に、バイト配列のサイズを変更する
'/
'/ サイズを変更するバイト配列
'/ バイト配列の新しい大きさ
'/ サイズが変更されたバイト配列
Private Shared Function ResizeBytesArray(ByVal bytes() As Byte, _
ByVal newSize As Integer) As Byte()
Dim newBytes(newSize - 1) As Byte
If bytes.Length < newSize Then
Dim i As Integer
For i = 0 To bytes.Length - 1
newBytes(i) = bytes(i)
Next i
Else
Dim pos As Integer = 0
Dim i As Integer
For i = newSize To bytes.Length - 1
newBytes(pos) = newBytes(pos) Xor bytes(i)
pos += 1
If pos >= newBytes.Length Then
pos = 0
End If
Next i
End If
Return newBytes
End Function 'ResizeBytesArray
'・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
・どぼん!の.NET Tips - ファイルを暗号化する
http://dobon.net/vb/dotnet/string/encryptfile.html
・どぼん!の.NET Tips - 文字列を暗号化する
http://dobon.net/vb/dotnet/string/encryptstring.html
===============================
■このマガジンの購読、購読中止、バックナンバー、説明に関しては
次のページをご覧ください。
http://www.mag2.com/m/0000104516.htm
■発行人・編集人:どぼん!
http://dobon.net
dobon@bigfoot.com
■ご質問等はメールではなく、掲示板へお願いいたします。
http://dobon.net/vb/bbs.html
■上記メールアドレスへのメールは確実に読まれる保障はありません
(スパム、ウィルス対策です)。メールは下記URLのフォームメール
から送信してください。
http://dobon.net/mail.html
Copyright (c) 2003 DOBON! All rights reserved.
===============================