相关疑难解决方法(0)

使用PEM编码的加密私钥本地签名消息

我正在尝试使用PEM(X.509)证书(存储在磁盘上的privateKey.pem文件中)来签署通过Java中的套接字发送的消息,但是在找到一个接近的示例时遇到了很多麻烦.我通常是一个C++人,他只是在帮助这个项目,所以我把它们整合到代码中有点困难,因为我不熟悉API.

不幸的是,我只限于Java(1.6.0 Update 16)标准的方法,所以虽然我发现了一个使用BouncyCastlePEMReader的类似例子,但它对这个特定的项目没有多大帮助.

我的privateKey.pem密钥是passphrase protected,格式为:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED DEK-Info:
DES-EDE3-CBC,63A862F284B1280B
[...]
tsjQI4H8lhOBuk+NelHu7h2+uqbBQzwkPoA8IqbPXUz+B/MAGhoTGl4AKPjfm9gu
OqEorRU2vGiSaUPgDaRhdPKK0stxMxbByUi8xQ2156d/Ipk2IPLSEZDXONrB/4O5
[...]
-----END RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

它们是使用OpenSSL生成的:

openssl.exe genrsa -out private_key.pem 4096
Run Code Online (Sandbox Code Playgroud)

我无法在运行之前将此密钥转换为DER或其他格式,所需的任何转换都需要在代码内部完成,因为密钥需要易于更换且格式仍为PEM.

我听过各种各样的事情,我并不完全确定,并且希望这里的集体思想可以帮助将各个部分拉到一起.



我听说它说PEM证书需要Base64解码才能将其转换为可以使用的DER证书.我有一个名为MiGBase64的Base64解码工具,但我不完全确定如何/何时需要解码.


我已经迷失在Java API文档中,试图追踪存在的15种不同类型的Keys,KeyStores,KeyGenerators,Certificates等,但我对它们中的任何一种都不熟悉,无法正确识别我需要的使用,以及如何一起使用它们.


基本算法看起来很简单,这就是为什么我无法编写同样简单的实现特别令人沮丧的原因:

1)从文件中读取privateKey.pem
2)将私钥加载到XXX类中,使用密码短语解密密钥
3)使用带有Signature类的密钥对象对消息进行签名



非常感谢帮助,特别是示例代码.我一直在努力寻找这个问题的有用示例,因为大多数"关闭"示例都是使用BouncyCastle生成新密钥,或者只是使用不适用于此处的不同形式的密钥/类.

这似乎是一个非常简单的问题,但它让我发疯,任何非常简单的答案?

java signature pem

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

如何从RSA Privatekey.pem文件中获取java.security.PrivateKey对象?

我有一个RSA私钥文件(OCkey.pem).使用java我必须从这个文件中获取私钥.使用下面的openssl命令生成此密钥.注意:我无法在下面的openssl命令中进行任何更改.

openssl> req -newkey rsa:1024 -sha1 -keyout OCkey.pem -out OCreq.pem -subj "/C=country/L=city/O=OC/OU=myLab/CN=OCserverName/" -config req.conf
Run Code Online (Sandbox Code Playgroud)

证书如下所示.

////////////////////////////////////////////////// /////////
bash-3.00 $ less OCkey.pem
----- BEGIN RSA PRIVATE KEY -----
Proc-Type:4,ENCRYPTED
DEK-Info:DES-EDE3-CBC,EA1DBF8D142621BF

BYyZuqyqq9 + L0UT8UxwkDHX7P7YxpKugTXE8NCLQWhdS3EksMsv4xNQsZSVrJxE3
Ft9veWuk + PlFVQG2utZlWxTYsUVIJg4KF7EgCbyPbN1cyjsi9FMfmlPXQyCJ72rd
...
...
cBlG80PT4t27h01gcCFRCBGHxiidh5LAATkApZMSfe6BBv4hYjkCmg ==
----- END RSA私钥-----
///////////////////// /////////////////////////////////////////

以下就是我的尝试

byte[] privKeyBytes = new byte[(int)new File("C:/OCkey.pem").length()]; 
PublicKey publicKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(privKeyBytes));
Run Code Online (Sandbox Code Playgroud)

但得到

"java.security.spec.InvalidKeySpecException:java.security.InvalidKeyException:无效的密钥格式"

请帮忙.

java ssl jsse jca

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

从RSA .pem文件获取PrivateKey

给定此.pem文件(使用openssl生成并使用密码加密):

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,AC009672952033EB

2wegzxf3MtncXS1CY3c.....
....
....
-----END RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

如何PrivateKey在Java中获取对象?我写了下面的代码,但我找不到正确的方法来获得KeySpec:

PrivateKey readFromPem(File keyFile, String password){
    PemReader r = new PemReader(new InputStreamReader(new FileInputStream(keyFile)));
    PemObject pemObject = r.readPemObject();
    byte[] encodedKey = pemObject.getContent();

    KeySpec keySpec = ???? // how to get this?

    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    PrivateKey key = keyFactory.generatePrivate(keySpec);
    return key;
}
Run Code Online (Sandbox Code Playgroud)

我想我应该建立一个RSAPrivateKeySpec,但我不知道如何.我从这个答案另一个答案中尝试了这个方法,但是在解析字节数组时它们都会导致错误.

java rsa bouncycastle private-key

7
推荐指数
2
解决办法
7097
查看次数

Java ssh-rsa字符串到公钥

我想获取.pub文件内容的公钥.这是一个.pub文件内容(生成ssh-keygen)的示例:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDBPL2s+25Ank3zS6iHUoVk0tS63dZM0LzAaniiDon0tdWwq4vcL4+fV8BsAEcpMeijS92JhDDc9FccXlHbdDcmd6c4ITOt9h9xxhIefGsi1FTVJ/EjVtbqF5m0bu7ruIMGvuP1p5s004roHx9y0UdHvD/yNWLISMhy4nio6jLailIj3FS53Emj1WRNsOrpja3LzPXzhuuj6YnD9yfByT7iGZipxkmleaXrknChPClLI9uhcqtAzBLdd0NVTJLOt/3+d1cSNwdBw9e53wJvpEmH+P8UOZd+oV/y7cHIej4jQpBXVvpJR1Yaluh5RuxY90B0hSescUAj4g/3HVPpR/gE7op6i9Ab//0iXF15uWGlGzipI4lA2/wYEtv8swTjmdCTMNcTDw/1huTDEzZjghIKVpskHde/Lj416c7eSByLqsMg2OhlZGChKznpIjhuNRXz93DwqKuIKvJKSnhqaJDxmDGfG7nlQ/eTwGeAZ6VR50yMPiRTIpuYd767+Nsg486z7p0pnKoBlL6ffTbfeolUX2b6Nb9ZIOxJdpCSNTQRKQ50p4Y3S580cUM1Y2EfjlfIQG1JdmTQYB75AZXi/cB2PvScmF0bXRoj7iHg4lCnSUvRprWA0xbwzCW/wjNqw6MyRX42FFlvSRrmfaxGZxKYbmk3TzBv+Fp+CADPqQm3OQ== test@test.com
Run Code Online (Sandbox Code Playgroud)

如果我是对的,这不是公钥,但可以从此字符串中获取公钥.

这个答案给出了我的问题 的答案/sf/answers/1357126221/
但答案似乎不起作用.我得到一个例外:

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: invalid key format
Run Code Online (Sandbox Code Playgroud)

在查看答案的评论时,我不是唯一有问题的人...

我该如何修复异常?或者是否有另一种方法从字符串中获取公钥?

java encryption ssh rsa public-key-encryption

6
推荐指数
2
解决办法
6135
查看次数

使用Java解密OpenSSL PEM编码的RSA私钥?

我有一个加密的私钥,我知道密码.

我需要使用Java库解密它.

我不想使用BouncyCastle,除非没有其他选择.根据以往的经验,有太多的变化,没有足够的文档.

私钥是这种形式:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,56F3A98D9CFFA77A

X5h7SUDStF1tL16lRM+AfZb1UBDQ0D1YbQ6vmIlXiK....
.....
/KK5CZmIGw==
-----END RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

我相信关键数据是Base64编码,因为我看到\r\n64个字符后.

我尝试了以下解密密钥:

import java.security.Key;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;
import javax.crypto.EncryptedPrivateKeyInfo;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;

public String decrypt(String keyDataStr, String passwordStr){
  // This key data start from "X5... to ==" 
  char [] password=passwordStr.toCharArray();
  byte [] keyDataBytes=com.sun.jersey.core.util.Base64.decode(keyDataStr);

  PBEKeySpec pbeSpec = new PBEKeySpec(password);
  EncryptedPrivateKeyInfo pkinfo = new EncryptedPrivateKeyInfo(keyDataBytes);
  SecretKeyFactory skf = SecretKeyFactory.getInstance(pkinfo.getAlgName());
  Key secret = skf.generateSecret(pbeSpec);
  PKCS8EncodedKeySpec keySpec = pkinfo.getKeySpec(secret); …
Run Code Online (Sandbox Code Playgroud)

java encryption openssl pkcs#8 pkcs#1

5
推荐指数
1
解决办法
4454
查看次数

在JAVA中读取格式为PKCS1的RSA私钥

是否可以在JAVA中读取格式为PKCS1的RSA私钥而无需转换为PKCS8?如果是,请欣赏示例代码.

-----BEGIN RSA PRIVATE KEY-----
 BASE64 ENCODED DATA
-----END RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

java ssl rsa bouncycastle

5
推荐指数
1
解决办法
4984
查看次数

将 RSA PKCS1 私钥字符串转换为 Java PrivateKey 对象

我有一个存储为字符串的 RSA 私钥,我需要将其转换为 PrivateKey 对象以与 API 一起使用。我可以找到人们从私钥文件转换为字符串的例子,但反过来不行。

我设法将它转换为 PrivateKey 对象,但它在 PKCS8 中,当我需要它是 PKCS1 时,我知道 Java 没有 PKCS1EncodedKeySpec

byte[] key64 = Base64.decodeBase64(privateKeyString.getBytes());
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
KeySpec privateKeySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);
Run Code Online (Sandbox Code Playgroud)

java rsa private-key

5
推荐指数
1
解决办法
3604
查看次数

如何从字符串 Java 生成公钥

我有公钥字符串

String publicK = "-----BEGIN PUBLIC KEY-----\n" +
    "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgFhTDtuYJ5G5LEHMesnf\n" +
    "wX9cXZ1b/ozkkpbgtC3ziETiFkOFncbPCskpdbPmXxXv3vrwJ2RQIL2LZLZPe1xT\n" +
    "AyQY1DdD8hGqIemMwV2NqfFoEomVL5+QOAKCRiHkGgte6a2+OoTk9JzRP/NVaPkB\n" +
    "sdX1/nIPERYen3uDvUSYq83Ite2oDyaZZxj+/r46SadS/g5jWmeqgVoInJw813y7\n" +
    "Ee2HgYVbnktlLNhqIGj+1OKmwop+GP7Kk5CAkt9fo4VjRRllDaX1yFCZEbDL254n\n" +
    "S+LVOhl4mLBM8764+YVxjyYRC1Nq2rNZfQ602652i+l8u8nGqdiKOKDpjNDvhONP\n" +
    "yQIDAQAB\n" +
    "-----END PUBLIC KEY-----";
Run Code Online (Sandbox Code Playgroud)

我想转换 PublicKey Object 。

byte[] byteKey = publicK.getBytes();
X509EncodedKeySpec spec = new X509EncodedKeySpec(byteKey);
KeyFactory kf = KeyFactory.getInstance("RSA");
return kf.generatePublic(spec);
Run Code Online (Sandbox Code Playgroud)

以上代码抛出异常

java.security.InvalidKeyException: invalid key format
at sun.security.x509.X509Key.decode(X509Key.java:387)
at sun.security.x509.X509Key.decode(X509Key.java:403)
at sun.security.rsa.RSAPublicKeyImpl.<init>(RSAPublicKeyImpl.java:84)
at sun.security.rsa.RSAKeyFactory.generatePublic(RSAKeyFactory.java:298)
at sun.security.rsa.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java:201)
Run Code Online (Sandbox Code Playgroud)

java security key

4
推荐指数
1
解决办法
7044
查看次数

使用bouncycastle/spongycastle读取加密的私钥

我有一个受密码保护,加密的RSA私钥,它是用PyCrypto(2.6.1)创建的,并根据他们的文档有以下格式:PrivateKeyInfo, PKCS#8 (DER SEQUENCE), PEM (RFC1423),见[ https://www.dlitz.net/software/pycrypto/api/ current/Crypto.PublicKey.RSA._RSAobj-class.html #exportKey].

如何使用Bouncycastle/Spongycastle解密此RSA密钥?

我已经搜索了Google很长一段时间,并且只得到了结果,这些结果要么不适用于版本1.50(因为PEMReader已被弃用并被删除),要么是PEMParser的示例似乎无法读取此格式.顺便说一下:我错过了关于Bouncycastle的文件吗?

这是我加密的私钥的标题:

-----BEGIN PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,68949227DD8A502D
xyz...
Run Code Online (Sandbox Code Playgroud)

我真的很感激,如果有人能帮助我的话!

java rsa bouncycastle pem pkcs#8

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