【发布时间】:2014-04-11 09:02:53
【问题描述】:
我设法拼凑了一些代码来加密/解密一个字符串,我想知道我是否做得很好。换句话说,它真的安全吗?
我在 StackOverflow 的一篇文章中读到,重复使用 IV 是不好的做法,应该避免。我不能肯定地说,但我相信这就是我在这里所做的。确认/拒绝?
也就是说,对于每个操作使用不同的 IV 不会使加密流无法解密吗?恐怕我对这方面的了解并不如我所愿。
代码如下:
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
【问题讨论】:
-
你可能想看看加密规则一:NEVER roll your own :)
-
@pnp 即使你没有,你也必须找到一个好的现有实现。这几乎一样难。
-
“永远不要自己动手。”好的,我会买那个。听起来不错,我同意。但是在哪里画出那条线呢?例如,在这段代码中,我使用的是标准的 .NET 库;不能说我没有自己动手吗?但是,如果我有,那么规则 #1 会阻止使用这些库,从而使它们无效。你让我很好奇。请详细说明。
-
@CodesInChaos - 您对 ProtectedData.Unprotect() 有何看法?我发现在我写了这个方法之后,我暂时搁置了这个方法,等待这次调查的结果。
-
@InteXX 这不是通用加密例程。如果您需要操作系统提供的按进程、按 Windows 用户帐户或按机器密钥,它主要有用。我只会用它来加密我自己的密钥,而不是数据。
标签: encryption .net pbkdf2