我在使用充气城堡在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) 我使用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创建的私钥?
好的,所以我正在为一个应用程序后端的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
我有一个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
我尝试了几种方法,但我没有成功.
谢谢你的帮助:)
在这个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机器上完美运行
我正在使用: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
我正在努力解决以下问题:
我有一个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) 我的应用程序正在访问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) 我的问题看起来像这样.我在卡和终端侧生成了密钥.我在终端侧有卡公钥和私钥以及终端公钥和私钥,卡侧也一样(我正在做测试,这就是为什么我把它们全部放在终端和卡上).当我为卡生成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) 如果我从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) bouncycastle ×10
java ×6
encryption ×2
.net ×1
android ×1
certificate ×1
cryptography ×1
file-io ×1
ios ×1
java-me ×1
javacard ×1
pem ×1
pkcs#11 ×1
proguard ×1
smartcard ×1
spongycastle ×1
ssl ×1
x509 ×1