【问题标题】:Encrypt a hex string in java在java中加密一个十六进制字符串
【发布时间】:2011-01-12 11:43:53
【问题描述】:

我想就我的问题寻求任何建议。我需要加密一个十六进制字符串。我不能使用 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 服务器)上时发生异常,它说没有这样的算法。

【问题讨论】:

  • 您永远不应该编写自己的加密算法。 ...您的意思是,内置功能在您的服务器上不起作用?
  • “因为它在我的服务器上不起作用”! - 听起来不像是放弃工业级算法的理由,这些算法是由科学家团队将他们生命中的大部分时间奉献给加密领域的多年研究而创建的。
  • 清晰和细节是获得满意答案的关键
  • “它不起作用”不是很有帮助 - 请详细说明在您的服务器上尝试使用它时会发生什么。
  • @twinwins - 毫无疑问,您正在以艰难的方式解决您的问题。简单的方法是找出阻止在 Glassfish 上运行的加密的配置问题。修复起来可能非常简单……如果您提供更多详细信息,我们可能会有所帮助。

标签: java encryption hex


【解决方案1】:

试试RC4算法,很容易实现。

【讨论】:

  • 听说 ROT13 也很容易实现 :-)
  • 嗨!我在给我这个时尝试了这个算法,我很感激。我试过了,但后来我注意到加密的字符串中有不需要的字符。我怎样才能使它成为一个没有不良字符的字符串?非常感谢。
  • 嗯,很明显......如果将 HEX 字符串输入加密算法,则输出不太可能是 HEX 字符串。如果这是一个问题,您可能应该在转换为 HEX 之前加密您的数据。
【解决方案2】:

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

您说当您将它作为命令行应用程序运行时它可以工作 - 我假设您的意思是在您的桌面上。你可以在服务器上做同样的事情吗?

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

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

【讨论】:

  • 嗨。这是我的java版本。我的操作系统是fedora。 java version "1.6.0_13" Java(TM) SE Runtime Environment (build 1.6.0_13-b03) Java HotSpot(TM) Client VM (build 11.3-b02,混合模式,共享)
  • @twinstwins:我强烈怀疑(或至少 希望)这不是在 Web 服务器上运行的版本(假设它正在使用客户端 VM)。 你的服务器在运行什么?
【解决方案3】:

这个问题很可能是由于 Glassfish 启动时有效的 Java 引导类路径存在某种问题。当从 IDE 启动应用服务器时,这通常会很麻烦。例如:

> 在 30-5-2005 8:00,Uwe Peuker 写道: > > 这可能是由 Eclipse 如何/何时通过的方式引起的 > 正在生成的 java 可执行文件的 -Xbootclasspath 参数 > 推出。 > > 不知道 3.1RC1,但对于旧版本,这取决于设置 > JRE 配置中的“使用系统默认库”(Window -> > 首选项 -> Java -> 已安装的 JRE ->(选择 JRE)-> 编辑) > > 当“使用系统默认库”未选中(关闭)时,Eclipse 添加 > -Xbootclasspath 参数 -- 连同列表中的所有库 -- 到 > java 可执行文件。如果列表不包括加密库,它 > 导致 NoSuchAlgorithmException。 > 否则,当勾选“使用系统默认库”时,Eclipse 不会 > 添加 -Xbootclasspath,因此它允许 java 可执行文件发现它自己的 > 引导类路径,包括加密库。 > -- > 问候, > > 罗兰德鲁特 > ___ ___ > /__/ w_/ /__/ > / \ /_/ / \

编辑:回应 OP 的评论:

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

无论如何,由于从 Eclipse 启动 Glassfish 时会出现问题,因此您应该尝试的第一件事是从命令行启动 Glassfish(使用您的应用程序)。如果这有效(如我所料),那么问题显然出在 Eclipse 和/或您使用它的方式上。

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

【讨论】:

  • 嗨罗纳德!我的 Eclipse 版本是 Eclipse 平台版本:3.4.2 我去了你说的 JRE 配置,但是我似乎没有看到“使用系统默认库”和它的复选框。这也是我的假设,它只是阻碍我使用 javax.crypto 的库的路径。
【解决方案4】:

自己实现一些密码算法具有很大的教学价值,但要做到正确并不容易。对于对称加密,通常推荐使用 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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 2022-12-05
    • 2015-01-01
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    相关资源
    最近更新 更多