gpt4 book ai didi

Java:将公钥从字节数组转换为字符串并返回时出错

转载 作者:行者123 更新时间:2023-11-30 07:12:49 24 4
gpt4 key购买 nike

我有一个奇怪的错误,我找不到解决方案来修复。

因此我生成了一个公私 key 对,将其转换为字节数组,然后通过数组从中恢复原始 key 。没有错误

  {  

KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024);
KeyPair keyPair = kpg.generateKeyPair();
PublicKey pub = keyPair.getPublic();
byte[] pubBytes = pub.getEncoded();

try
{
// to recover the key
KeyFactory kf = KeyFactory.getInstance("RSA");

PublicKey pub_recovered = kf.generatePublic(new X509EncodedKeySpec(pubBytes));

}
catch(Exception e)
{
System.out.println(e.getMessage());
}

System.out.println("Finish");

之后我重复相同的步骤,但在恢复 key 之前,我将字节数组转换为字符串,然后再返回。在这种情况下,我得到错误。

     KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024);
KeyPair keyPair = kpg.generateKeyPair();
PublicKey pub = keyPair.getPublic();
byte[] pubBytes = pub.getEncoded();

try
{

String pub1 = new String(pubBytes, "UTF-8");

byte[] pub2 = pub1.getBytes("UTF-8");

// to recover the key
KeyFactory kf = KeyFactory.getInstance("RSA");

PublicKey pub_recovered = kf.generatePublic(new X509EncodedKeySpec(pub2));

}
catch(Exception e)
{
System.out.println(e.getMessage());
}

错误发生在一行:

PublicKey pub_recovered = kf.generatePublic(new X509EncodedKeySpec(pub2));

它说:

java.security.InvalidKeyException: IOException: DerInputStream.getLength(): lengthTag=111, too big.

有谁知道如何解决以及为什么通常会发生这种情况?该消息显示无效 key 异常,但是由于它在第一种情况下有效,我更倾向于在字节转换期间发生错误。这根本没有意义。

最佳答案

key 包含任意字节。这些字节不一定代表有效的 UTF8 字符。所以你不应该将它们转换为字符串,因为这是一种有损转换。如果你真的需要一个字符串,那么使用 Hex 或 Base64 编码。

为了让您了解错误所在,假设您使用的是 ASCII 而不是 UTF8。 ASCII 字符从 0 到 127。所有其他 128 字节值不代表有效字符。因此,如果键包含这些值中的任何一个,则转换为 String 会丢失它们。任何编码(IIRC、ISO8859-1 除外)基本上都是一样的。

关于Java:将公钥从字节数组转换为字符串并返回时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20032865/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com