Проблема спецификации IVParameter в Java - PullRequest
0 голосов
/ 07 января 2011

В настоящее время я занимаюсь разработкой приложения для Windows с использованием C # и занимаюсь разработкой мобильного приложения с использованием Java.

Программное обеспечение Windows и мобильное приложение будут работать вместе, приложение Windows будет хранить информацию и шифровать определенную информацию перед ее сохранением в онлайн-базе данных.

Мобильное приложение будет извлекать информацию из онлайновой базы данных и должно будет расшифровать зашифрованную строку, полученную из базы данных.

Метод шифрования, который я использую в C #, указан ниже

        byte[] clearTextBytes = Encoding.UTF8.GetBytes(encryptionString);

        SymmetricAlgorithm rijn = SymmetricAlgorithm.Create();

        MemoryStream ms = new MemoryStream();
        byte[] rgbIV = Encoding.ASCII.GetBytes("ryojvlzmdalyglrj");

        byte[] key = Encoding.ASCII.GetBytes("hcxilkqbbhczfeultgbskdmaunivmfuo");
        CryptoStream cs = new CryptoStream(ms, rijn.CreateEncryptor(key, rgbIV), CryptoStreamMode.Write);

        cs.Write(clearTextBytes, 0, clearTextBytes.Length);

        cs.Close();

        return Convert.ToBase64String(ms.ToArray());

Метод Windows работает нормально.

Код, который я использую в Java, выглядит следующим образом:

KeySpec ks = new DESKeySpec("hcxilkqbbhczfeultgbskdmaunivmfuo".getBytes("UTF-8"));
            SecretKey key = SecretKeyFactory.getInstance("DES").generateSecret(ks);

        String ivString = "ryojvlzmdalyglrj";
        byte[] ivByte = ivString.getBytes("UTF-8");
        IvParameterSpec iv = new IvParameterSpec(ivByte);
        //RC5ParameterSpec iv = new RC5ParameterSpec(ivByte);

        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");

        cipher.init(Cipher.ENCRYPT_MODE, key, iv);

        byte[] encoded = cipher.doFinal(Base64.decodeBase64("iNtaFme3B/e6DppNSp9QLg=="));

        Log.d("Decoded Password", encoded.toString());

Поскольку оба метода должны шифровать и дешифровать одну и ту же строку вместе, он должен использовать один и тот же ключ и IV. Единственная проблема, с которой я сталкиваюсь, заключается в том, что в методе java IVParameterSpec входит в зацепку с ошибкой, которая говорит, что IV должен иметь длину 8 байт.

Как я могу решить эту проблему, чтобы у меня был тот же IV, что и в C #.

Спасибо за помощь

Ответы [ 2 ]

1 голос
/ 07 января 2011

Проблема в том, что вы шифруете (в C #) с AES (также известный как Rjindael), но пытаетесь расшифровать в Java с DES. Если вы измените свой Java-код на использование AES, то все должно работать нормально.

DES использует 8-байтовый IV, потому что он работает на 64-битных блоках. AES использует 16-байтовый IV, потому что он работает на 128-битных блоках.

Вы также должны убедиться, что используете ту же кодировку символов. В C # вы используете ASCII, но в Java вы используете UTF-8. В вашем случае они будут такими же, но вы должны действительно исправить это сейчас, чтобы предотвратить странные ошибки в будущем. Вы можете изменить имя набора символов в Java на «US-ASCII», и оно будет работать.

0 голосов
/ 07 января 2011

Вы должны использовать тот же алгоритм, конечно.Алгоритм по умолчанию для .NET - AES, так что это то, что вы должны использовать и на стороне Java.

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