2009-08-25 9 views
1

別の文字列をキーとしてVB.netのテキスト(文字列形式)を暗号化/復号化する方法はありますか?つまり、あるユーザーがこのキーを使用して暗号化すると、他のユーザーは同じキーを使用して解読する必要がありますか?文字列をキーとして使用するvb.netの安全な(ish)暗号化/復号化アルゴリズム

私は、パブリックキーとプライベートキーの暗号化または何かの種類のものではありません。

誰かが私の手助けをしてくれますか?

公開鍵/秘密鍵を使用せずにデータを暗号化/復号化するための第2の方法は何ですか?

メッセージを安全に送信する簡単な方法を作りたいと思います。

ありがとうございました!

答えて

4

前述の回答で説明したように、対称アルゴリズム(暗号化と復号化に単一の秘密鍵が使用される)が有効です。私はDESアルゴリズムの使い方を手にしています。この暗号化ルーチンは、バイト配列(フレームワーク暗号化クラスの '自然な'出力)ではなく、暗号化プロセスの出力を返します(また復号化は入力として)。

Private key() As Byte = {} 
Private IV() As Byte = {&H12, &H34, &H56, &H78, &H90, &HAB, &HCD, &HEF} 
Private Const EncryptionKey As String = "abcdefgh" 
Public Function Decrypt(ByVal stringToDecrypt As String) As String 
    Try 
     Dim inputByteArray(stringToDecrypt.Length) As Byte 
     key = System.Text.Encoding.UTF8.GetBytes(Left(EncryptionKey, 8)) 
     Dim des As New DESCryptoServiceProvider 
     inputByteArray = Convert.FromBase64String(stringToDecrypt) 
     Dim ms As New MemoryStream 
     Dim cs As New CryptoStream(ms, des.CreateDecryptor(key, IV), CryptoStreamMode.Write) 
     cs.Write(inputByteArray, 0, inputByteArray.Length) 
     cs.FlushFinalBlock() 
     Dim encoding As System.Text.Encoding = System.Text.Encoding.UTF8 
     Return encoding.GetString(ms.ToArray()) 
    Catch ex As Exception 
     'oops - add your exception logic 
    End Try 
End Function 

Public Function Encrypt(ByVal stringToEncrypt As String) As String 
    Try 
     key = System.Text.Encoding.UTF8.GetBytes(Left(EncryptionKey, 8)) 
     Dim des As New DESCryptoServiceProvider 
     Dim inputByteArray() As Byte = Encoding.UTF8.GetBytes(stringToEncrypt) 
     Dim ms As New MemoryStream 
     Dim cs As New CryptoStream(ms, des.CreateEncryptor(key, IV), CryptoStreamMode.Write) 
     cs.Write(inputByteArray, 0, inputByteArray.Length) 
     cs.FlushFinalBlock() 
     Return Convert.ToBase64String(ms.ToArray()) 
    Catch ex As Exception 
     'oops - add your exception logic 
    End Try 
End Function 

編集追加する:
ここで私は、そのモジュールを持っているインポートは、次のとおり

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

DES鍵の長さが56ビット(8バイトまたは文字のちょうど短い)であります。最近、非常に安全だとは考えられていませんが(this Wikipedia article on key sizes参照)、「安全なアイ」と書いてあるように、大丈夫です。より安全な暗号化が必要な場合は、より安全なアルゴリズムを使用して調査する必要があります。

上記のルーチンの暗号化キーは、プライベート定数EncryptionKeyにあります。その値を目的のキーに変更します。または、独自のキー管理(ファイルからの入力、ユーザーへの問い合わせなど)を実装することもできます。

LeftとConvertが壊れている理由がわかりません。 LeftはMicrosoft.VisualBasic.Stringsのメンバーで、ConvertはSystemのメンバーです。

Remus Rusanuにリンクされている記事やそれらからリンクされている記事を読むことを強くお勧めします。彼らはフレームワーククラスの暗号化に関する多くの背景をあなたに提供します。

+0

さて、これらの機能はどうやって使うのですか?私はまだ少し混乱しています。その暗号化( "Somestringhere")と復号化( "somestringhere")?その鍵を変更することはできますか? ありがとうございます、このように見えます! – Cyclone

+0

キーの長さはどのくらいですか? – Cyclone

+0

Err、ここではネームスペースを明確にインポートする必要があります。何をインポートしますか? – Cyclone

1

MSDNには、対称キー(これはあなたが望むもの)でデータを暗号化および復号化する方法に関するいくつかのサンプルがあります。使用するのが最も簡単なのはCryptoStreamです。通常のメモリストリームまたはファイルストリームの上に暗号ストリームを作成し、暗号ストリームに書き込み、暗号化されたデータをメモリ/ファイルストリームに書き込み、暗号化を解除することができますストリームを暗号化された文字列(メモリストリーム)またはファイルストリームにコピーし、暗号化されたストリームから暗号化されたデータを読み取る:Encrypting DataおよびDecrypting Data

もう1つのサンプルは、ストリームヘルパーの整備なしに、対称キーの基本的な使用を示す例です。

+0

Err、あなたがちょうど言ったことはありません。対称キーはどういう意味ですか?それは単なる文字列ですか?それは対称でなければなりませんか? – Cyclone

0

以下のコードは、簡単なxor演算文(exclusiveまたは)を使用してパスワード付きのデータ文字列を暗号化/復号化します。

'datain = data to be encrypted 
'password is string to encrypt datain 
' 
'passwprd pointer to start 
kep= 0 
'len of data to be encrypted 
d = Len(datain$) 
'ddataout$ is encrypted string 
dataout$="" 
For n = 1 To d 
    kep=kep+1     : 'point to password location 
    i$ = Mid(password$, kep, 1) : 'get character from password 
    p = Asc(i$)     : 'convert character to integer 
    x$= Mid(datain$,n,1)  : 'get character from datain 
    h = Asc(x$)     : 'convert character to integer 
    f = h Xor p     : 'xor the two values and put result in integer 
    o$ = Chr(f)     : 'convert integer back to character 
    dataout$ = dataout$ + o$ 
    If kep = Len(password$) Then 
     kep = 0     : 'reset password pointer to first character 
    End If 
Next n 
' output string dataout$ contains encrypted data 

'dataout = data to be dencrypted 
'password is string to dencrypt datain 
' 
'passwprd pointer set to start 
kep= 0 
'len of data to be encrypted 
d = Len(dataout$) 
'ddataout$ is encrypted string 
datain$="" 
For n = 1 To d 
    kep=kep+1     : ' point to password location 
    i$ = Mid(password$, kep, 1) : 'get character from password 
    p = Asc(i$)     : ' convert character to integer 
    x$= Mid(dataout$,n,1)  : ' get character from dataout 
    h = Asc(x$)     : 'convert character to integer 
    f = h Xor p     :' xor the two values and put result in integer 
    o$ = Chr(f)     :' convert integer back to character 
    datain$ = datain$ + o$  : ' built datain string 
    If kep = Len(password$) Then 
     kep = 0     : 'reset password pointer to first character 
    End If 
Next n 
'output string datain$ contains decrypted data 
関連する問題