Межплатформенное шифрование / дешифрование - ключи обработки и векторы инициализации (IV) - PullRequest
4 голосов
/ 29 марта 2011

После просмотра нескольких примеров я собрал вместе несколько методов шифрования / дешифрования, которые используют Rfc2898DeriveBytes для получения ключа и вектора инициализации.Я обеспокоен тем, что сторона, получающая мой зашифрованный контент, должна иметь возможность расшифровать его.Поскольку я не могу контролировать, какой язык они используют (может быть Java, PHP, C и т. Д.), Как я могу гарантировать, что они могут получить ключ и вектор инициализации (IV), как я использую Rfc2898DeriveBytesкласс в .NET?Вот методы шифрования и дешифрования, которые я использую.

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 голосов
/ 29 марта 2011

Вы бы сказали получателю внедрить PBKDF2, который является стандартом, определенным в RFC2898 и PKCS # 5 . Документация Microsoft говорит, что их функция использует HMAC-SHA-1 в качестве псевдослучайной функции, а 1000 - число итераций по умолчанию. Это информация, которая им понадобится.

Однако вам также нужно будет передать соль, созданную с помощью GenerateSalt() на отправляющей стороне. Получатель не может просто позвонить GenerateSalt() самим - он должен генерироваться случайным образом для каждого сообщения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...