Encryption -因此,我暂时将其置于冰上,等待调查结果。@InteXX它不是通用加密例程。如果您需要操作系统提供的每个进程、每个windows用户帐户或每台机器的密钥,那么它主要很有用。我只会用它来加密我自己的密钥,而不是数据。OP的代码使用PBKDF2这就是RFC28

Encryption -因此,我暂时将其置于冰上,等待调查结果。@InteXX它不是通用加密例程。如果您需要操作系统提供的每个进程、每个windows用户帐户或每台机器的密钥,那么它主要很有用。我只会用它来加密我自己的密钥,而不是数据。OP的代码使用PBKDF2这就是RFC28,encryption,.net,pbkdf2,Encryption,.net,Pbkdf2,-因此,我暂时将其置于冰上,等待调查结果。@InteXX它不是通用加密例程。如果您需要操作系统提供的每个进程、每个windows用户帐户或每台机器的密钥,那么它主要很有用。我只会用它来加密我自己的密钥,而不是数据。OP的代码使用PBKDF2这就是RFC2898。PBKDF2-HMAC-SHA1使用固定的salt和迭代计数进行调用,这用于提供密钥和IV。因此,相同的加密密钥和IV用于给定密码。解密IV时的“发送IV+密文+HMAC”为8字节,因此这很容易——但您如何知道[ciphertext]结束



-因此,我暂时将其置于冰上,等待调查结果。@InteXX它不是通用加密例程。如果您需要操作系统提供的每个进程、每个windows用户帐户或每台机器的密钥,那么它主要很有用。我只会用它来加密我自己的密钥,而不是数据。OP的代码使用PBKDF2这就是RFC2898。PBKDF2-HMAC-SHA1使用固定的salt和迭代计数进行调用,这用于提供密钥和IV。因此,相同的加密密钥和IV用于给定密码。解密IV时的“发送IV+密文+HMAC”为8字节,因此这很容易——但您如何知道[ciphertext]结束和[HMAC]开始的位置?(HMAC用于证书签名,是吗?)正如您所建议的,我已经编辑了将密码模式设置为CBC的代码。谢谢。我刚刚在中注意到模式属性默认为CBC。不过,在代码中显式地设置它可能是好的。@InteXX您需要一个合适的数据序列化方案。正如DanielE指出的,您应该使用AesCryptoServiceProvider,而不是TripleDESCryptoServiceProvider。如果你使用HMAC,你也需要为它生成一个密钥。PBKDF2-HMAC-SHA1使用固定的salt和迭代计数进行调用,这用于提供密钥和IV。因此,相同的加密密钥和IV用于给定密码。解密IV时的“发送IV+密文+HMAC”为8字节,因此这很容易——但您如何知道[ciphertext]结束和[HMAC]开始的位置?(HMAC用于证书签名,是吗?)正如您所建议的,我已经编辑了将密码模式设置为CBC的代码。谢谢。我刚刚在中注意到模式属性默认为CBC。不过,在代码中显式地设置它可能是好的。@InteXX您需要一个合适的数据序列化方案。正如DanielE指出的,您应该使用AesCryptoServiceProvider,而不是TripleDESCryptoServiceProvider。如果你使用HMAC,你也需要为它生成一个密钥。上下文:这是一个单片桌面应用程序,它加密并存储密码,以便以后自动登录到不在我控制下的远程第三方服务器。重复Salt/IV:对每个操作使用新值不会导致密文不可加密吗?或者我误解了你的建议。更多上下文:攻击者将从Windows注册表获取Byte()数组。对于随机salt/IV问题,正如编辑中所说,SALT和IV不是秘密的,您的数据可能看起来像
SALT_字节+IV_字节+PBKDF2_写入_计数+加密_字节
然后在解密时从文件中读取这三条信息。@Scott Chamberlain:没错!不,您永远不会重复使用它,即使在多个会话中也是如此。使用固定长度或在字节之前预先设置长度,使其成为
Salt_长度(32位大)+Salt_字节(Salt_长度字节大)+IV_长度(32位大)+IV_字节(IV_长度字节大)+PBKDF2_写入计数(32位大)+加密_字节(文件的其余部分)
Context:这是一个单片桌面应用程序,它加密并存储密码,以便以后自动登录到不在我控制下的远程第三方服务器。重复Salt/IV:对每个操作使用新值不会导致密文不可加密吗?或者我误解了你的建议。更多上下文:攻击者将从Windows注册表获取Byte()数组。对于随机salt/IV问题,正如编辑中所说,SALT和IV不是秘密的,您的数据可能看起来像
SALT_字节+IV_字节+PBKDF2_写入_计数+加密_字节
然后在解密时从文件中读取这三条信息。@Scott Chamberlain:没错!不,您永远不会重复使用它,即使在多个会话中也是如此。使用固定长度或在字节之前预先设置长度,使其成为
Salt_长度(32位大)+Salt_字节(Salt_长度字节大)+IV_长度(32位大)+IV_字节(IV_长度字节大)+PBKDF2_写入计数(32位大)+加密_字节(文件的其余部分)
Private Function Crypt(InBytes As Byte(), Password As String, Action As EncryptionActions) As Byte()
  Dim oCryptoTransform As ICryptoTransform
  Dim oDesProvider As AesCryptoServiceProvider

  Dim _
    iBlockSize,
    iKeySize,
    iSize As Integer

  Dim _
    aSalt,
    aKey,
    aIV As Byte()

  oDesProvider = New AesCryptoServiceProvider
  oDesProvider.Mode = CipherMode.CBC

  aSalt = {&H10, &H20, &H12, &H23, &H37, &HA4, &HC5, &HA6, &HF1, &HF0, &HEE, &H21, &H22, &H45}

  For iSize = 1024 To 1 Step -1
    If oDesProvider.ValidKeySize(iSize) Then
      iKeySize = iSize
      Exit For
    End If
  Next

  iBlockSize = oDesProvider.BlockSize

  With New Rfc2898DeriveBytes(Password, aSalt, 12345)
    aKey = .GetBytes(iKeySize \ 8)
    aIV = .GetBytes(iBlockSize \ 8)
  End With

  Select Case Action
    Case EncryptionActions.Encrypt : oCryptoTransform = oDesProvider.CreateEncryptor(aKey, aIV)
    Case EncryptionActions.Decrypt : oCryptoTransform = oDesProvider.CreateDecryptor(aKey, aIV)
    Case Else : Throw New ArgumentException("Invalid encryption action specified.")
  End Select

  Using oOutStream As New MemoryStream
    Using oCryptoStream As New CryptoStream(oOutStream, oCryptoTransform, CryptoStreamMode.Write)
      oCryptoStream.Write(InBytes, 0, InBytes.Length)
    End Using

    Return oOutStream.ToArray
  End Using
End Function