Tag: openssl

解密使用OpenSSL生成的“der”文件时出现exception:使用填充密码解密时,输入长度必须是8的倍数

首先,我使用OpenSSL生成一个私有RSA密钥文件,然后将其转换为加密的“der”文件: $ openssl pkcs8 -topk8 -inform PEM -outform DER -in private_key.pem -out private_key.der 接下来我尝试使用以下代码从Java解密此文件(在此阶段我已经使用位于此post底部的代码将文件读入byte[] key数组): public static byte[] decryptPrivateKey(byte[] key) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException { PBEKeySpec passKeySpec = new PBEKeySpec(“p”.toCharArray()); //my password EncryptedPrivateKeyInfo encryptedKey = new EncryptedPrivateKeyInfo(key); System.out.println(encryptedKey.getAlgName()); //PBEWithMD5AndDES System.out.println(“key length: ” + key.length); //key length: 677 SecretKeyFactory keyFac = […]

如何使用JCA读取BouncyCastle私钥PEM文件?

在我们的一个应用程序中,使用BouncyCastle的PEMWriter存储私钥。 目前我正在调查是否可以摆脱BouncyCastle依赖,因为Java 7似乎拥有我们需要的一切。 唯一的问题是我无法读取存储在数据库中的私钥作为PEM编码的字符串(证书/公钥很好)。 如果我将私有密钥的PEM编码字符串从数据库保存到文件,我可以运行OpenSSL将密钥转换为PKCS#8格式,如下所示: openssl pkcs8 -topk8 -inform PEM -outform DER \ -in private_key.pem -out private_key.der -nocrypt 结果输出我可以base64编码,然后使用这个Java / JCA代码读取: byte[] privateKeyBytes = DatatypeConverter.parseBase64Binary(privateKeyDERcontents); PrivateKey prKey = KeyFactory.getInstance(“RSA”). generatePrivate(new PKCS8EncodedKeySpec(privateKeyBytes)); 这个私钥与预期存储的公钥匹配,即我可以从明文到密文和返回往返。 我的问题是:我能以某种方式直接读取原始PEM编码吗? 编辑 下面是一些使用BouncyCastle读取相关字符串的代码: if (Security.getProvider(“BC”) == null) { Security.addProvider(new BouncyCastleProvider()); } PEMReader pemReader = new PEMReader(new StringReader(privateKeyPEM)); KeyPair keyPair = (KeyPair) pemReader.readObject(); PrivateKey […]

与充气城堡签订的X509证书无效

我花了很长时间才使java签署CSR,最后我能够做到这一点,但openssl告诉它无效。 使用openssl签署的相同CSR通过validation步骤。 全部是相同的x509版本(1),没有扩展名,Subject,Issuer是相同的。 我怀疑问题是主题DN(特别是电子邮件)或日期。 validation: openssl verify -verbose -CAfile src/test/resources/ca.cer.pem o.cer.pem o.cer.pem: OK openssl verify -verbose -CAfile src/test/resources/ca.cer.pem client.cer.pem client.cer.pem: C = RU, ST = Moscow, L = Moscow, O = Hoofs, OU = IT, CN = Danee Yaitskov error 20 at 0 depth lookup:unable to get local issuer certificate 文件大小类似: 1229 Jul 28 12:45 […]

AES / CBC在Java中加密,在Ruby中解密

我正在尝试将以下(工作)Java代码转换为Ruby。 public static final String PROVIDER = “BC”; public static final int IV_LENGTH = 16; private static final String HASH_ALGORITHM = “SHA-512”; private static final String PBE_ALGORITHM = “PBEWithSHA256And256BitAES-CBC-BC”; private static final String CIPHER_ALGORITHM = “AES/CBC/PKCS5Padding”; private static final String SECRET_KEY_ALGORITHM = “AES”; public String decrypt(SecretKey secret, String encrypted) { Cipher decryptionCipher = Cipher.getInstance(CIPHER_ALGORITHM, PROVIDER); […]

如何使用OpenSSL解密Java AES加密数据?

我正在连接使用AES加密数据的旧Java应用程序(应用程序无法更改)。 以下是原始Java代码实例化AES密码的方法: SecretKeySpec skeySpec = new SecretKeySpec(key, “AES”); cipher = Cipher.getInstance(“AES”); cipher.init(Cipher.ENCRYPT_MODE, skeySpec ); 我是一名C / C ++开发人员,而不是Java,但据我所知,这个遗留Java代码没有指定模式,也没有指定初始化向量。 有人碰巧知道Java默认使用什么,因为它没有指定? 我们需要新的C / C ++应用程序来解密Java加密的数据。 但是我不知道OpenSSL的初始化向量和链接模式使用什么,因为我不知道java的用途。

如何在python中制作PKCS8 RSA签名

我有pkcs8_rsa_private_key文件,它由openssl从rsa_private_key.pem文件生成。 我需要通过python中的私钥进行签名,使用下面的java代码创建相同的签名。 public static final String SIGN_ALGORITHMS = “SHA1WithRSA”; public static String sign(String content, String privateKey) { String charset = “utf-8”; try { PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec( Base64.decode(privateKey)); KeyFactory keyf = KeyFactory.getInstance(“RSA”); PrivateKey priKey = keyf.generatePrivate(priPKCS8); java.security.Signature signature = java.security.Signature .getInstance(SIGN_ALGORITHMS); signature.initSign(priKey); signature.update(content.getBytes(charset)); byte[] signed = signature.sign(); return Base64.encode(signed); } catch (Exception e) { […]

是什么导致keytool错误“无法解密安全内容条目”?

我试图使用此命令将标准PKCS#12(.p12)密钥库转换为Java JKS密钥库: keytool -importkeystore -srckeystore keystore.p12 -srcstoretype PKCS12 -deststoretype JKS -destkeystore keystore.jks 失败的是: keytool error: java.io.IOException: failed to decrypt safe contents entry: javax.crypto.BadPaddingException: Given final block not properly padded 你知道如何解决这个问题吗?

在Java中加载RSA私钥(algid解析错误,而不是序列)

我正在尝试将使用ssl生成的私有RSA密钥加载到java中,我的代码是: 生成密钥 : openssl genrsa -out mykey.pem 1024 结果: —–BEGIN RSA PRIVATE KEY—– MIICXAIBAAKBgQCUibP4fY2PA/sGMKMbU6usuIGcOAqgQjD6c2ylVo05Oz7pgjnE +O0l2MFRUYUGT5KKk/W+0cAXkxaQHE3n8A8X1mHT8eMDmWnzz0PeYjDE8LQmAw8R Y2FnVKFAB36BIjdb5FsZmCk5QYKU5+nWLMqH/j/IR5AyX5wR2SMoslUg2QIDAQAB AoGAeJ1s7638IhLIZtldyRXjRKi6ToFPV50IKodJxOSIXt3WE0V05ZaA84eUSxUY IOzCgRbuqVmnUz1USAdD18AecC8qc7tXTRALLy7q8fxklPwmGPUOvTFmI7gRMUnv cWrq1gySk3SKpj0YmWnuY9Xmd2+xoWLzUeFD1CROY5OTjIECQQDDlp1+Al7+duR0 XyMlkWLIk0nIbkQ5zlTAEipzmaeTSOJi6YG3EMMz3AGuZb7tw6HFxWqeg1hyKJ+T cTM3WTdJAkEAwmrCDKE29n3wFOBKsZZFQbDgVOUXCBs2ubEI+ALe1DJU5BlfnrhJ OINRCNgnwSFNbwxDTkDpR6J6Av2ElAvNEQJAV0dVvk5Wj50Ecz2lFHWdLD41taAn B9igDxnMIcvWcK4cf+ENhmCPiwvJIEa8/aLIBNYErvmTtVWVaBkirrc8KQJABr+z +sJB6S6X/fGHRkDkKJKeRvQo54QiUzHdENbwq0cQAVcMJbNZ/1c3oen2/1JLoNY5 I+dG8dCnEaGBT65VMQJBAIDqH1Kqs5tb51cpt6h9ot31SUVud5pSML/babwp3pRs 1s6poreym4PkAyRug0Dgcj1zVLt25TlOHvrL9r3Swq8= —–END RSA PRIVATE KEY—– 加载: String privKeyPEM=readFile(“mykey.pem”); privKeyPEM= privKeyPEM.replace(“—–BEGIN RSA PRIVATE KEY—–“, “”).replace(“\n”, “”); // Remove the first and last lines privKeyPEM = privKeyPEM.replace(“—–END RSA PRIVATE KEY—–“, “”); System.out.println(privKeyPEM); […]

如何使用密码加密的Privatekey生成RSA keyPair?

我想生成一个用密码加密的私钥PKCS8格式,我尝试使用这段代码: String password = “123456”; KeyPairGenerator gen = KeyPairGenerator.getInstance(“RSA”); gen.initialize(2048); KeyPair key = gen.generateKeyPair(); PrivateKey privateKey = key.getPrivate(); PublicKey publicKey = key.getPublic(); FileOutputStream pvt = new FileOutputStream(“d:\\pvt123456.der”); try { pvt.write(privateKey.getEncoded()); pvt.flush(); } finally { pvt.close(); } FileOutputStream pub = new FileOutputStream(“d:\\pub123456.der”); try { pub.write(publicKey.getEncoded()); pub.flush(); } finally { pub.close(); } 但我不知道如何使用3des加密密码以与openssl格式兼容。

相当于java中的OpenSSL命令

我对java或openssl中的文件加密并不是很熟悉。 我从学校了解基础知识但从未实际实施过。 现在我已经获得了以下3个命令: //generate random base64 private key openssl rand -base64 32 -out (keypath) //Encrypt random key with public key openssl rsautl -encrypt -inkey (encryptionkey) -pubin -in (input) -out (output) //encrypt file openssl enc -aes-256-cbc -salt -in (input) -out (output) -pass file:(keypath) 我需要在java中完全复制它。 有这么简单的方法吗? 我可以使用哪个库让这更容易吗? 对于第一行,我使用java 7中的SecureRandom函数生成一个字节数组,然后使用apache commons编解码器库将其加载到base64。 像这样: byte[] bytes = new byte[32]; new […]