跨平台加密/解密 - 处理密钥和初始化向量(IV)

4

在查看了许多示例后,我整合了一些加密/解密方法,利用Rfc2898DeriveBytes获取密钥和初始化向量。我的担忧是接收到我的加密内容的一方必须能够解密它。由于我无法控制他们使用的语言(可能是Java、PHP、C等),我该如何确保他们能够像我在.NET中使用Rfc2898DeriveBytes类一样派生出密钥和初始化向量(IV)?以下是我正在使用的加密和解密方法。

Public Shared Function EncryptText(ByVal plainText As String, ByVal password As String) As String

  Dim aesCrypto As Rijndael = Nothing
  Dim plainTextBytes As Byte()
  plainTextBytes = Encoding.Default.GetBytes(plainText)

  Dim rfc2898 As Rfc2898DeriveBytes
  rfc2898 = New Rfc2898DeriveBytes(password, GenerateSalt(password))
  aesCrypto = Rijndael.Create()
  aesCrypto.Padding = PaddingMode.ISO10126
  Dim tx As ICryptoTransform
  tx = aesCrypto.CreateEncryptor(rfc2898.GetBytes(32), rfc2898.GetBytes(16))
  Dim encryptedBytes As Byte()
  encryptedBytes = tx.TransformFinalBlock(plainTextBytes, 0, plainTextBytes.Length)
  Return Convert.ToBase64String(encryptedBytes)

End Function

Public Shared Function DecryptText(ByVal encryptedText As String, ByVal password As String) As String

  Dim aesCrypto As Rijndael = Nothing
  Dim encryptedTextBytes As Byte()
  encryptedTextBytes = Convert.FromBase64String(encryptedText)

  Dim rfc2898 As Rfc2898DeriveBytes
  rfc2898 = New Rfc2898DeriveBytes(password, GenerateSalt(password))
  aesCrypto = Rijndael.Create()
  aesCrypto.Padding = PaddingMode.ISO10126
  Dim tx As ICryptoTransform
  tx = aesCrypto.CreateEncryptor(rfc2898.GetBytes(32), rfc2898.GetBytes(16))
  Dim decryptedBytes As Byte()
  decryptedBytes = tx.TransformFinalBlock(encryptedTextBytes, 0, encryptedTextBytes.Length)
  Return Encoding.Default.GetString(decryptedBytes)

End Function
1个回答

4
您需要告诉接收者实现PBKDF2,该标准在RFC2898PKCS#5中定义。Microsoft的文档指出,他们的函数使用HMAC-SHA-1作为伪随机函数,并将1000作为默认迭代次数。这是他们需要的信息。
但是,您还需要传输与发送端 GenerateSalt()创建的盐。接收者不能自己调用GenerateSalt() - 每个消息都应随机生成。

谢谢!这就是我需要知道的。我将与加密文本一起发送“盐”。 - webworm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接