1

暗号化には Rijndael (AES アルゴリズムとして) を使用しています。値 (オブジェクトのプロパティ) を暗号化し、オブジェクトを xml にシリアル化し、Web サービスを介して xml をレシーバーに送信します。データの暗号化に使用した暗号化された対称キーを渡したいです。しかし、どのキーを渡す必要がありますか? 私の復号化アルゴリズムは次のようになります(vb.net):

Public Function Encrypt(ByVal stringToEncrypt As String) As String

    Dim textConverter As New ASCIIEncoding()
    Dim myRijndael As New RijndaelManaged()
    Dim encrypted() As Byte
    Dim stringToEncryptAsByte() As Byte
    Dim encryptedAsString As String
    Dim key() As Byte
    Dim IV() As Byte

        ' Set symetric key size og chiper mode
        myRijndael.Mode = CipherMode.CBC
        myRijndael.KeySize = 128

        ' Create a new key and initialization vector.
        myRijndael.GenerateKey()
        myRijndael.GenerateIV()

        ' Get the key and IV.
        key = myRijndael.Key
        IV = myRijndael.IV

        ' Get an encryptor.
        Dim encryptor As ICryptoTransform = myRijndael.CreateEncryptor(key, IV)

        ' Encrypt the data.
        Dim msEncrypt As New MemoryStream()
        Dim csEncrypt As New CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)

        ' Convert the data to a byte array.
        stringToEncryptAsByte = textConverter.GetBytes(stringToEncrypt)

        ' Write all data to the crypto stream and flush it.
        csEncrypt.Write(stringToEncryptAsByte, 0, stringToEncryptAsByte.Length)
        csEncrypt.FlushFinalBlock()

        ' Get encrypted array of bytes.
        encrypted = msEncrypt.ToArray()
        encryptedAsString = Convert.ToBase64String(encrypted)

        Return encryptedAsString
End Function

暗号化された文字列を復号化したい場合は、キーと IV の両方を使用する必要がありますが、キーの値のみを渡す必要があると思います。これを別の方法で行う必要がありますか、それとも何を渡す必要がありますか? 私の仕様によると、値は AES と 128 ビット キーを使用して暗号化する必要があります。

4

2 に答える 2

1

暗号化されたデータと一緒に暗号化キーを渡す場合、これはデータをまったく暗号化しないことと同じです (単純な目で読み取ることができないことを除けば、単純な Base64 エンコーディングなどで同じことができます)。

対称暗号化アルゴリズムを使用するには、送信者と受信者が秘密鍵 (対称鍵、または鍵の派生元となるもの) を共有する必要があります。これが不可能な場合は、ハイブリッド対称/非対称暗号化スキームを使用することをお勧めします。この場合、送信者は公開鍵アルゴリズムを使用して秘密鍵を暗号化し、対称的に暗号化されたデータと一緒に送信します。(この場合、送信者は受信者の秘密鍵に対応する公開鍵を知っている必要があります。)

とはいえ、ブロック暗号 (CBC など) のチェーン操作モードでは、送信者は通常、データと共に初期化ベクトルを渡します。

于 2011-09-13T11:08:40.963 に答える
1

IV は簡単です。そのまま送信するだけです。それを暗号文の先頭に追加するのが一般的な方法であるため、受信者は必要なときにそれを取り除くだけです。IV を秘密にしておく必要はありません。

キーは秘密にしておく必要があるため、それほど単純ではありません。2 つの一般的な解決策があります。

  1. Diffie-Hellman を使用して、暗号化されたファイルを受信者に送信する必要があるたびに、新しい秘密鍵を受信者と合意します。

  2. RSA 公開キーを使用して AES キーを暗号化し、その方法で送信します。

また、送信中にファイルが改ざんされていないことを確認するために、HMAC の使用を調査することもできます。

于 2011-09-13T11:09:45.000 に答える