1

構成ファイルを読み書きするプログラムがあります。書き込むときは、vb.netのRijndaelManagedオブジェクトを使用してファイル全体を暗号化し、読み取るときは、キーと初期化ベクトルに同じ値を使用して復号化します。

それはすべて私の開発マシンや他の多くのマシンで正常に動作します。ただし、一部のPCは、同じプログラムを使用してファイルを暗号化/復号化できません。

この暗号化オブジェクトには、それを妨げるものがありますか?代わりに何を使用することをお勧めしますか?

ありがとう

編集:これが暗号化と復号化に使用するコードです:私が見ることができることから、メインマシンからバイトを暗号化すると、どのPCからでも暗号化を解除できます。ただし、他のPCからバイトを暗号化すると、どのPCからも復号化できません。また、ファイルの内容を見ると、まったく同じようには見えません。私が回避する通常の方法は、ファイル(通常はXML)からメモリストリームを作成し、暗号化/復号化することです。

Public Shared Function EncryptBytes(ByVal strContenu() As Byte, ByVal initVectorBytes() As Byte, ByVal saltValueBytes() As Byte) As Byte()

    ' Convert our plaintext into a byte array.
    ' Let us assume that plaintext contains UTF8-encoded characters.
    Dim plainTextBytes As Byte() = strContenu
    'plainTextBytes = System.Text.Encoding.Unicode.GetBytes(strMessage)

    Dim strPassPhrase As String = "d%6&?76dhd8?532LDhds8!7?&?8&?dhcv77"

    Dim strHashAlgorithm As String = "SHA1"

    Dim intPswdIterations As Integer = 2

    ' First, we must create a password, from which the key will be derived.
    ' This password will be generated from the specified passphrase and 
    ' salt value. The password will be created using the specified hash 
    ' algorithm. Password creation can be done in several iterations.
    Dim password As PasswordDeriveBytes
    password = New PasswordDeriveBytes(strPassPhrase, _
                                       saltValueBytes, _
                                       strHashAlgorithm, _
                                       intPswdIterations)

    ' Use the password to generate pseudo-random bytes for the encryption
    ' key. Specify the size of the key in bytes (instead of bits).
    Dim keyBytes As Byte()
    keyBytes = password.GetBytes(32)

    ' Create uninitialized Rijndael encryption object.
    Dim symmetricKey As RijndaelManaged
    symmetricKey = New RijndaelManaged()

    ' It is reasonable to set encryption mode to Cipher Block Chaining
    ' (CBC). Use default options for other symmetric key parameters.
    symmetricKey.Mode = CipherMode.CBC

    ' Generate encryptor from the existing key bytes and initialization 
    ' vector. Key size will be defined based on the number of the key 
    ' bytes.
    Dim encryptor As ICryptoTransform
    encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes)

    ' Define memory stream which will be used to hold encrypted data.
    Dim memoryStream As System.IO.MemoryStream
    memoryStream = New System.IO.MemoryStream()

    ' Define cryptographic stream (always use Write mode for encryption).
    Dim cryptoStream As CryptoStream
    cryptoStream = New CryptoStream(memoryStream, _
                                    encryptor, _
                                    CryptoStreamMode.Write)
    ' Start encrypting.
    cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length)

    ' Finish encrypting.
    cryptoStream.FlushFinalBlock()

    ' Convert our encrypted data from a memory stream into a byte array.
    Dim cipherTextBytes As Byte()
    cipherTextBytes = memoryStream.ToArray()

    ' Close both streams.
    memoryStream.Close()
    cryptoStream.Close()

    ' Convert encrypted data into a base64-encoded string.
    'Dim cipherText As String
    'cipherText = 
    Return cipherTextBytes

    ' Return encrypted string.
    'Return cipherText

End Function

Public Shared Function DecryptBytes(ByVal strContenuEncrypte() As Byte, ByVal initVectorBytes() As Byte, ByVal saltValueBytes() As Byte) As Byte()

    ' Convert strings defining encryption key characteristics into byte
    ' arrays. Let us assume that strings only contain ASCII codes.
    ' If strings include Unicode characters, use Unicode, UTF7, or UTF8
    ' encoding.

    ' Convert our ciphertext into a byte array.
    Dim cipherTextBytes As Byte() = strContenuEncrypte

    Dim strPassPhrase As String = "d%6&?76dhd8DSDhds8!7?&?8&?dhcv77"

    Dim strHashAlgorithm As String = "SHA1"

    Dim intPswdIterations As Integer = 2

    ' First, we must create a password, from which the key will be 
    ' derived. This password will be generated from the specified 
    ' passphrase and salt value. The password will be created using
    ' the specified hash algorithm. Password creation can be done in
    ' several iterations.
    Dim password As PasswordDeriveBytes
    password = New PasswordDeriveBytes(strPassPhrase, _
                                       saltValueBytes, _
                                       strHashAlgorithm, _
                                       intPswdIterations)

    ' Use the password to generate pseudo-random bytes for the encryption
    ' key. Specify the size of the key in bytes (instead of bits).
    Dim keyBytes As Byte()
    keyBytes = password.GetBytes(32)

    ' Create uninitialized Rijndael encryption object.
    Dim symmetricKey As RijndaelManaged
    symmetricKey = New RijndaelManaged()

    ' It is reasonable to set encryption mode to Cipher Block Chaining
    ' (CBC). Use default options for other symmetric key parameters.
    symmetricKey.Mode = CipherMode.CBC

    ' Generate decryptor from the existing key bytes and initialization 
    ' vector. Key size will be defined based on the number of the key 
    ' bytes.
    Dim decryptor As ICryptoTransform
    decryptor = symmetricKey.CreateDecryptor(keyBytes, initVectorBytes)

    ' Define memory stream which will be used to hold encrypted data.
    Dim memoryStream As System.IO.MemoryStream
    memoryStream = New System.IO.MemoryStream(cipherTextBytes)

    ' Define memory stream which will be used to hold encrypted data.
    Dim cryptoStream As CryptoStream
    cryptoStream = New CryptoStream(memoryStream, _
                                    decryptor, _
                                    CryptoStreamMode.Read)

    ' Since at this point we don't know what the size of decrypted data
    ' will be, allocate the buffer long enough to hold ciphertext;
    ' plaintext is never longer than ciphertext.
    Dim plainTextBytes As Byte()
    ReDim plainTextBytes(cipherTextBytes.Length)

    ' Start decrypting.
    Dim decryptedByteCount As Integer
    decryptedByteCount = cryptoStream.Read(plainTextBytes, _
                                           0, _
                                           plainTextBytes.Length)

    ' Close both streams.
    memoryStream.Close()
    cryptoStream.Close()

    ' Convert decrypted data into a string. 
    ' Let us assume that the original plaintext string was UTF8-encoded.
    Dim plainText As String
    plainText = System.Text.Encoding.Unicode.GetString(plainTextBytes, _
                                        0, _
                                        decryptedByteCount)

    ' Return decrypted string.
    Return plainTextBytes


End Function
4

3 に答える 3

1

ランタイムとして通常の.NETの代わりにMonoを使用している場合PasswordDeriveBytes、20を超える出力では失敗します。PasswordDeriveBytesハッシュ出力が提供できるよりも多くの出力が要求された場合、未知の、独自の、非決定論的な、壊れた、暗号的に安全でない方法を使用します。内PasswordDeriveBytesこれは、Mono開発者によって修正なしとしてマークされています。

最善の方法は、にアップグレードすることですRfc2898DeriveBytes。これは、PBKDF1の代わりにPBKDF2を実装します。PBKDF2は、すべての実装が指定どおりに動作するように出力量を拡張する方法を定義します。

ただし、ハッシュ関数が提供するよりも多くの出力が必要な場合は、PBKDF2の出力よりもHKDFなどのKBKDFを使用する方が安全です。PKBDF2は、より多くのデータを作成するために別のフルセットのラウンドを必要とします。これは、通常のユーザーではなく攻撃者に有利に働く可能性があり、要求されるバイト数に応じてCPU負荷を2倍または3倍にします。

[編集]

PasswordDeriveBytesまた、パスワード文字列を受け取るコンストラクターは、使用される文字エンコードを指定しないため、コンストラクターにフィードする前にバイトに変換することをお勧めします。

ほとんどの観察によれば、どちらもUTF-8を使用しているようですが、他のランタイム(Javaなど)はこの点で異なる場合があることに注意してください。

于 2012-11-20T21:05:58.980 に答える
0

大げさな推測:テキストモードでファイルを書き込んだり読んだりしていますか?暗号化されたデータに0x1A(EOF、ctrl-z)が含まれていると、読み取りが途中で停止し、数バイトに復号化される場合があります。

于 2012-11-20T18:29:34.900 に答える
0

120Gbファイルをbyte()にアップロードすることはできません。または、クレイジーなマシンがあります。RAMでバイトをバイトにアップロードしてみてください

Dim fStream As FileStream = New FileStream("Encrypted.Encrypted", FileMode.Create)
        Dim cryptoStream As New CryptoStream(fStream, Encryptor, CryptoStreamMode.Write)
        Using UploadFile As FileStream = New FileStream(OpenfileDialog.FileName, FileMode.Open)
            For i = 0 To UploadFile.Length - 1
                Dim NewByte As New Byte
                NewByte = UploadFile.ReadByte
                cryptoStream.WriteByte(NewByte)
            Next
        End Using

        cryptoStream.FlushFinalBlock()
        cryptoStream.Close()
        fStream.Close()
于 2015-01-28T10:23:15.127 に答える