标签: bouncycastle

Android充气城堡:IOException

我正在使用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

android bouncycastle keystore

8
推荐指数
2
解决办法
8000
查看次数

证书主题和颁发者中的属性相反

我正在尝试使用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 bouncycastle jks x509certificate

8
推荐指数
3
解决办法
5014
查看次数

bouncycastle支持RSA PKCS1-OAEP填充吗?

我正在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实现.

java security android bouncycastle

8
推荐指数
2
解决办法
1万
查看次数

在BouncyCastle上使用数字签名算法(ECDSA)实现的椭圆曲线

我正在尝试实现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)

java cryptography bouncycastle

8
推荐指数
2
解决办法
2万
查看次数

如何从EC公钥字节中获取PublicKey对象?

我正在开发一个需要在(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 cryptography bouncycastle

8
推荐指数
1
解决办法
1万
查看次数

bcprov和bcprov-ext有何不同?

我注意到有两个用于Java的bouncycastle提供程序库; bcprovbcprov-ext.他们有什么不同?如何选择使用哪个?

java bouncycastle

8
推荐指数
1
解决办法
2189
查看次数

在Java中解析装甲ECC公钥/私钥(由gpg cli生成)

我正在尝试将装甲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)

java bouncycastle gnupg elliptic-curve json-web-token

8
推荐指数
2
解决办法
819
查看次数

从私钥导出 ECDSA 公钥

我试图从私钥生成公共 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 cryptography bouncycastle ecdsa

8
推荐指数
1
解决办法
7911
查看次数

在 JDK 11 中全局注册 bouncycastle 安全提供程序

在 Java 8 中,我通过执行以下步骤全局注册了 Bouncy Castle 安全提供程序:

  1. 将 bouncycastle jar 复制到jre/lib/ext
  2. 添加security.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的方法是什么?

java bouncycastle java-11

8
推荐指数
2
解决办法
1万
查看次数

使用 PGP Bouncy Castle 依赖项创建 CipherOutputStream

我想OutputStream从另一个创建一个OutputStream,其中新的OutputStream将自动加密我写入的内容OutputStream。我想使用 Bouncy Castle,因为我已经将该依赖项用于其他功能。

我在互联网上看到了如何使用 Bouncy Castle 加密数据的各种问题,但答案要么加密给定File(我不使用文件,我使用OutputStreams)要么有大量代码需要复制粘贴。我不敢相信这一定是那么困难。

这是我的设置:

  1. 我正在使用这个 Bouncy Castle 依赖项 (V1.68)
  2. 我正在使用 Java 8
  3. 我有一个由https://pgpkeygen.com/生成的公钥和私钥。算法为 RSA,密钥大小为 1024。
  4. 我将公钥和私钥作为文件保存在我的机器上
  5. 我想确保下面的测试通过

我注释掉了一些代码,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)

java bouncycastle pgp

8
推荐指数
1
解决办法
293
查看次数