Зашифровать шестнадцатеричную строку в Java - PullRequest
0 голосов
/ 03 февраля 2010

Я хотел бы попросить любые предложения по моей проблеме.Мне нужно зашифровать шестнадцатеричную строку.Я не должен использовать встроенные функции Java, потому что он не работает на моем сервере.Короче говоря, мне приходится жестко кодировать алгоритм или любые средства шифрования сообщения.Кто-нибудь, кто мог бы помочь мне с этим?Большое спасибо!

вот код.

public Encrypt(SecretKey key, String algorithm) {

 try {
     ecipher = Cipher.getInstance(algorithm);
     dcipher = Cipher.getInstance(algorithm);
     ecipher.init(Cipher.ENCRYPT_MODE, key);
     dcipher.init(Cipher.DECRYPT_MODE, key);
 } catch (NoSuchPaddingException e) {
     System.out.println("EXCEPTION: NoSuchPaddingException");
 } catch (NoSuchAlgorithmException e) {
     System.out.println("EXCEPTION: NoSuchAlgorithmException");
 } catch (InvalidKeyException e) {
     System.out.println("EXCEPTION: InvalidKeyException");
 }
}

public void useSecretKey(String secretString) {


 try {
     SecretKey desKey       = KeyGenerator.getInstance("DES").generateKey();
     SecretKey blowfishKey  = KeyGenerator.getInstance("Blowfish").generateKey();
     SecretKey desedeKey    = KeyGenerator.getInstance("DESede").generateKey();

     Encrypt desEncrypter = new Encrypt(desKey, desKey.getAlgorithm());
     Encrypt blowfishEncrypter = new Encrypt(blowfishKey, blowfishKey.getAlgorithm());
     Encrypt desedeEncrypter = new Encrypt(desedeKey, desedeKey.getAlgorithm());

     desEncrypted       = desEncrypter.encrypt(secretString);
     blowfishEncrypted  = blowfishEncrypter.encrypt(secretString);
     desedeEncrypted    = desedeEncrypter.encrypt(secretString);
 } catch (NoSuchAlgorithmException e) {}
}

это методы, которые я использовал.Нет проблем, если он запускается как приложение, но когда я помещаю его на свой сервер, который является сервером GlassFish, возникла исключительная ситуация, и он говорит, что такой алгоритм отсутствует.

Ответы [ 4 ]

2 голосов
/ 03 февраля 2010

Забудьте об изменении кода - разберитесь со средой.

Вы говорите, что это работает, когда вы запускаете его как приложение командной строки - я предполагаю, что вы имеете в виду на своем рабочем столе. Можете ли вы сделать то же самое на сервере?

Какую версию Java вы используете в каждом месте? Убедитесь, что вы проверили, какая версия используется в Glassfish - она ​​может отличаться от той, которую вы получаете при запуске java -version в командной строке.

Кроме того, я надеюсь, что ваш реальный код не поглощает подобные исключения.

0 голосов
/ 03 февраля 2010

Самостоятельная реализация некоторых криптографических алгоритмов имеет большое педагогическое значение, но сделать это неправильно непросто. Для симметричного шифрования обычной рекомендацией является AES, который подробно описан (* довольно ясно) в FIPS-197 . AES - это блочный шифр, то есть он шифрует блоки по 16 байтов. Чтобы зашифровать «сообщение» (предположительно длиннее 16 байт), вам понадобятся некоторые цепочки и отступы (набор соглашений, которые преобразуют сообщение в некоторые 16-байтовые блоки для обработки AES); это тоже не очень легко. См. эту запись в Википедии для ознакомления с заполнением и сцеплением.

Однако отсутствие доступа к стандартным криптографическим реализациям Java является подозрительным. Вы должны сначала попытаться диагностировать это. Попробуйте перечислить (с некоторым кодом Java) зарегистрированных поставщиков с кодом, подобным следующему:

for (Provider p : Security.getProviders()) {
    System.out.printf("%s -> %s\n", p.getName(), p.getInfo());
}

затем сравните вывод с тем, что указано в документации . В частности, список поставщиков Sun .

(Примечание: речь идет о виртуальной машине сервера - там, где работает ваш код - и это может быть виртуальная машина какого-либо другого поставщика, например IBM; список стандартных поставщиков может отличаться.)

0 голосов
/ 03 февраля 2010

Скорее всего, проблема связана с каким-то заполнением загрузочного пути Java, которое действует при запуске Glassfish. Это часто кусается, когда сервер приложений запускается из IDE. Например:

> On 30-5-2005 8:00, Uwe Peuker wrote:
>
> It's probably caused by the way how/when Eclipse passes
> the -Xbootclasspath parameter to the java executable that's being
> launched.
>
> Don't know for 3.1RC1, but for older releases it depends on the setting
> "Use system default libraries" in the JRE configuration (Window ->
> Preferences -> Java -> Installed JREs -> (select JRE) -> Edit)
>
> When "Use system default libraries" is unchecked (off), Eclipse adds
> the -Xbootclasspath parameter --with all the libs in the list-- to the
> java executable. If the list doesn't include the crypto libraries, it
> results in the NoSuchAlgorithmException.
> Otherwise, when "Use system default libraries" is checked, Eclipse doesn't
> add -Xbootclasspath, so it allows the java executable to discover its own
> boot classpath including the crypto libraries.
> --
> Regards,
>
> Roland de Ruiter
> ___ ___
> /__/ w_/ /__/
> / \ /_/ / \

РЕДАКТИРОВАТЬ : в ответ на комментарий ОП:

(Если это не очевидно, я не являюсь ни Роландом де Рюйтером, ни Уве Пеукером. Я только что нашел это письмо в поиске Google и разместил его здесь для вашей информации.)

В любом случае, поскольку проблема возникает при запуске Glassfish из Eclipse, первое, что вы должны попробовать, это запустить Glassfish (вместе с вашим приложением) из командной строки. Если это работает (как я и ожидаю), тогда проблема явно в Eclipse и / или в способе его использования.

Предполагая, что я прав, следующим будет захват и проверка полного набора аргументов командной строки, которые Eclipse использует при запуске JRE для запуска Glassfish. В частности, вам нужно проверить, предоставляет ли Eclipse параметр --bootclasspath и каково его значение.

0 голосов
/ 03 февраля 2010

Попробуйте алгоритм RC4, его легко реализовать.

...