我想问一下有关我的问题的任何建议。我需要加密十六进制字符串。我不能使用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服务器时发生了一个异常,它说没有这样的算法。
答案 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;标准提供商列表可能会有所不同。)