我正在使用Sun的keytool创建一个Bouncy城堡密钥库并将证书导入其中.keytool确实生成了Bouncy城堡格式的密钥库.
然后我尝试将Bouncy城堡密钥库导入Android程序.我能够获得"BKS"密钥库的实例,但是在密钥库上调用load会抛出
"java.io.IOException: Wrong version of key store".
Run Code Online (Sandbox Code Playgroud)
这是代码
KeyStore keyStore = KeyStore.getInstance("BKS");
InputStream is = new FileInputStream("/mnt/sdcard/ArcGIS/mystore.bks");
keyStore.load(is, "abcdef".toCharArray());
Run Code Online (Sandbox Code Playgroud)
我尝试从http://www.bouncycastle.org/latest_releases.html下载的各种版本的Bouncy castle JAR
我究竟做错了什么?
谢谢,Ranjit
我正在尝试使用bouncycastle 1.46生成X509证书,代码如下.我遇到的问题是,当证书在JKS中写入然后重新读取时,DN会被反转.例如,如果我运行下面的代码,我得到以下输出:
CN=test,O=gina
CN=test,O=gina
CN=test,O=gina
O=gina, CN=test
Run Code Online (Sandbox Code Playgroud)
有人知道这个的原因吗?怎么避免呢?提前致谢.
码:
public static void main(String[] args) {
try {
Security.addProvider(new BouncyCastleProvider());
KeyPair pair = generateKeyPair("RSA", 1024);
X500Name principal = new X500Name("cn=test,o=gina");
System.out.println(principal);
BigInteger sn = BigInteger.valueOf(1234);
Date start = today();
Date end = addYears(start, 2);
X509Certificate cert = generateCert(principal, pair, sn, start, end,
"SHA1withRSA");
cert.verify(pair.getPublic());
System.out.println(cert.getSubjectDN());
// Store the certificate in the JKS
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(null, null);
ks.setKeyEntry("alias", pair.getPrivate(), KEY_PWD,
new X509Certificate[] {cert});
X509Certificate c
= (X509Certificate)ks.getCertificateChain("alias")[0];
System.out.println(c.getSubjectDN());
OutputStream out …Run Code Online (Sandbox Code Playgroud) 我正在Java/Android中实现加密代码以匹配iOS加密.在iOS中,使用以下填充方案使用RSA加密:PKCS1-OAEP
但是当我尝试用PKCS1-OAEP创建Cipher时.
Cipher c = Cipher.getInstance("RSA/None/PKCS1-OAEP", "BC");
Run Code Online (Sandbox Code Playgroud)
下面是堆栈跟踪
javax.crypto.NoSuchPaddingException: PKCS1-OAEP unavailable with RSA.
at com.android.org.bouncycastle.jcajce.provider.asymmetric.rsa.CipherSpi.engineSetPadding(CipherSpi.java:240)
at javax.crypto.Cipher.getCipher(Cipher.java:324)
at javax.crypto.Cipher.getInstance(Cipher.java:237)
Run Code Online (Sandbox Code Playgroud)
也许这RSA/None/PKCS1-OAEP是不正确的?但无法找到任何明确的答案,要么说PKCS1-OAEP不受支持,要么是正确的定义方式.
我正在使用spongycastle库,所以有完整的bouncycastle实现.
我正在尝试实现ECDSA(椭圆曲线数字签名算法),但我在Java中找不到任何使用Bouncy Castle的例子.我创建了密钥,但我真的不知道我应该使用什么样的函数来创建签名并验证它.
public static KeyPair GenerateKeys()
throws NoSuchAlgorithmException, NoSuchProviderException, InvalidAlgorithmParameterException
{
ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec("B-571");
KeyPairGenerator g = KeyPairGenerator.getInstance("ECDSA", "BC");
g.initialize(ecSpec, new SecureRandom());
return g.generateKeyPair();
}
Run Code Online (Sandbox Code Playgroud) 我正在开发一个需要在(NIST P-256,P-256,prime256v1)公钥SHA256withECDSA的帮助下验证签名的应用程序secp256r1.
公钥在某个较早的时间点由不同的应用程序生成,并以十六进制编码存储在我的数据库中.这里十六进制字符串的格式等同于OpenSSL在调用先前生成openssl ec -in x.pem -noout -text的文件时将生成的十六进制字符串.消息和签名是从不同的应用程序接收的.请考虑以下测试数据:x.pemopenssl ecparam -genkey -name secp256r1 -out x.pem
// Stored in Database
byte[] pubKey = DatatypeConverter.parseHexBinary("049a55ad1e210cd113457ccd3465b930c9e7ade5e760ef64b63142dad43a308ed08e2d85632e8ff0322d3c7fda14409eafdc4c5b8ee0882fe885c92e3789c36a7a");
// Received from Other Application
byte[] message = DatatypeConverter.parseHexBinary("54686973206973206a75737420736f6d6520706f696e746c6573732064756d6d7920737472696e672e205468616e6b7320616e7977617920666f722074616b696e67207468652074696d6520746f206465636f6465206974203b2d29");
byte[] signature = DatatypeConverter.parseHexBinary("304402205fef461a4714a18a5ca6dce6d5ab8604f09f3899313a28ab430eb9860f8be9d602203c8d36446be85383af3f2e8630f40c4172543322b5e8973e03fff2309755e654");
Run Code Online (Sandbox Code Playgroud)
现在这应该是一个有效的签名.
我的目标是使用Java和/或Bouncycastle加密API验证消息上的签名.我已经isValidSignature为此创建了一个方法:
private static boolean isValidSignature(byte[] pubKey, byte[] message,
byte[] signature) throws NoSuchAlgorithmException, NoSuchProviderException, InvalidKeyException, SignatureException, InvalidKeySpecException {
Signature ecdsaVerify = Signature.getInstance("SHA256withECDSA", new BouncyCastleProvider());
ecdsaVerify.initVerify(getPublicKeyFromHex(pubKey));
ecdsaVerify.update(message);
return ecdsaVerify.verify(signature);
}
Run Code Online (Sandbox Code Playgroud)
我试图提取公钥:
KeyFactory.generatePublic:
private static …Run Code Online (Sandbox Code Playgroud) 我注意到有两个用于Java的bouncycastle提供程序库; bcprov和bcprov-ext.他们有什么不同?如何选择使用哪个?
我正在尝试将装甲ECC gpg密钥转换为相应的java类ECPrivateKey/ECPublicKey.
要生成我正在使用的密钥对: gpg --expert --full-generate-key
然后选择(9)ECC和ECC(或(10)ECC(仅签名))
然后选择(3)NIST P-256
导致:
-----BEGIN PGP PUBLIC KEY BLOCK-----
mFIEWUdzwhMIKoZIzj0DAQcCAwQkAvZC1PIJ8ke1myyKhNny9vN78TIYo2MuAOY+
F38L9S3+Za9cKV/iIHOqfapbMoqdSmSnqDkevwQSr5MF2UOXtCJzaWduZWNjIChF
Q0Mgc2lnbiBvbmx5KSA8c3NAc3MuY28+iJAEExMIADgWIQRiC+kefVkjnjKovKy5
XANFl5+n1gUCWUdzwgIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRC5XANF
l5+n1mzGAQDsgutymxDTTXPKFfpFFVp4fxacx1MSqxP71gNJYjguXwD8CEXD20Vm
aU1WMi2jU7JC6oJn94Y4vWHwTLOU1zmQ19o=
=swfS
-----END PGP PUBLIC KEY BLOCK-----
-----BEGIN PGP PRIVATE KEY BLOCK-----
lHcEWUdzwhMIKoZIzj0DAQcCAwQkAvZC1PIJ8ke1myyKhNny9vN78TIYo2MuAOY+
F38L9S3+Za9cKV/iIHOqfapbMoqdSmSnqDkevwQSr5MF2UOXAAD9FhS2HZoWOyIi
l9nj+WPa9S1o50jM5bNIRALzcyS8SgoP97Qic2lnbmVjYyAoRUNDIHNpZ24gb25s
eSkgPHNzQHNzLmNvPoiQBBMTCAA4FiEEYgvpHn1ZI54yqLysuVwDRZefp9YFAllH
c8ICGwMFCwkIBwIGFQgJCgsCBBYCAwECHgECF4AACgkQuVwDRZefp9ZsxgEA7ILr
cpsQ001zyhX6RRVaeH8WnMdTEqsT+9YDSWI4Ll8A/AhFw9tFZmlNVjIto1OyQuqC
Z/eGOL1h8EyzlNc5kNfa
=qHBB
-----END PGP PRIVATE KEY BLOCK-----
Run Code Online (Sandbox Code Playgroud)
如何从这种装甲文本格式获得有效的java.security.interfaces.ECPrivateKey和java.security.interfaces.ECPublicKey java类?
我的最终目标是以下列方式登录:
String createSignatureFromJson(String jsonPayload, byte[] privateKey) {
Payload payload = new Payload(jsonPayload)
def key = privateKeyParse(privateKey)
JWSSigner signer = new ECDSASigner((ECPrivateKey)key)
JWSHeader header = new JWSHeader.Builder(JWSAlgorithm.ES256).build()
JWSObject jwsObject = new JWSObject(header, payload)
jwsObject.sign(signer) …Run Code Online (Sandbox Code Playgroud) 我试图从私钥生成公共 ECDSA 密钥,但我没有在互联网上找到太多关于如何执行此操作的帮助。几乎所有东西都是为了从公钥规范生成公钥,我不知道如何获得它。到目前为止,这是我整理的内容:
public void setPublic() throws GeneralSecurityException {
ECNamedCurveParameterSpec params = ECNamedCurveTable.getParameterSpec("secp256k1");
KeyFactory fact = KeyFactory.getInstance("ECDSA", "BC");
ECCurve curve = params.getCurve();
java.security.spec.EllipticCurve ellipticCurve = EC5Util.convertCurve(curve, params.getSeed());
java.security.spec.ECPoint point = ECPointUtil.decodePoint(ellipticCurve, this.privateKey.getEncoded());
java.security.spec.ECParameterSpec params2=EC5Util.convertSpec(ellipticCurve, params);
java.security.spec.ECPublicKeySpec keySpec = new java.security.spec.ECPublicKeySpec(point,params2);
this.publicKey = fact.generatePublic(keySpec);
}
Run Code Online (Sandbox Code Playgroud)
但是,在运行时,我收到以下错误:
Exception in thread "main" java.lang.IllegalArgumentException: Invalid point encoding 0x30
at org.bouncycastle.math.ec.ECCurve.decodePoint(Unknown Source)
at org.bouncycastle.jce.ECPointUtil.decodePoint(Unknown Source)
at Wallet.Wallet.setPublic(Wallet.java:125)
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?有没有更好/更简单的方法来做到这一点?
编辑:我已经设法编译了一些代码,但它不能正常工作:
public void setPublic() throws GeneralSecurityException {
BigInteger privKey = new BigInteger(getHex(privateKey.getEncoded()),16);
X9ECParameters ecp = SECNamedCurves.getByName("secp256k1");
ECPoint …Run Code Online (Sandbox Code Playgroud) 在 Java 8 中,我通过执行以下步骤全局注册了 Bouncy Castle 安全提供程序:
jre/lib/extsecurity.provider.<N>=org.bouncycastle.jce.provider.BouncyCastleProvider jre/lib/security/java.security一切都工作得很好!
java.security现在在 Java 11 中,我在 中找到了conf/security/,这很好,但lib/ext在 Java 11 中就没有了。
在Java 11中全局注册Bouncy Castle的方法是什么?
我想OutputStream从另一个创建一个OutputStream,其中新的OutputStream将自动加密我写入的内容OutputStream。我想使用 Bouncy Castle,因为我已经将该依赖项用于其他功能。
我在互联网上看到了如何使用 Bouncy Castle 加密数据的各种问题,但答案要么加密给定File(我不使用文件,我使用OutputStreams)要么有大量代码需要复制粘贴。我不敢相信这一定是那么困难。
这是我的设置:
我注释掉了一些代码,Cipher 上的 init 函数(代码编译,但测试失败)。我不知道应该在 init 函数中放入什么作为第二个参数。读取函数来自:https : //github.com/jordanbaucke/PGP-Sign-and-Encrypt/blob/472d8932df303d6861ec494a3e942ea268eaf25f/src/SignAndEncrypt.java#L272。只有 testEncryptDecryptWithoutSigning 是我写的。
代码:
@Test
void testEncryptDecryptWithoutSigning() throws Exception {
// The data will be written to this property
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Security.addProvider(new BouncyCastleProvider());
PGPSecretKey privateKey = readSecretKey(pathToFile("privatekey0"));
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
//cipher.init(Cipher.ENCRYPT_MODE, privateKey); …Run Code Online (Sandbox Code Playgroud)