标签: bouncycastle

在J2ME中加密和解密文件

我在使用充气城堡在J2ME中解密加密文件时遇到问题.我要做的是选择要加密的文件,写入加密文件并尝试将其解密回其原始形式(写入另一个文件以进行验证).

我在读取加密文件时遇到此错误.

Stack Trace : 
s: pad block corrupted
        at j.a(+219)
        at e.c(+38)
        at e.b(+30)
        at com.aaron.midlets.BluetoothServerMidlet.c(+134)
        at com.aaron.midlets.BluetoothServerMidlet.b(+161)
        at com.aaron.midlets.BluetoothServerMidlet.a(+67)
        at com.aaron.midlets.BluetoothServerMidlet.startApp(+105)
        at javax.microedition.midlet.MIDletProxy.startApp(MIDletProxy.java:43)
        at com.sun.midp.midlet.Scheduler.schedule(Scheduler.java:374)
        at com.sun.midp.main.Main.runLocalClass(Main.java:466)
        at com.sun.midp.main.Main.main(Main.java:120)
Run Code Online (Sandbox Code Playgroud)

以下是我的代码的一部分:

private void createEncryptFile() {
    FileConnection fc = FileListingUtil.getFile("root1/", "test.encrypt");
    try {
        fc.create();
        readAndEncrypt();
    } catch (Exception e) {
    }
}

private void readAndEncrypt() {
    FileConnection fc = FileListingUtil.getFile("root1/", "test.original");
    FileConnection fc2 = FileListingUtil.getFile("root1/", "test.encrypt");

    try {
        InputStream test = fc.openDataInputStream();
        OutputStreamWriter output = new OutputStreamWriter(fc2.openOutputStream());

        int fileSize = …
Run Code Online (Sandbox Code Playgroud)

encryption file-io bouncycastle java-me

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

从BouncyCastle导出EC私钥并导入CngKey或ECDsaCng?

我使用BouncyCastle创建了椭圆曲线DSA签名的密钥对,并设法使用符合RFC4050的XMLString将公钥导入ECDsaCng.现在我想移动私钥,但没有设法找到解决方案.我最接近的是使用CngKey.Import.

CngKey.Import支持PKCS#8格式,因此如果您可以将密钥转换为有效的pkcs8,那么它应该可以工作.不幸的是,以下代码不太有效.

var privatekey = (ECPrivateKeyParameters) keyPair.Private;

var pkinfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(privatekey);

byte[] pkcs8Blob = pkinfo.GetDerEncoded(); 

var importedKey = CngKey.Import(pkcs8Blob, CngKeyBlobFormat.Pkcs8PrivateBlob);
Run Code Online (Sandbox Code Playgroud)

这引发了一个异常:

System.Security.Cryptography.CryptographicException:遇到ASN1错误标记值.

就我所知,GetDerEncoded应该返回一个有效的Pkcs8 blob.

如何在ECDsaCng对象中使用BouncyCastle创建的私钥?

.net cryptography bouncycastle elliptic-curve

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

无法让JavaPNS用于推送通知

好的,所以我正在为一个应用程序后端的java服务器工作,它必须能够发出iOS推送通知作为更大代码库的一部分,所以我使用了JavaPNS库(v2.1.1),它被使用(并且曾经工作过tomcat版本的服务器.我在Arch Linux上使用Eclipse进行本地开发.

我正在尝试最简单的测试:

try{ 
   Push.alert("Hello", "cert.p12", "password", false, "<my iPods UDID>");
}catch(Exception e){
  e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

结果异常是:

 Exception in thread "main" java.lang.NoClassDefFoundError:org/bouncycastle/jce/provider/BouncyCastleProvider
at javapns.notification.PushNotificationManager.initializeConnection(PushNotificationManager.java:107)
at javapns.Push.sendPayload(Push.java:171)
at javapns.Push.alert(Push.java:47)
at testIOS.main(testIOS.java:20)
Caused by: java.lang.ClassNotFoundException: org.bouncycastle.jce.provider.BouncyCastleProvider
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 4 more
Run Code Online (Sandbox Code Playgroud)

cert文件位于本地目录中(没有关于它加载的投诉),密码和UDID都是正确的.我尝试了一些事情(可能是徒劳的),比如从oracle安装无限制的JCE策略:http: //www.bouncycastle.org/wiki/display/JA1/Provider+Installation

但我真的不知道什么是错的,它似乎无法找到那个类/库,但我真的不知道如何解决它.提前感谢任何提示.

java bouncycastle push-notification apple-push-notifications ios

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

使用BouncyCastle从PEM Key获取KeyPair

我有一个PEM Key,我希望得到一个KeyPair和它和bouncycastle.我发现这个代码似乎很好,但我有一个强制转换异常.

function loadKey() {
    File privateKeyFile = new File(keyPath);
    PEMParser pemParser = new PEMParser(new FileReader(privateKeyFile));
    PEMDecryptorProvider decProv = new     JcePEMDecryptorProviderBuilder().build(password.toCharArray());
    JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC");

    Object object = pemParser.readObject();
    KeyPair kp;

    if (object instanceof PEMEncryptedKeyPair) {
        Logger.info("Encrypted key - we will use provided password");
        kp = converter.getKeyPair(((PEMEncryptedKeyPair) object).decryptKeyPair(decProv));
    }
    else {
        Logger.info("Unencrypted key - no password needed");    
        kp = converter.getKeyPair((PEMKeyPair) object);
    }

    return kp;
}
Run Code Online (Sandbox Code Playgroud)

它返回我:未加密密钥 - 无需密码org.bouncycastle.asn1.x509.SubjectPublicKeyInfo无法强制转换为org.bouncycastle.openssl.PEMKeyPair

我尝试了几种方法,但我没有成功.

谢谢你的帮助:)

java bouncycastle pem

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

Spongycastle在Android上加载时缺少许多算法

在这个stackoverflow答案中,您可以看到一个代码,用于打印所有可用的提供程序和相应的算法:如何找出我的JVM支持哪些算法[加密]?

我使用的是最新版本的Spongycastle,当我要求在Android上获取Spongycastle(“ SC”)的算法时,我只会得到一些算法。实际上,我得到的清单非常有限

provider: SC
algorithm: PBEWITHMD5ANDDES
algorithm: PBEWITHSHA256AND192BITAES-CBC-BC
algorithm: OLDHMACSHA384
algorithm: PBEWITHHMACSHA
algorithm: PBEWITHMD5ANDDES
algorithm: PKCS12PBE
algorithm: PBEWITHSHAAND128BITAES-CBC-BC
algorithm: IES
algorithm: PKIX
algorithm: RFC3280
algorithm: ISO9797ALG3MAC
algorithm: PBEWITHHMACSHA1
algorithm: CERTIFICATE
algorithm: PBEWITHSHAAND40BITRC2-CBC
algorithm: PBEWITHSHA1ANDDES
algorithm: PBEWITHMD5AND256BITA
Run Code Online (Sandbox Code Playgroud)

另一方面,当我要求在我的linux机器上获取SC的算法时,我会得到更多的算法。我还没有算出它们,但是它的列表比上面看到的要长10倍。

其余所有算法都去了哪里??

因为此项目不是典型的android-java项目,而是Android-Scala项目,所以我必须在每次执行时都使用Proguard。对于缺少的算法,这是否起任何作用?还是其他?

注意1:我正在使用SC生成密钥对,并使用OpenPGP加密和解密

注意2:已使用OpenJDK-6,用于公钥加密的RSA算法以及作为随机对称密钥的BLOWFISH算法对源代码进行了测试,以在Linux机器上完美运行

android bouncycastle proguard spongycastle

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

从证书中检索完整的扩展名值

我正在使用:java.security.cert.X509Certificate程序包。和java.security.cert.X509CRL;

当我获得扩展值时,例如当OID = 2.5.29.14(它是SubjectKeyIdentifier)时, cert.getExtensionValue(“ 2.5.29.14”); 我得到此byte []范围:

[4,22,4,20,5,125,-118,106,-44,108,39,-74,-108,-20,-27,-32,-113,64,-69,125,-8,102,-52,-24 ]

当我在证书中看到时,SubjectKeyIdentifier 从5开始

问题1:这个范围的开始是什么?它是4个字节。

当我在X509CRL中看到AuthorityKeyIdentifier(CRL的AuthorityKeyIdentifier ==证书的SubjectKeyIdentifier时,如果CRL是由此证书签名的),则是相同的:

[4,24,48,22,-128,20,5,125,-118,106,-44,108,39,-74,-108,-20,-27,-32,-113,64,-69,125,-8,102, -52,-24 ],但开头还有另外6个字节。

问题2:这个范围的开始是什么?它是6个字节。

还有一个问题:

问题3:如何解析ExtensionValue以仅获取Identifier值。这4和6个字节固定吗?解析的最佳方法是什么?

java bouncycastle certificate ssl-certificate x509certificate

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

通过与BouncyCastle签署CSR而生成的证书被认为是不可信的

我正在努力解决以下问题:

我有一个CSR,我用这段代码签名:

@Override
public X509Certificate signCSR( Reader pemcsr, int validityDays ) throws APIException
{
try ( PEMParser reader = new PEMParser( pemcsr ) )
{

  KeyStore keystore = getKeyStore();

  Properties cryptoProps = getCryptoProperties();

  String caKeyAlias = cryptoProps.getProperty( PROPERTY_KEYSTORE_CA_CERT_ALIAS );
  String caKeyPassword = cryptoProps.getProperty( PROPERTY_KEYSTORE_CA_CERT_PASSWORD );

  PrivateKey cakey = (PrivateKey) keystore.getKey( caKeyAlias, caKeyPassword.toCharArray() );
  X509Certificate cacert = (X509Certificate) keystore.getCertificate( caKeyAlias );

  PKCS10CertificationRequest csr = (PKCS10CertificationRequest) reader.readObject();

  AlgorithmIdentifier sigAlgId = new DefaultSignatureAlgorithmIdentifierFinder().find( "SHA1withRSA" );
  AlgorithmIdentifier digAlgId = new DefaultDigestAlgorithmIdentifierFinder().find( sigAlgId );
  X500Name …
Run Code Online (Sandbox Code Playgroud)

java ssl bouncycastle x509

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

坏填充异常 - pkcs11中的RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING

我的应用程序正在访问e-Token以解密来自服务器的响应

来自服务器的会话密钥使用以下方式加密: -

RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING

我正在使用SunPKCS11 Provider来实现对加密令牌的访问.每当我尝试使用上述机制解密时,即使用RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING,我得到: -

**javax.crypto.BadPaddingException: doFinal() failed  
    at sun.security.pkcs11.P11RSACipher.implDoFinal(P11RSACipher.java:328)  
    at sun.security.pkcs11.P11RSACipher.engineDoFinal(P11RSACipher.java:353)  
    at javax.crypto.Cipher.doFinal(DashoA13*..)
Run Code Online (Sandbox Code Playgroud)

以下是我的代码: -

private static final String TRANSFORMATION = "RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING";
private static final String SECURITY_PROVIDER = "BC";
private static final String DIGEST_ALGORITHM = "SHA-256";
private static final String MASKING_FUNCTION = "MGF1";
Run Code Online (Sandbox Code Playgroud)

错误发生的代码片段如下: -

private byte[] decryptSecretKeyData(byte[] encryptedSecretKey, byte[] iv, PrivateKey privateKey) throws Exception {

        try {
            Cipher rsaCipher = Cipher.getInstance(TRANSFORMATION, SECURITY_PROVIDER);

            System.out.println("Cipher block initialized"); - **Printed**
            PSource pSrc = (new PSource.PSpecified(iv));
            System.out.println("PSource inisitialized"); …
Run Code Online (Sandbox Code Playgroud)

java encryption bouncycastle smartcard pkcs#11

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

Javacard KeyAgreement与BouncyCastle KeyAgreement不同

我的问题看起来像这样.我在卡和终端侧生成了密钥.我在终端侧有卡公钥和私钥以及终端公钥和私钥,卡侧也一样(我正在做测试,这就是为什么我把它们全部放在终端和卡上).当我为卡生成KeyAgreement(终端侧)作为私有而终端作为私有时,secters是相同的,所以生成是正常的,我得到一个24字节(192位)的秘密.当我在卡上产生秘密时(2个情况就像在终端上一样),秘密也是相同的,但它们更短--20个字节(160位).这是代码.终点站:

ECPublicKey publicKey;
ECPrivateKey privateKey;
Run Code Online (Sandbox Code Playgroud)

...

KeyAgreement aKeyAgree = KeyAgreement.getInstance("ECDH", "BC");
aKeyAgree.init(privateKey);
aKeyAgree.doPhase(publicKey, true);
byte[] aSecret = aKeyAgree.generateSecret();
Run Code Online (Sandbox Code Playgroud)

和卡方面:

eyAgreement = KeyAgreement.getInstance(KeyAgreement.ALG_EC_SVDP_DH, false);
short length = terminalEcPublicKey.getW(array, (short) 0);

keyAgreement.init(cardEcPrivateKey);
short secretlength = keyAgreement.generateSecret(array, (short)0, length, buffer, (short)0);
Run Code Online (Sandbox Code Playgroud)

bouncycastle elliptic-curve javacard diffie-hellman

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

用Bouncy Castle重构私钥和公钥?

如果我从Java的Bouncy Castle中的公共密钥或私有密钥使用getEncoded获取实际密钥(实际类似乎是BCECPublicKey和BCECPrivateKey)。是否可以重构关键对象以在代码中使用它们?

我在这里的Stack Overflow中找到了如何将整个对象序列化为二进制(然后是磁盘),然后再序列化为二进制,再序列化为适当类的对象,但是我相信序列化包含实现细节,如果我尝试使用这些细节,弹跳城堡以外的其他任何键,都会失败。我现在不打算这样做,但是我想对我的程序进行过时的验证。

这就是我创建密钥的方式:

    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC", "BC");
    keyPairGenerator.initialize(new ECGenParameterSpec("secp521r1"), new SecureRandom());
    java.security.KeyPair keyPair = keyPairGenerator.generateKeyPair();

    privateKey = keyPair.getPrivate();
    publicKey = keyPair.getPublic();
Run Code Online (Sandbox Code Playgroud)

java bouncycastle

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