当前位置: 首页 > 知识库问答 >
问题:

从Bouncy Castle Java获取原始密钥

颜霖
2023-03-14
    public static KeyPair GenerateKeys() throws NoSuchAlgorithmException,
        NoSuchProviderException, InvalidAlgorithmParameterException {
        ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec("secp256r1");
        KeyPairGenerator g = KeyPairGenerator.getInstance("ECDSA", "BC");

        g.initialize(ecSpec, new SecureRandom());

        return g.generateKeyPair();
    }

并希望将它们存储为字节数组,因为稍后我需要将它们导出到我的C应用程序中。我注意到了:

        KeyPair vendorKeys = GenerateKeys();
        for (byte byt : vendorKeys.getPublic().getEncoded()) {
            System.out.println("byt: " +  byt);
        }

将返回公钥的字节,但长度错误。我想它与以下格式有关:公开密钥的X.509和私有密钥的PKCS#8。在寻找帮助时,我发现Java中有一些类,如pkcs8encodedkeyspec,可以帮助我获取原始密钥,但我不知道如何做到这一点。

共有1个答案

姚烨
2023-03-14

私钥或公钥的x和y坐标可以通过BouncyCastle的实现ecprivatekeyecpublickey来确定。使用getd()可以确定私有密钥,使用getq()可以确定公钥,例如:

import org.bouncycastle.jce.interfaces.ECPrivateKey;
import org.bouncycastle.jce.interfaces.ECPublicKey;
import org.bouncycastle.util.BigIntegers;
import org.bouncycastle.util.encoders.Hex;
...
ECPublicKey publickKey = (ECPublicKey)vendorKeys.getPublic();
ECPrivateKey privateKey = (ECPrivateKey)vendorKeys.getPrivate();
byte[] rawPrivate = BigIntegers.asUnsignedByteArray(privateKey.getD());
byte[] x = publickKey.getQ().getAffineXCoord().getEncoded();
byte[] y = publickKey.getQ().getAffineYCoord().getEncoded();        
byte[] rawPublic = ByteBuffer.allocate(x.length + y.length).put(x).put(y).array();

System.out.println(Hex.toHexString(rawPrivate));
System.out.println(Hex.toHexString(rawPublic));

这里的secp256r1公钥的长度始终为64字节。私钥的大小为32字节,但也可以更小。

dave_thompson_085在他的评论(Java.security.interfaces)中指出了ecpublickeyecprivatekey的内置Java实现。这里,私钥和公钥的对应方法分别是get()getw()
在x或y小于32字节的情况下,此实现不会自动填充前导的0x00值,因此必须手动完成。因此,BouncyCastle方法对您来说可能更方便,因为您已经使用了BouncyCastle。

 类似资料:
  • 问题内容: 在我的应用程序中,我使用来显示一些日志信息。因为我想突出显示文本中的某些特定行(例如错误消息),所以将设置为“ ”。这样,我可以设置文本格式。 现在,我创建一个JButton,将其内容复制到剪贴板中。这部分很简单,但是我的问题是,当我调用时,我得到了HTML代码,例如: 而不是只获取原始内容: 有没有办法只获取纯文本格式的内容?还是我需要自己将HTML转换为原始文本? 问题答案: 基于

  • 问题内容: 我在相当基本的android开发水平上。 我想从诸如“ http://www.google.com”的页面获取文本。(我将使用的页面只有文本,因此没有图片或类似的东西)所以,要明确:我想将页面上的文本写入应用程序中的字符串等。 我尝试了这段代码,但是我什至不知道它是否能满足我的要求。 无论如何我都无法收到任何文字。我应该怎么做? 问题答案: 从您提供的示例代码中,您甚至没有读取请求的响

  • 问题内容: 有没有办法从获取原始/原始JSON值? 问题: 现在是,但是我需要原始字符串。 有没有办法获得这个原始价值?另外,我无法更改创建方式(例如更改设置),因为它作为参数传递给我的课程… (参考:原始的NJsonSchema问题) 问题答案: 您无法获取原始字符串,无法识别日期字符串并将其转换为自身内部的结构。如果您这样做,则可以看到以下内容: 但是,您可以通过执行以下操作以ISO 8601

  • 问题内容: 我在视图中有一个附加的项目清单: 我正在处理指令中函数中的click事件,将其作为对被单击对象的引用,但是我得到的是对标签的引用,而不是对标签的引用。然后,我必须做这样的事情才能得到: 有没有一种简单的方法可以获取对绑定元素的引用,而无需在我的指令中执行DOM操作? 问题答案: 您需要代替。

  • 问题内容: 我已经在JAX-WS中设置了SOAP WebServiceProvider,但是在弄清楚如何从SOAPMessage(或任何Node)对象中获取原始XML时遇到了麻烦。这是我现在所获取的代码示例,也是我尝试获取XML的地方: 是否有一种简单的方法来获取原始请求的XML?如果有一种方法可以通过设置其他类型的Provider(例如Source)来获取原始XML,那么我也愿意这样做。 问题答

  • 问题内容: 我正在尝试从文件夹中包含在项目中的原始文件获取。但是无论如何,我都会得到一个。 该文件是一个文件,也尝试过使用,也不起作用。使用DOES 播放两个文件都可以。 的回报: 我的代码: 错误: 问题答案: 尝试这种方法,用作您的inputStream。沿着这个地方: 返回一个InputStream 编辑:如果您使用上述方法,请删除这些代码 希望这有帮助,祝你好运!^^