2016-03-22 5 views
2

私は多くの異なるC#暗号化の例を見てきました。ほとんどの例では、暗号化キーと初期化ベクトル(IV)がバイト配列として暗号化/復号化メソッドに渡されます。暗号化キーとIVを文字列として保存/変換する

私はキーとIVを文字列として保存したいと思います。ハードウェアセキュリティモジュールのキーとSQL ServerデータベースのnvarcharとしてのIV

キーとIVを文字列として正しく変換する方法については、私は悩み続けています。いくつかの例ではBase64エンコーディングを使用すると言い、他の例ではEncoding.UTF8を使用しています。私は、暗号化方式にIVのこの文字列表現を渡し、その後に戻ってそれを変換するときにここで

は、しかし...

using (var aesProvider = new AesCryptoServiceProvider()) 
{ 
    aesProvider.GenerateIV(); 
    var ivBase64 = Convert.ToBase64String(aesProvider.IV); 
    return ivBase64; 
} 

IVを生成し、Base64文字列に変換例です。バイト配列は、IVが適切なサイズではないことを示す次のコードは失敗します。

byte[] initVectorBytes = Encoding.UTF8.GetBytes(initializationVector);` 
// intermediate code excluded for brevity 
ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes); 

暗号化キーとIVをバイト配列と文字列表現の間で前後に変換する標準的な方法はありますか?

+2

[これは、暗号化で最高の答えです](http://stackoverflow.com/a/10366194/542251)私が見つけました。私は基本的にこのコードを使っています。それは文字列を受け入れる – Liam

+0

@ Liam - すばらしい例をありがとう!どのコード例を使用していますか?束がリストされています。 – webworm

+0

それは異なります!私は最近、SimpleDecryptWithPasswordを使用しました。私はセキュリティに関して心配していませんでした。私は主にデータを難読化したかったのです。使用する方法は、データの安全性をどの程度確保するかによって異なります。 – Liam

答えて

4

バイナリデータをUTF-8に変換して元に戻すことはできません。一部のバイナリシーケンスは有効なUTF-8文字ではなく、UTF-8に変換するとデータが失われます。これは、一部の文字が「?」に設定されていることに相当します。エンコード間で変換するとき

代わりに、バイナリデータのbase64エンコーディングをテキストに使用してから、元のバイナリを元に戻すためにbase64デコードすることができます。

「\ x00?\ xdc \ x80」(4バイト:0,63,220,128)など、これをUTF-8に変換してみてください。 UTF-8にはエンコードされません。これは無効です。

標準的な方法は、基本-64エンコーディングを使用している - How do I encode and decode a base64 string?

+1

素晴らしい例です。私が使っていたEncryption/DecryptionメソッドはUTF8エンコーディングを使っていたので混乱していたと思う。 'byte [] plainTextBytes = Encoding.UTF8.GetBytes(plainText);' – webworm