3

私はエンコーディングと暗号化の両方に慣れていないので、私が尋ねる質問は基本的すぎるかもしれません. 提供された値を暗号化し、暗号化された値と暗号化に使用される IV をドキュメントに保存する必要があります。暗号化は、別の場所に保存されているマスター キーを使用して行われます。私は AES 暗号化を使用しており、暗号化のコードは次のようになります。

 private EncryptedData EncryptValue(string value, byte[] encryptedMasterKey)
        {
            byte[] encryptedValue = new byte[0];
            AesCryptoServiceProvider aesCryptoServiceProvider = null;

            //decrypt the master key
            encryptedMasterKey = DecryptMasterKey(encryptedMasterKey);

            // Create an AesCryptoServiceProvider object
            // with the specified key and IV.                   
            using (aesCryptoServiceProvider = new AesCryptoServiceProvider())
            {
                aesCryptoServiceProvider.Key = encryptedMasterKey;

                // Create an encryptor to perform the stream transform.
                ICryptoTransform encryptor = aesCryptoServiceProvider.CreateEncryptor(
                    aesCryptoServiceProvider.Key, aesCryptoServiceProvider.IV);

                // Create the streams used for encryption.
                using (MemoryStream msEncrypt = new MemoryStream())
                {
                    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                    {
                        using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                        {
                            //Write all data to the stream.
                            swEncrypt.Write(value);
                        }
                        encryptedValue = msEncrypt.ToArray();
                    }
                }
            }

            EncryptedData encryptedData = new EncryptedData(encryptedValue, aesCryptoServiceProvider.IV);
            return encryptedData;
        }

データを XML に書き込むコードは次のようになります。

public void WriteData(string id, EncryptedData encryptedData)
    {

        XDocument document = GetValidDocument();
        XElement[] encryptedDataElements = null;
        XElement encryptedDataElement;
        encryptedDataElements = (from element in document.Descendants(EncryptedDataElementName)
                                 where element.Element(IdElementName).Value.ToUpper() == id.ToUpper()
                                 select element).ToArray();
        if (encryptedDataElements.Count() != 0)
        {
            encryptedDataElement = encryptedDataElements.First();
            encryptedDataElement.Remove();
        }
        encryptedDataElement = new XElement(EncryptedDataElementName);
        XElement idElement = new XElement(IdElementName, id);
        encryptedDataElement.Add(idElement);
        XElement encryptedValueElement = new XElement(EncryptedValueElementName);
        encryptedValueElement.SetValue(Encoding.UTF8.GetString(encryptedData.EncryptedValue));
        XElement saltElement = new XElement(SaltElementName, Encoding.UTF8.GetString(encryptedData.Salt));
        encryptedDataElement.Add(encryptedValueElement);
        encryptedDataElement.Add(saltElement);
        document.Element(StoreElementName).Add(encryptedDataElement);
        IXmlService xmlService = GlueRegistry.Instance.GetService<IXmlService>();
        xmlService.SaveXmlDocument(document, filePath);
    }

UTF8 でエンコードされた文字列として保存し、UTF8 でエンコードされたバイト配列として値を取得する方がおそらく良いと考えました。データは 1 つずつ書き込まれるため、シリアル化はオプションではありません。問題は、Encoding.UTF8.GetString を使用した SetValue メソッドにあります。また、おそらく XElement.Parse を使用する必要があることも理解しています。私はそれを使用しましたが、値が無効であるという例外が発生しました。UTF8 が良い選択なのか、それとも私がやろうとしていることを行うための別のより良い方法があるのか​​ どうか疑問に思っています。

助けてくれてありがとう!

4

2 に答える 2

4
  1. エンコードには Base64 をお勧めします。Utf8 は、テキストをバイトに変換するように設計されています。任意のバイナリ データをテキストに変換することはできません。
  2. 認証された暗号化/MAC の追加を使用することをお勧めします。認証されていない暗号化は、パディング オラクルなどの積極的な攻撃を招きます。

したがって、コードは次のようになります。

byte[] ciphertext = iv + Encrypt(key, m);
byte[] ciphertextWithMAC = ciphertext + HMAC(key, ciphertext)
string encodedCiphertext = Base64Encode(cipherText)
于 2013-01-24T12:18:08.553 に答える
0

ブルート フォース攻撃を要求する単一バイトの暗号化を保存するのが良い考えであるかどうか、いくつかの疑問がありますが、表現の形式は私にとって明らかです。データ型 hexBinary を使用します「414243」など)。これにより、暗号化値の長さが 2 倍になりますが、XML オーバーヘッドのため、これが問題になることはほとんどありません。利点は次のとおりです。特殊文字の処理が不要で、はっきりと見え、ある程度読みやすいです。

于 2013-01-24T11:14:27.260 に答える