我正在尝试从SubjectPublicKeyInfo 获取公钥。但是当我尝试时:
PublicKey publicKey = k.generatePublic(keypsec);
byte[] encoded=publicKey.getEncoded();
SubjectPublicKeyInfo subPkInfo2 = new SubjectPublicKeyInfo(rsaEncryption, encoded);
RSAPublicKeyStructure pubKey = new RSAPublicKeyStructure((ASN1Sequence)subPkInfo2.getPublicKey());
Run Code Online (Sandbox Code Playgroud)
它抛出这个
java.lang.IllegalArgumentException: illegal object in getInstance: org.bouncycastle.asn1.DERSequence
at org.bouncycastle.asn1.DERInteger.getInstance(DERInteger.java:37)
at org.bouncycastle.asn1.x509.RSAPublicKeyStructure.<init>(RSAPublicKeyStructure.java:63)
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?我尝试过 PubliKeyFactory 但它只是调用最后一行。
PrivateKeya 转成Stringwith的方法有哪些
-----BEGIN PRIVATE KEY-----并且-----END PRIVATE KEY-----可以用作要上传到服务器的私钥文件。
其实现是sun.security.rsa.RSAPrivateCrtKeyImpl和getFormat()是PKCS#8。
我正在尝试生成 ECDSA 自签名证书,如使用 ECDSA 生成证书中所述。将 bartonjs 的答案中的所有部分放在一起并使用Net.Framework 4.7(或Net.Core 2.0) 以下代码似乎有效,尽管还存在一些歧义(至少一个):
我不确定如何正确地将私钥(“D”参数)从 转换BC-BigInteger为MS-byte[]. 使用BigInteger.ToByteArray()抛出异常:
CryptographicException:指定的关键参数无效。QX 和 QY 是必填字段。QX、QY 的长度必须相同。如果指定了 D,则它必须与命名曲线的 QX 和 QY 长度相同,或者与显式曲线的 Order 长度相同。
同时验证 ECParameters(方法ECParameters.Validate())。使用BigInteger.ToByteArrayUnsigned()提供了更好的结果(数百个生成的密钥对中的一个失败),但仍然......
使用ToByteArray()转换后的“D”通常会长一个字节(“D”有 33 个字节,而 DX 和 DY 有 32 个字节)。使用ToByteArrayUnsigned()“D”有时会短一个字节。
所以我的问题是是否可以使用ToByteArrayUnsigned()。
private const string NCryptExportPolicyProperty = "Export Policy";
private const string SignatureAlgorithm = "Sha256WithECDSA";
private static readonly ECCurve MsCurve = ECCurve.NamedCurves.nistP256; …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用任何 AES GCM 变体进行 TLS 连接,根据我在文档中的理解,这应该是可能的,但我收到此错误:
Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.Alerts.getSSLException(Alerts.java:154)
at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1989)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1096)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1342)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1369)
Run Code Online (Sandbox Code Playgroud)
问题是我尝试连接的服务器只接受这些密码:
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_AES_256_GCM_SHA384
TLS_RSA_WITH_AES_128_GCM_SHA256
Run Code Online (Sandbox Code Playgroud)
我无法在此处发布我尝试连接的服务器,但我尝试在 github 存储库上复制该问题。我找不到只接受这些密码套件的服务器,这就是为什么我的 repo 因另一个错误而失败。
git clone https://github.com/andreicristianpetcu/gcm_with_bc_onjdk17
cd gcm_with_bc_onjdk17
JAVA_HOME="/usr/lib/jvm/java-7-openjdk-amd64/jre" mvn clean install
Run Code Online (Sandbox Code Playgroud)
基本上这是来自 GitHub 的代码
package com.github.gcm_with_bc_onjdk17;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContexts;
import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.net.ssl.SSLContext;
import java.io.IOException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import …Run Code Online (Sandbox Code Playgroud) C# BouncyCastle 包含一个名为 Org.BouncyCastle.Utilities.IO.Pem.PemReader 的类,该类似乎采用 PEM 格式的 RSA 公钥文件。我查看了这个链接:how can I conversion pem public key to rsa public key with bouncycastle in c#?
但它似乎在 PemReader 上使用了不存在的方法,称为 ReadObject。所以我改为编写以下代码。
var pemReader = new PemReader(File.OpenText(@"...rsa public key file path ..."));
var pemObject = pemReader.ReadPemObject();
var rsaPublicKeyBytes = pemObject.Content;
Run Code Online (Sandbox Code Playgroud)
一旦我获得 RSA 公共字节,我不知道如何进一步进行。我希望能够执行以下操作:
var rsaCipher = new RsaEngine();
var oaepEncoding = new OaepEncoding(rsaCipher, new Sha256Digest());
var publicKey = new RsaKeyParameters(...);
oaepEncoding.Init(true, publicKey);
var actualEncryptedBytes = oaepEncoding.ProcessBlock(plainBytes, 0, plainBytes.Length);
Run Code Online (Sandbox Code Playgroud)
我想我不确定如何使用 RSA 公共字节构造 RsaKeyParameters。有人能指出我正确的方向吗?或者我在这里完全走错路了?
我有以下代码来提取私钥
PEMParser parser = new PEMParser(new InputStreamReader(new ByteArrayInputStream(decoded)));
Object object = parser.readObject();
PEMDecryptorProvider provider = new JcePEMDecryptorProviderBuilder()
.build(props.getProperty(KeytoolFlags.KEYPASS.name()).toCharArray());
JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider(BouncyCastleProvider.PROVIDER_NAME);
if (object instanceof PEMEncryptedKeyPair) {
KeyPair pair = converter.getKeyPair(((PEMEncryptedKeyPair) object).decryptKeyPair(provider));
return loadPublic ? pair.getPublic() : pair.getPrivate();
} else if (object instanceof PEMKeyPair) {
return loadPublic ? converter.getPublicKey(((PEMKeyPair) (object)).getPublicKeyInfo())
: converter.getPrivateKey(((PEMKeyPair) (object)).getPrivateKeyInfo());
} else {
InputDecryptorProvider p2 = new JceOpenSSLPKCS8DecryptorProviderBuilder()
.setProvider(BouncyCastleProvider.PROVIDER_NAME)
.build(props.getProperty(KeytoolFlags.KEYPASS.name()).toCharArray());
return converter.getPrivateKey(((PKCS8EncryptedPrivateKeyInfo) object).decryptPrivateKeyInfo(p2));
}
Run Code Online (Sandbox Code Playgroud)
我想从转换器获取公钥JceOpenSSLPKCS8DecryptorProviderBuilder。有什么办法吗?
谢谢,
我正在尝试使用 Org.BouncyCastle.X509 转储证书吊销列表(CRL)的内容。在此用例中,我需要获取“十六进制”字符串表示形式的证书序列号列表,正如它们出现在证书 MMC 管理单元中一样(示例值为16a03c2c000000000594)。
\n\n我能够达到这样的程度:我有一个 X509CRLEntry 对象的集合可供迭代,但SerialNumber属性的类型为Org.BouncyCastle.Math.BigInteger。这种类型有一个ToString()的实现,但是,返回的值对我来说不可用:
\n\npublic CRLProc(string CRLFile)\n {\n X509CrlParser Parser = new X509CrlParser();\n X509Crl CRL = Parser.ReadCrl(File.ReadAllBytes(CRLFile));\n NextUpdate = CRL.NextUpdate.Value;\n var RevokedCerts = CRL.GetRevokedCertificates();\n\n foreach(X509CrlEntry entry in RevokedCerts)\n {\n //Target value (first SN in CRL): 16a03c2c000000000594\n\n string serialNumber = entry.SerialNumber.ToString();\n //serialNumber = "106847877515466973906324" (Nope)\n\n string serialFromBytes = Encoding.Default.GetString(entry.SerialNumber.ToByteArray());\n //serialFromBytes = "\\u0016\xc2\xa0<,\\0\\0\\0\\0\\u0005\xe2\x80\x9d" (That\'s a hard NO)\n\n string serialFromBigInt = entry.SerialNumber.LongValue.ToString("X");\n //serialFromBigInt = "3C2C000000000594" (OK, now we\'re getting …Run Code Online (Sandbox Code Playgroud) 我正在尝试测试转换为 Vb.Net 的 iText 文档示例,但是在执行 pdfSigner.SignDetached(...) 时,我遇到了下一个奇怪的异常
MissingMethodException:'System.Collections.IEnumerator Org.BouncyCastle.Asn1.Asn1Sequence.GetObjects()'
代码成功读取 pfx 证书和源文件,并创建目标文件,但在最后一步失败,导致目标文件损坏:
Imports System.IO
Imports Org.BouncyCastle.Crypto
Imports Org.BouncyCastle.X509
Imports iText.Kernel.Geom
Imports iText.Kernel.Pdf
Imports iText.Signatures
Imports Org.BouncyCastle.Pkcs
Public Class SignHelloWorld
Public Shared ReadOnly root As String = Environment.GetFolderPath(Environment.SpecialFolder.Personal) & "\tmp\itext7\"
Public Shared ReadOnly DEST As String = root & "results\signatures\chapter01\"
Public Shared ReadOnly KEYSTORE As String = root & "resources\encryption\myCert.pfx"
Public Shared ReadOnly SRC As String = root & "resources\pdfs\hello.pdf"
Public Shared ReadOnly PASSWORD As Char() = "1234".ToCharArray()
Public Shared ReadOnly …Run Code Online (Sandbox Code Playgroud) 这是BouncyCastle 的 OpenBSD BCrypt 实现 v1.66 版本的“检查哈希值是否相等”代码:
for (int i = 0; i != sLength; i++){
isEqual &= (bcryptString.indexOf(i) == newBcryptString.indexOf(i));
}
Run Code Online (Sandbox Code Playgroud)
其中sLength保证为 60(参见第 268 行),并且 bcryptString 是完整的 openbsd 风格的 bcrypt 字符串,例如$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a.
错误在于所使用的方法:他们打算使用charAt.
此循环的目的是检查从 0 到 59 的每个位置,位置iin的字符是否与位置ina的字符相同。ib
但是,由于错误使用indexOf(int), 相反,这会检查unicode in的第一个字符的位置是否与 unicode in的第一个字符的位置匹配,其中 'not in string' 匹配 'not in string'iaib。
示例:"Hello".indexOf(101)返回1(java是从0开始的,101是unicode的e,e是第二个字符)。 …
我正在尝试使用 bouncycastle 在我的 java 程序中实现 curve25519,这是我想出的代码:
package crypto;
import org.bouncycastle.asn1.x9.X9ECParameters;
import org.bouncycastle.crypto.ec.CustomNamedCurves;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.jce.spec.ECParameterSpec;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.security.*;
public class Curve {
public KeyPair generateKeyPair() throws NoSuchAlgorithmException, InvalidAlgorithmParameterException {
X9ECParameters ecP = CustomNamedCurves.getByName("curve25519");
ECParameterSpec ecSpec = new ECParameterSpec(ecP.getCurve(), ecP.getG(), ecP.getN(), ecP.getH(), ecP.getSeed());
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC", new BouncyCastleProvider());
keyGen.initialize(ecSpec);
return keyGen.generateKeyPair();
}
}
Run Code Online (Sandbox Code Playgroud)
而我的主要方法:
package crypto;
import java.nio.charset.StandardCharsets;
import java.security.InvalidAlgorithmParameterException;
import java.security.KeyPair;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
public class Test_Curve {
public static …Run Code Online (Sandbox Code Playgroud) bouncycastle ×10
java ×4
c# ×3
public-key ×3
cryptography ×2
.net-core ×1
aes-gcm ×1
algorithm ×1
base64 ×1
certificate ×1
ecdsa ×1
encryption ×1
itext ×1
java-7 ×1
java-me ×1
math ×1
rsa ×1
ssl ×1
vb.net ×1
x509 ×1