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()

问题是这个方法总是返回一个空的字节数组。我没有任何例外。Key 和 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 回答