我设法将一些代码拼凑起来加密/解密字符串,我想知道我是否做得很好。换句话说,它是否真的安全。
我在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
答案 0 :(得分:2)
我不知道.net因此我不详细了解代码,但据我所知,至少存在以下问题:
您应该进行加密的方式如下:
收到密文时:
答案 1 :(得分:2)
你的问题缺乏背景。你到底想要达到什么目的?更确切地说,你想要防御什么攻击?
据我了解,您的代码始终使用相同的密钥和初始化向量。
传递给PBKDF2的salt参数和传递给块密码的IV都应该使用适当的种子CSPRNG生成。在.Net中使用RNGCryptoServiceProvider。
编辑:
盐和Ⅳ不是秘密。它们应该是消息或文件的一部分,或者代码产生的任何内容。
还有一条评论:您可能不应该使用硬编码的PBKDF2迭代次数。随着硬件变得更快,所需的迭代次数会随着时间的推移而增加。因此,迭代次数也应该是message / file / record / whatever的一部分。