在java中加密十六进制字符串

时间:2010-02-03 05:09:59

标签: java encryption hex

我想问一下有关我的问题的任何建议。我需要加密十六进制字符串。我不能使用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 个答案:

答案 0 :(得分:2)

忘记更改代码 - 整理环境。

你说当你作为一个命令行应用程序运行它时它会起作用 - 我认为你的意思是你的桌面。你能在服务器上做同样的事吗?

您在每个地方使用的是哪个版本的Java?确保检查Glassfish中使用的版本 - 它可能与您在命令行上运行java -version时获得的版本不同。

顺便说一句,我希望您的真正的代码不会吞下这样的异常。

答案 1 :(得分:0)

尝试使用RC4算法,它很容易实现。

答案 2 :(得分:0)

问题很可能是由于Glassfish启动时生效的Java bootclasspath的某些内容。当从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_/ /__/
> / \ /_/ / \

编辑:回应OP的评论:

(如果不是很明显,我既不是Roland de Ruiter也不是Uwe Peuker。我刚刚在Google搜索中发现了这封电子邮件,并将其发布在此处供您参考。)

无论如何,由于从Eclipse启动Glassfish时出现问题,首先应该尝试从命令行启动Glassfish(使用您的应用程序)。如果这样可行(正如我预期的那样),那么问题显然在于Eclipse和/或您使用它的方式。

假设我是对的,接下来将捕获并检查Eclipse在启动JRE以运行Glassfish时使用的完整命令行参数集。特别是,您需要查看Eclipse是否提供了--bootclasspath选项及其值是什么。

答案 3 :(得分:0)

自己实施某些加密算法具有很好的教学价值,但要做到这一点并不容易。对于对称加密,通常的建议是AES,在FIPS-197中的详细(非常清晰)细节中对此进行了描述。 AES是块密码,即它加密16字节的块。要加密“消息”(假设长度超过16个字节),您需要一些链接和填充(将消息转换为一些16字节块以供AES处理的约定集);这也不是很容易。有关填充和链接的介绍,请参阅this Wikipedia entry

然而,无法访问标准Java加密实现是可疑的。你应该先尝试诊断它。尝试列出(带有一些Java代码)注册的提供者,代码如下:

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

然后将输出与the documentation指定的内容进行比较。特别是list of Sun providers

(注意:我们谈论的是服务器VM - 运行代码的地方 - 它可能是来自其他供应商的虚拟机,例如IBM;标准提供商列表可能会有所不同。)