jar(bcprov-jdk16-145.jar)已添加到项目中,Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider())已添加到类中,并BouncyCastleProvider.PROVIDER_NAME返回"BC"但AesFileIo.writeFile()仍然会抛出java.security.NoSuchProviderException No such provider: BC.有任何想法吗?
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
public class AesFileIo {
private static final String AES_ALGORITHM = "AES/CTR/NoPadding";
private static final String PROVIDER = BouncyCastleProvider.PROVIDER_NAME;
private static final byte[] AES_KEY_128 = { // Hard coded for now
78, -90, 42, 70, -5, 20, -114, 103,
-99, -25, 76, 95, -85, 94, 57, 54};
private static final byte[] IV = { // …Run Code Online (Sandbox Code Playgroud) 我有一个私钥文件(PEM BASE64编码).我想用它来解密一些其他数据.使用Java我试图读取文件并解码其中的BASE64编码数据...这是我试过的代码片段....
import java.io.*;
import java.nio.ByteBuffer;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import com.ibm.crypto.fips.provider.RSAPrivateKey;
import com.ibm.misc.BASE64Decoder;
public class GetPrivateKey {
public static RSAPrivateKey get() throws Exception {
File privateKeyFile = new File("privatekey.key");
byte[] encodedKey = new byte[(int) privateKeyFile.length()];
new FileInputStream(privateKeyFile).read(encodedKey);
ByteBuffer keyBytes = new BASE64Decoder().decodeBufferToByteBuffer(encodedKey.toString());
PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(keyBytes.array());
KeyFactory kf = KeyFactory.getInstance("RSA", "IBMJCEFIPS");
RSAPrivateKey pk = (RSAPrivateKey) kf.generatePrivate(privateKeySpec);
return pk;
}
public static void main(String[] args) throws Exception {
PrivateKey privKey = FormatMePlease.get();
System.out.println(privKey.toString());
}
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误
Exception in thread …Run Code Online (Sandbox Code Playgroud) 有像PEM证书一样
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,B9846B5D1803E.....
Run Code Online (Sandbox Code Playgroud)
使用BC 1.46,我使用以下代码提取密钥对:
int myFunc(String pemString, char [] password) {
ByteArrayInputStream tube = new ByteArrayInputStream(pemString.getBytes());
Reader fRd = new BufferedReader(new InputStreamReader(tube));
PEMReader pr = new PEMReader(fRd, new Password (password), "BC");
try {
Object o = pr.readObject();
if (o instanceof KeyPair)
.....
Run Code Online (Sandbox Code Playgroud)
现在我刚刚安装了BC 1.48,他们告诉我PEMReader已被弃用,必须由PEMParser替换.
我的问题是,AFAIK,PEMParser中没有密码的地方.
有人能举例说明如何将我的代码迁移到PEMParser版本吗?
是否可以将 PKCS#8 编码的 RSA 私钥转换为 PKCS#1?我知道这可以通过 openssl 轻松完成,但是可以用 Java 完成吗?
我已经尝试过以下问题的答案:
使用bouncycastle / spongycastle读取加密的私钥
但是由于我调用时我的加密密钥已编码为DER
Object object = pemParser.readObject();
Run Code Online (Sandbox Code Playgroud)
对象为null。
我可以使用openssl的命令将其转换为PEM(它也会解密密钥)
openssl pkcs8 -inform der -in pkey.key -out pkey.pem
Run Code Online (Sandbox Code Playgroud)
但我需要读取其原始文件中的密钥
java ×5
cryptography ×3
bouncycastle ×2
jce ×2
pkcs#8 ×2
security ×2
certificate ×1
der ×1
pem ×1
rsa ×1
x509 ×1