5

おそらく私はばかげた質問をしていますが、それを機能させることができません。C# にある MSDN の例に従って、F# で AES 暗号化\復号化を行っています。

http://msdn.microsoft.com/en-us/library/system.security.cryptography.aes.aspx

私の暗号化方法は次のとおりです。

let EncryptStringToBytesAes (plainText : string) (key : byte[]) (iv : byte[]) =
    use aesAlg = Aes.Create()
    aesAlg.Key <- key
    aesAlg.IV <- iv
    // Create a decrytor to perform the stream transform.
    let encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV)
    // Create the streams used for encryption. 
    use msEncrypt = new MemoryStream()
    use csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)
    use swEncrypt = new StreamWriter(csEncrypt)
    swEncrypt.Write(plainText)
    msEncrypt.ToArray()

問題は、このメソッドが常に空のバイト配列を返すことです。私にも例外はありません。キーと IV は適切なバイト配列です。StreamWriter が機能していないようです...

ご協力ありがとう御座います。

4

3 に答える 3

4

@usrの答えに基づいて...

ストリームが閉じていることを確認する最も簡単な方法は、が呼び出されるuse前にスコープ外になるブロック内にステートメントを配置することです。ToArray

let EncryptStringToBytesAes (plainText : string) (key : byte[]) (iv : byte[]) =
    use aesAlg = Aes.Create()
    aesAlg.Key <- key
    aesAlg.IV <- iv
    // Create a decrytor to perform the stream transform.
    let encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV)
    // Create the streams used for encryption. 
    use msEncrypt = new MemoryStream()
    (
      use csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)
      use swEncrypt = new StreamWriter(csEncrypt)
      swEncrypt.Write(plainText)
    )
    msEncrypt.ToArray()
于 2013-09-05T14:51:00.157 に答える
2

呼び出す前にmsEncrypt.ToArray、すべての中間ストリームをフラッシュするか、閉じる必要があります。これらはデータをバッファリングしているためです。

于 2013-09-05T12:19:33.167 に答える
-1

機能させるには、StreamWriter と CryptoStream を明示的に閉じる必要があります。

于 2013-09-19T13:37:34.183 に答える