- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在生成如下所示的 key 对:
public static void main(String args[]) throws Exception{
StringWriter pemStrWriter = new StringWriter();
JcaPEMWriter pemWriter = new JcaPEMWriter(pemStrWriter);
Security.addProvider(new BouncyCastleProvider());
KeyPairGenerator g = KeyPairGenerator.getInstance("ECDSA", "BC");
ECGenParameterSpec spec = new ECGenParameterSpec("secp256r1");
g.initialize(spec);
KeyPair keyPair = g.generateKeyPair();
pemWriter.writeObject(new JcaPKCS8Generator(keyPair.getPrivate(), null));
pemWriter.close();
BufferedWriter writer = new BufferedWriter(new FileWriter("privatekeyjca.pem"));
writer.write(pemStrWriter.toString());
writer.close();
BufferedWriter writer2 = new BufferedWriter(new FileWriter("publickeyjca.pem"));
StringWriter pemStrWriter2 = new StringWriter();
JcaPEMWriter pemWriter2 = new JcaPEMWriter(pemStrWriter2);
pemWriter2.writeObject(keyPair.getPublic());
pemWriter2.close();
writer2.write(pemStrWriter2.toString());
writer2.close();
}
下面是我生成的私钥:
-----BEGIN PRIVATE KEY-----
MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQgVBnFvRMRyO418Oeb
z1YI778gLVNZJn0YI+atgDhTsPagCgYIKoZIzj0DAQehRANCAAQxzPBfVxJfosNl
3tJc+pD0tpftsEy2hWmLc5EK7QbSAtXqqVL2/Zn6JxMbkueRpvIl1/Ag0NvBbnv+
OJfWY2ws
-----END PRIVATE KEY-----
下面是我生成的公钥:
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEMczwX1cSX6LDZd7SXPqQ9LaX7bBM
toVpi3ORCu0G0gLV6qlS9v2Z+icTG5LnkabyJdfwINDbwW57/jiX1mNsLA==
-----END PUBLIC KEY-----
当我转到 JWT.io 并尝试生成 JWT 时,我选择了 ES256 算法,并输入了我的私钥,但它没有提供任何信息。但是,如果我使用通过 openssl 命令生成的私钥,它会给我一个 JWT。
你能告诉我使用 Java 生成的 key 有什么问题吗?
最佳答案
无论 jwt.io 使用什么代码都不必要地脆弱。
当将 PKCS8 用于“EC”(X9.62 样式、ECDSA 和/或 ECDH 和/或相关)私钥时,算法相关部分使用由 https://secg.org 的 SEC1 的附录 C.4 定义的结构:
ECPrivateKey ::= SEQUENCE {
version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),
privateKey OCTET STRING,
parameters [0] ECDomainParameters {{ SECGCurveNames }} OPTIONAL,
publicKey [1] BIT STRING OPTIONAL
}
如您所见,第三个和第四个元素是可选的。当 OpenSSL 编写此结构时,它省略了第三个元素(参数),因为它与外部 PKCS8 的 AlgorithmIdentifier 是冗余的,但包含第四个元素(publicKey),因为虽然在技术上冗余但它可能很有用。
Java 中的 BouncyCaSTLe 包括两者,而 (Oracle/OpenJDK) 标准提供程序 SunEC 两者都不包括。比较 https://crypto.stackexchange.com/questions/80275/converting-raw-ecc-private-key-into-asn-1-der-encoded-key/#80290 包括我的评论。看起来无论 jwt.io 正在运行什么代码——它没有说,我也没有试图弄清楚——被编码为解析 EC 私钥文件,假设 OpenSSL 仅使用组合而没有其他,因此不会适用于 Bouncy 或 SunEC 格式。
将 SunEC 格式转换为 OpenSSL 需要做一些工作——您需要实际执行 dG 的标量乘法,尽管使用 Bouncy 这并不太难。 OTOH 因为你有 Bouncy,将 Bouncy 格式转换为 OpenSSL,通过简单地省略 SEC1 结构中的参数,是相当容易的:
//nopackage
import java.io.OutputStreamWriter;
import java.security.*;
import java.security.spec.ECGenParameterSpec;
import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
import org.bouncycastle.asn1.sec.ECPrivateKey;
import org.bouncycastle.openssl.PKCS8Generator;
import org.bouncycastle.openssl.jcajce.JcaPEMWriter;
import org.bouncycastle.openssl.jcajce.JcaPKCS8Generator;
import org.bouncycastle.util.io.pem.PemObject;
public class SO61676744ECKeyNoParam {
public static void main (String[] args) throws Exception {
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
JcaPEMWriter wr = new JcaPEMWriter(new OutputStreamWriter(System.out));
KeyPairGenerator gen = KeyPairGenerator.getInstance("EC","BC");
gen.initialize(new ECGenParameterSpec("secp256r1"));
KeyPair key = gen.generateKeyPair();
PrivateKeyInfo badp8 = PrivateKeyInfo.getInstance(key.getPrivate().getEncoded());
ECPrivateKey badsec = ECPrivateKey.getInstance(badp8.parsePrivateKey());
ECPrivateKey goodsec = new ECPrivateKey(256, badsec.getKey(), badsec.getPublicKey(), null);
PrivateKeyInfo goodp8 = new PrivateKeyInfo(badp8.getPrivateKeyAlgorithm(), goodsec);
wr.writeObject(new PemObject("PRIVATE KEY", goodp8.getEncoded()));
wr.writeObject(key.getPublic());
wr.close();
}
}
关于Java Bouncy CaSTLe 生成的 ES256 key 不适用于 JWT.io,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61676744/
我有一个案例需要使用 OpenPGP 加密一些文件。我正在使用 Bouncy CaSTLe 这样做。 据我了解,Bouncy CaSTLe 加密可以通过两种方式在 Java 中使用: 我将 Bounc
我想创建一个使用 Bouncy CaSTLe(版本 1.59)实现的 signedAndEnvelopedData (PKCS #7) 数据。 在 Bouncy CaSTLe 中,接口(interfa
我发现了一些使用 Bouncy CaSTLe 加密数据的代码,但我找不到任何文档来说明正在使用哪种算法来加密数据或 key 使用了多少位。我也找不到 Bouncy CaSTLe 的论坛。有谁知道它使用
这个问题已经有答案了: bouncycastle + JBoss AS7: JCE cannot authenticate the provider BC (5 个回答) 已关闭10 年前。 我使用的
我的系统中有一个进程将接收随机纯文本或密文输入。由于性能不是问题,我打算尝试解密所有传入的输入,使用如下伪代码: //get the input, either a plain text, or ci
我一直认为使用 ECFieldElement 对象而不是 BigIntegers 对指数执行算术运算更合适,但根据我的测试,这样做会产生不正确的结果。 测试例程(JUnit): class Arith
我正在尝试从 smime.p7s 文件中读取证书,证书链是: Baltimora Cyber Trust --> DigitPA --> Aruba PEC 因此,当我尝试提取时,我只检索到最后两
我正试图找到一种方法来消除移动设备上的 flex 滚动行为(例如,当下面没有内容可滚动时,您仍然可以滚动内容并将内容滚动到顶部,当释放时它会弹跳返回) 我的html结构是这样的
我正在使用来自Codyhouse的这个很棒的弹性过滤器但我一生都无法弄清楚如何让它自动运行,即自行翻转并仍然接受用户点击事件。 jsfiddle ...谢谢。 jQuery(document).rea
考虑正数的以下定义: 如果从左到右它的数字永远不会变小,则该数字是非递减的。例如,12345和 3388 是非递减的。 如果从左到右它的数字从不变大,则该数是非递增的。例如,987542 和881个没
我使用 WPF ScrollViewer 来托管一些控件。我真的很希望它能像在触摸设备上那样进行交互,当你将它拉得太远时,它会慢慢回到原位。 它没有滚动条 - 我使用此代码通过单击和拖动手动滚动鼠标:
我有一个使用 Bouncy CaSTLe 进行 PGP 解密的应用程序,它在过去 8 个月左右的时间里运行没有任何问题,而在过去的 2 天里突然出现了一个问题,其中 GetDataStream 方法抛
我有一个 PEM 或 DER 私钥,一个现有的 key 。如何加载此 key PrivateKeyFactory.createKey or into an AsymmetricCipherKeyPai
我正在查看 Bouncy CaSTLe,看看它的哈希算法的性能与 .NET Framework 的性能相比如何,它看起来不太好; MD5 实现比 .NET 慢 6 倍左右,SHA256 实现比 .NE
我正在寻找 Bouncy CaSTLe PGP“签名和加密”的实现。理想情况下,如果这有什么不同的话,只需一次操作即可。 我已经采取了 encrypt example和 signing example
我正在按照此处的示例:http://www.baeldung.com/java-bouncy-castle 我有几个问题: public static byte[] encryptData(byte[
我正在尝试用 C# 签署比特币交易。我有 2 位代码正在尝试完成。我可以使用 Bouncy caSTLe 创建一组私钥和公钥。我可以将其转换为钱包导入格式。 我还可以从 ECDSA 公钥生成比特币地址
我正在查看 Bouncy CaSTLe,看看它的哈希算法的性能与 .NET Framework 的性能相比如何,它看起来不太好; MD5 实现比 .NET 慢 6 倍左右,SHA256 实现比 .NE
我很确定没有,但我想确认 Bouncy CaSTLe for Java 中的 SCrypt 实现 SCrypt.generate() 是否在结果中包含参数(例如NodeJS 的实现确实如此)。 最佳答
我正在使用 bouncy caSTLe 1.48 通过 OCSP 验证证书验证。效果很好。但我使用 Ocsp Url 作为静态变量,我想从证书中读取它。证书中的 URL 写为Authority Inf
我是一名优秀的程序员,十分优秀!