JAVA:128位密钥转换成字符串问题及其反向操作

3
我已经创建了一个SecretkeySpec对象,其中包含一个128位的密钥。 我想将此密钥转换为字符串(稍后需要将此字符串放回原始密钥),因此我使用Base64编码。
这是我的密钥在原始格式中从字节数组转换为字符的方式:
*P??? ?ukL|?~

所以我将字节编码如下。
byte[] okay = Base64.encode(eF.getSpec().getEncoded());

现在当我把它转换成字符时,我得到:

S2xEa3Ara0o5blVGYTB3WkRIeUZmZz09DQo=

现在我希望将我的密钥从Base64编码的数组恢复为其原始格式。

String dkey = "S2xEa3Ara0o5blVGYTB3WkRIeUZmZz09DQo=";

byte[] key = null;
key = dKey.getBytes();
key = Base64.decode(key);

现在我检查结果,得到:

DKlDkp+kJ9nUFa0wZHyFfg==

替代方案:

*P??? ?ukL|?~ 

如您所见,这不是我希望看到的结果。我肯定犯了一个初学者的错误,请原谅我,因为我相对来说还很新手。如果有人能给我一个可行的示例,将128位密钥转换为可读格式,并解释一下我的错误之处,我将不胜感激。

如果有任何拼写错误,我深表歉意,英语不是我的母语。

提前致谢。


你使用的是哪个 Base64 类?它来自 Apache Codec 库吗? - Adam Paynter
eF.getSpec().getEncoded() 是什么意思?我在解码部分没有看到类似的调用。 - casablanca
@casablanca:我猜测这是SecretKeySpec类的getEncoded()方法。如果是这样的话,它应该只返回表示密钥的原始字节。 - Adam Paynter
是的,导入org.apache.commons.codec.binary.Base64; - Rohan
@casablanca:抱歉,但是Adam是正确的。那是原始字节中的密钥。在我的解密部分中,我有我的字符串,我需要将它放回到一个原始字节数组中,表示我的新密钥(应该与我的原始密钥相同,但在我的情况下不是)。 - Rohan
@Rohan:如果你使用Hex类(也在Commons Codec中)对密钥进行编码/解码,会有作用吗?请参见encodeHexStringdecodeHex - Adam Paynter
2个回答

2
S2xEa3Ara0o5blVGYTB3WkRIeUZmZz09DQo=

解码为

KlDkp+kJ9nUFa0wZDHyFfg==.

额外的D字母在开头是否是复制粘贴错误?
KlDkp+kJ9nUFa0wZDHyFfg== 

反过来是一个有效的base64字符串,解码后得到一些二进制数据。因此,似乎您进行了两次编码。

现在当我将其转换为字符时,我得到

您是如何做到这一点的?在这一步中是否涉及另一种base64编码?


我用for循环进行检查:String stringkey = ""; for(byte forbyte : key){ char forchar = (char) forbyte; stringkey += forchar; } System.out.println(stringkey); 我检查了两次我的代码,只有1次对Base64.encode的调用和1次对Base64.decode的调用。这似乎确实是一个打字错误。 - Rohan
@Rohan:也许你应该编辑你的问题,包括所有相关的代码。 - Adam Paynter
确实,他的K1Dk等解码后看起来像是以(*P)开头的原始密钥。Rohan可以检查一下eF.getSpec().getEncoded()输出的内容吗? - lijie
@lijie 实际上,解码我的解码字符串确实给了我原始的128位密钥,但我不明白为什么会这样。因为我对编码一般知识很薄弱。eF.getSpec().getEncoded() 给了我 *P??? ?ukL|?~ 被翻译成字符。 - Rohan

0

你的代码中有一些错误(假设你是从脑海中编写的)。这看起来像是一个可行的版本。请注意,使用这些内部类并不是很聪明的做法(在这里我更喜欢使用例如Apache Commons Codecs库及其org.apache.commons.codec.binary.Base64类)。

package edu.sasik.test.encoding;

import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;

public class TestBase64 {

  public static void main(String[] args) {
    String base64Str = Base64.encode("Hello World!".getBytes());
    System.out.println(base64Str);
    byte[] bytes = Base64.decode(base64Str);
    System.out.println(new String(bytes));
  }

}

输出:

SGVsbG8gV29ybGQh
你好,世界!

希望这可以帮到你。


嗨Jiri,感谢您的回复,但我的情况与之略有不同,因为我有一个需要转换为可读格式的128位密钥。所以我确实按照上面所说进行编码(byte[] okay = Base64.encode(eF.getSpec().getEncoded());)eF.getSpec().getEncoded()确实是密钥,对此我很抱歉没有表述清楚。但是当我解码时,结果与我的输入不同。 - Rohan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接