Реализация RFC2898DeriveBytes в Java - PullRequest
0 голосов
/ 21 февраля 2012

Я должен расшифровать строку, зашифрованную в C #, как часть нашего проекта. Эта расшифровка выполняется с использованием алгоритма AES и режима упаковки как PKCS7. Для генерации вектора инициализации они использовали следующее:

Rfc2898DeriveBytes keyGenerator = new Rfc2898DeriveBytes("somestring", salt);

Соль - байты по умолчанию.

Этот IV используется для шифрования строки с использованием AES.

Я прочитал некоторые документы и обнаружил, что AES может быть реализован на Java. Но не уверен, как пройти IV и режим упаковки.

Кроме того, я видел, что есть режимы CBC, ECB для упоминания режима блока шифрования. Я не уверен, какой режим используется в C # аналог.

Ниже приведен код на C #

/// Method to encrypt the plain text based on the key and Iv
/// </summary>
/// <param name="plainText"></param>
/// <param name="key"></param>
/// <returns>encrypted Text</returns>
private string Encrypt(string plainText, byte[] key)
{
    if (plainText == null || plainText.Length <= 0)
        throw new ArgumentNullException("plainText");
    if (key == null || key.Length <= 0)
        throw new ArgumentNullException("Key");
    // Declare the stream used to encrypt to an in memory
    // array of bytes.
    MemoryStream msEncrypt = null;

    // Declare the RijndaelManaged object
    // used to encrypt the data.
    AesCryptoServiceProvider aesAlg = null;
  //  using (new Tracer("Encryption","",""))
  //  {
        try
        {
            // Create a RijndaelManaged object
            // with the specified key and IV.
            aesAlg = new AesCryptoServiceProvider();
            aesAlg.Key = key;
            aesAlg.IV = GetInitializationVector();
            aesAlg.Padding = PaddingMode.PKCS7;
            // Create an encryptor to perform the stream transform.
            ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

            // Create the streams used for encryption.
            msEncrypt = new MemoryStream();
            using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
            {
                using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                {

                    //Write all data to the stream.
                    swEncrypt.Write(plainText);
                }
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            // Clear the RijndaelManaged object.
            if (aesAlg != null)
                aesAlg.Clear();
        }

        // Return the encrypted bytes from the memory stream.
        // Console.WriteLine();

        return Convert.ToBase64String(msEncrypt.ToArray());
  //  }
}

private byte[] GetInitializationVector()
{
    byte[] iv;
    //create the initial salt 

    byte[] salt = Encoding.Default.GetBytes("abcdefghijkl");

    //create the key generator

    Rfc2898DeriveBytes keyGenerator = new Rfc2898DeriveBytes("ricksaw", salt);

    iv =  keyGenerator.GetBytes(16);

   return iv;
}

Может ли кто-нибудь помочь мне создать эквивалент в Java?

1 Ответ

1 голос
/ 19 апреля 2012

я как-то придумала способ.он работал нормально

Я попросил .net-партнера передать ключ и IV как строки.Я закодировал их в byte [] и использовал следующий код

 String sKey ="fromdotnetpart";

 String sIv="fromdotnetiv";

    byte[] bKey = key.getBytes();
    byte[] iv = sIv.getBytes();
    SecretKeySpec skey = new SecretKeySpec(bKey, "AES");   
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    AlgorithmParameterSpec param = new IvParameterSpec(iv);
    cipher.init(Cipher.DECRYPT_MODE, key,param);
    String decrypted = cipher.doFinal(encryptedString.getByte());

Надеюсь, это поможет вам.Обратите внимание, что для более надежного шифрования AES, то есть AES-256,192 и т. Д. Вам необходимо загрузить файлы политики неограниченной юрисдикции

Java Cryptography Extension (JCE).
...