Java 关键材料和实际关键材料之间的差异

Java 关键材料和实际关键材料之间的差异,java,cryptography,Java,Cryptography,我对使用Java库生成密钥时的密钥材料感到困惑 根据SecretKeySpec文件 public byte[] getEncoded() 返回此密钥的密钥材料 关键材料到底是什么,因为如果我试着打印任何像这样的钥匙 System.out.print(secretKey.getEncoded()) 我得到了奇怪的输出,比如 s[B@541187f9 但是,当我使用任何编码方案(如Base64、Base16)打印它时,我会得到实际的密钥 有人能解释什么是关键材料吗?SecretKeySpec用

我对使用Java库生成密钥时的密钥材料感到困惑

根据SecretKeySpec文件

public byte[] getEncoded()
返回此密钥的密钥材料

关键材料到底是什么,因为如果我试着打印任何像这样的钥匙

System.out.print(secretKey.getEncoded())
我得到了奇怪的输出,比如

s[B@541187f9
但是,当我使用任何编码方案(如Base64、Base16)打印它时,我会得到实际的密钥


有人能解释什么是关键材料吗?

SecretKeySpec用于对称算法。这些算法只有一个密钥,即位字符串。在Java中,它表示为字节数组(
byte[]
)。非对称算法密钥的编码是

至于“怪异”的输出,数组在Java中是不可打印的,因此只打印引用。如果您甚至想专门打印
字节[]
,这也行不通,因为通常文本应该只使用可打印的字符。这就是为什么将其编码为Base64可以打印密钥,但也会使密钥膨胀


在文档中,他们可能会讨论密钥材料,因为它返回实际的密钥字节,而不包含诸如密钥对应的算法之类的附加信息。

SecretKeySpec用于对称算法。这些算法只有一个密钥,即位字符串。在Java中,它表示为字节数组(
byte[]
)。非对称算法密钥的编码是

至于“怪异”的输出,数组在Java中是不可打印的,因此只打印引用。如果您甚至想专门打印
字节[]
,这也行不通,因为通常文本应该只使用可打印的字符。这就是为什么将其编码为Base64可以打印密钥,但也会使密钥膨胀

在文档中,他们可能会讨论密钥材料,因为它返回的是实际的密钥字节,而没有其他信息,例如密钥对应的算法

byte[] keyBytes = /* set the key somehow */;
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
Arrays.equals(keyBytes, keySpec.getEncoded()); // true