我需要从*.cer文件中提取公钥(RSA).我想提取密钥并将其存储在一个.pem文件中,这样我就可以使用它的值来使用jsencrypt加密值.
以下命令将a转换.cer为.pem:
openssl x509 -inform der -in certificate.cer -out certificate.pem
Run Code Online (Sandbox Code Playgroud)
但它不会生成带有公钥的文件,而是生成带有文件内容的*.cer文件.
-----BEGIN CERTIFICATE-----
MIICPDCCAamgAwIBAg............
*lots of extra contents*
-----END CERTIFICATE-----
Run Code Online (Sandbox Code Playgroud)
我应该使用什么命令来提取公钥并将其存储在.pem文件中?
尝试在OSX Yosomite 10.10.2上通过命令行加密文本消息
创建这样的.pem公钥:
ssh-keygen -f ~/.ssh/id_rsa.pub -e -t PKCS8 > id_rsa.pem
Run Code Online (Sandbox Code Playgroud)
如果我尝试加密myMessage.txt
openssl rsautl -encrypt -inkey ~/.ssh/id_rsa.pem -pubin -in ~/Desktop/myMessage.txt -out ~/Desktop/encrypted.txt
Run Code Online (Sandbox Code Playgroud)
我明白了 unable to load Public key
如果我然后输入:
openssl asn1parse -in id_rsa.pem
Run Code Online (Sandbox Code Playgroud)
返回: Error: offset too large
但我不知道如何解决它.我应该改变什么来使它工作?
我正在尝试进行RRSIG验证,我正在尝试在PHP中使用openssl lib.但我有一个问题是将公钥传递给该openssl_verify函数.
这是一个基本代码,使用Net/DNS2库通过DNSSEC选项执行DNS查询.并获得DNSKEY和RRSIG.
<?php
require_once 'Net/DNS2.php';
$r = new Net_DNS2_Resolver(array('nameservers' => array('127.0.0.1')));
$r->dnssec = true;
try {
$result = $r->query('ip4afrika.nl', 'DNSKEY');
} catch(Net_DNS2_Exception $e) {
echo "::query() failed: ", $e->getMessage(), "\n";
die(); //
}
// print_r($result->answer);
$public_key_bin = base64_decode( $result->answer[0]->key ) ;
$public_key_str = $result->answer[0]->key; //echo $public_key_str; die();
// $public_key_res = openssl_x509_parse($public_key_bin);
$public_key_res = openssl_x509_read($public_key_str);
// $public_key_res = openssl_pkey_get_public($public_key_str);
while ($msg = openssl_error_string()) echo $msg . PHP_EOL;
Run Code Online (Sandbox Code Playgroud)
我收到此错误消息,
使用时:
$public_key_res = openssl_x509_read($public_key_str);
PHP Warning: openssl_x509_read(): supplied …Run Code Online (Sandbox Code Playgroud) 今天我发现有两种带有PEM格式标题的公钥格式,例如
X.509 SubjectPublicKeyInfo** (PEM header: BEGIN PUBLIC KEY)
Run Code Online (Sandbox Code Playgroud)
对应于短标题形式;
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzsQ7MkLsc1lJ8S2WtItN
cfj7pbdB6PVcRHEEjbie97Rqthkr6h2WE5rVj0BZNwFjs4NIUYws2KeQjexZ8NEY
qpcP9iPMjdNgLpU8uL03QMti+y+y0IU4493KxKxjprjtu6no0/O5TwNs+/r+7hmF
/8d+2mhyLJQbtuvQQ6mvg6roCMuqzRS91SObzT1ojCjY+AbUrmVZ5jmklHCv7uah
EoTsB3S7wHCBRmelh2j5fWrRBay4h0IB/NSrt1dO/UEVmDSWGjnG+RsDMhYGZXJ1
hJawhqrbuVRZvrMyzqQ0j1xy5buS6jqSHA3wdOixdI8dDpvBnUDGqEIU6gl2Am7h
pwIDAQAB
-----END PUBLIC KEY-----
Run Code Online (Sandbox Code Playgroud)
和
PKCS#1 RSAPublicKey* (PEM header: BEGIN RSA PUBLIC KEY)
Run Code Online (Sandbox Code Playgroud)
对应于较长的形式;
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEA1+skaD+II3MYF/0iGDcFX/E6b0XzSC8I2RapRaCL84EqY8HxWGKn
+7p34ZJwZx9avX0cCUqvTmS6LtuoSGrdLlahrz1qEnkdYqlo9HXXQiKtA9iwaiId
LxPtCnJnGMOMtolwKAJpsr+l68D41mWvvibrwPbeTJsFi0zvrN0rL1YbVYvw3X85
fQm+wgo3s8I5sOWwlkADvfD37KxteEPitfb2cvGfYo+VIhBqqXQUhQSC3jBAUc5o
+P8U3eu84ln2YqiIg9P/iM99HoKFECJ2+mxWM8oz0rS8oqthVOck+KZ7mBiYjEzW
3ytTJIUpX9Sl88oDqkz7Azku/GVEiJNWSQIDAQAB
-----END RSA PUBLIC KEY-----
Run Code Online (Sandbox Code Playgroud)
我想验证后一种格式的一些公钥,但是我看不出openssl命令行工具显然可以做到这一点.-pubout导出第一种格式,pubin格式拒绝第二种标题;
#openssl rsa -pubin -in rsa.pub -modulus -noout
unable to load Public Key
140154809448256:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:696:Expecting: PUBLIC KEY
Run Code Online (Sandbox Code Playgroud)
有关openssl的正确命令是什么的建议,或者是否有一些工具可以从命令行执行此操作?
这个问题更通用,而不是针对特定语言,因此我将解释我的问题以及我在伪代码中尝试过的内容。
我正在尝试从 JWK 集中生成 PEM 公钥。JWK 包括“e”(指数)和“n”(模)变量。我的问题是,在不使用任何库和 OpenSSL 命令行工具的情况下将此 JWK 转换为 PEM 的确切步骤是什么。
这是JWK供参考:
{
"kty": "RSA",
"alg": "RS512",
"kid": "26887d3ee3293c526c0e6dd05f122df53aa3f13d7dad06d25e266fa6f51db79fb52422aaf79f121476237e98dcd6640350fee47fec70e783544ec9a36e4605bc",
"use": "sig",
"n": "14m79mVwIE0JxQdKrgXVf7dVcBS90U0TvG7Yf7dG4NJocz1PNUrKrzGhe_FryOe0JahL_sjA2_rKw7NBCpuVx_zSPFRw6kqjewGicjXGus5Fmlf3zDuqwV4BWIFHyQexMPOly0agFfcM0M0MgBULXjINgBs9MwnRv7JVfRoGqXHsNM45djFDd3o4liu4LPlge_DquZUFLNu-BYAyAlWkz0H2TepZhGrN9VEPmxzQkNzXc1R4MpZvbxrRRgaAA2z094ik3hk86JhfyFq-LDcueZhtshmrYZ95LWgMlQ7PixkeK1HkeEYMt20lmNzR8B8KabimYmibxA4Ay9gpRwfp-Q",
"e": "AQAB"
}
Run Code Online (Sandbox Code Playgroud)
我的大部分研究源自node-jwk-to-pem库(可以在这里找到: https: //github.com/Brightspace/node-jwk-to-pem)和一个使用JOSE库的StackOverflow问题在 PHP 中(可以在这里找到:How to conversion a public key from a JWK into PEM for OpenSSL?)
根据我通过阅读上述库(加上一些其他文章和问题,但没有完全提到逐步过程)所发现的,我发现第一步是将模数和指数转换为整数(特别是 BigInt)。这通常会导致以下结果:
n = 27209154847141595039206198313134388207882403216639061643382959557246344691110642716248339592972939239825436848454712213431917464875221502188500634554426063986720722251339335488215426908010590565758292169712942346285217861588132983738839891250753593240057639347814778952277719613395670962156961452389927728643840215833830614315091417876959205843957512422401240879135352731575182574836052718961865690645602829768565458494497550672252951063585023601307115444743487394113997186698238507983094748342588645472362960665610355698438390751920697759620235642103374737421940385132232531739910444003185620313592808726865629407737
e = 65537
Run Code Online (Sandbox Code Playgroud)
使用此信息,我将如何从指数和模数生成 PEM 公钥?任何伪代码或建议都将是令人难以置信的!
我在下面的代码中使用OpenSSL.Net生成OpenSSL RSA公钥和私钥.但是,我似乎找不到使用给定私钥解密数据的方法.我知道如果我调用生成密钥然后相应的方法加密和解密数据它工作正常.但是,如果我尝试从给定公钥的外部源解密某些内容,我该如何使用该密钥进行解密.
注意:请不要给出不使用OpenSSL.NET的示例.Microsoft加密提供程序比OpenSSL慢得多,并且不符合我的速度要求.
谢谢!
public class AsymmetricKeyResult
{
public string PublicKey { get; set; }
public string PrivateKey { get; set; }
public AsymmetricKeyResult(string publicKey, string privateKey)
{
this.PublicKey = publicKey;
this.PrivateKey = privateKey;
}
}
public static AsymmetricKeyResult GenerateAsymmetricKeys(int keyLength)
{
RSA rsa = new RSA();
rsa.GenerateKeys(keyLength, 0x10021, null, null);
AsymmetricKeyResult kResult = new AsymmetricKeyResult(rsa.PublicKeyAsPEM, rsa.PrivateKeyAsPEM);
return kResult;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试将 RsaKeyParameter 公钥保存到 SQL 数据库中。我收到一个错误,提示 Bouncy Castle 无法将 RsaKeyParameters 转换为字节。
使用 BouncyCastle C#。
我生成了一个 RSA 密钥对,将私钥和公钥提取到变量中。然后我需要存储公钥以在应用程序的稍后阶段进行验证。
我找到了一篇关于转换为字节然后字符串的帖子,如下所示;
byte[] serializedPublicBytes =
publicKeyInfo.ToAsn1Object().GetDerEncoded();
string serializedPublic = Convert.ToBase64String(serializedPublicBytes);
Run Code Online (Sandbox Code Playgroud)
但它不喜欢 ToAsn1Object。补充一下这是一个例子,我知道我的变量名是不同的。
RsaKeyPairGenerator rsaKeyPairGen = new RsaKeyPairGenerator();
rsaKeyPairGen.Init(new KeyGenerationParameters(new SecureRandom(), 2048));
AsymmetricCipherKeyPair keyPair = rsaKeyPairGen.GenerateKeyPair();
RsaKeyParameters PrivateKey = (RsaKeyParameters)keyPair.Private;
RsaKeyParameters PublicKey = (RsaKeyParameters)keyPair.Public;
Run Code Online (Sandbox Code Playgroud)
公钥应该是字节,然后是字符串,以保存到数据库中。
我想创建公共密钥的base64从RSA Private key使用Security框架。这是片段。
let tag = "com.example.keys.mykey"
public extension SecKey {
static func generateBase64Encoded2048BitRSAKey() throws -> (private: String, public: String) {
let type = kSecAttrKeyTypeRSA
let attributes: [String: Any] =
[kSecAttrKeyType as String: type,
kSecAttrKeySizeInBits as String: 2048
]
var error: Unmanaged<CFError>?
guard let key = SecKeyCreateRandomKey(attributes as CFDictionary, &error),
let data = SecKeyCopyExternalRepresentation(key, &error) as Data?,
let publicKey = SecKeyCopyPublicKey(key),
let publicKeyData = SecKeyCopyExternalRepresentation(publicKey, &error) as Data? else {
throw error!.takeRetainedValue() as Error …Run Code Online (Sandbox Code Playgroud) 用例:我有一个用例,其中客户端生成私钥和公钥,将 base 64 编码的公钥发送到服务器。
在服务器端,我将使用此公钥加密消息并将加密消息发送到客户端,客户端使用其私钥解密。商定的算法是“RSA”。
问题出在服务器端,我看到某些密钥正在X509EncodedKeySpec用作密钥规范
byte[] publicBytes = Base64.decodeBase64(base64EncodedPubKey);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey pubKey = keyFactory.generatePublic(keySpec);
Run Code Online (Sandbox Code Playgroud)
虽然有些键会使用以下方法抛出异常 ( Caused by: java.security.InvalidKeyException: IOException: algid parse error, not a sequence)X509EncodedKeySpec但可以使用RSAPublicKeySpec:
byte[] publicBytes = Base64.decodeBase64(base64EncodedPubKey);
org.bouncycastle.asn1.pkcs.RSAPublicKey.RSAPublicKey pkcs1PublicKey = org.bouncycastle.asn1.pkcs.RSAPublicKey.RSAPublicKey.getInstance(publicBytes);
BigInteger modulus = pkcs1PublicKey.getModulus();
BigInteger publicExponent = pkcs1PublicKey.getPublicExponent();
RSAPublicKeySpec keySpec = new RSAPublicKeySpec(modulus, publicExponent);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey pubKey = keyFactory.generatePublic(keySpec);
Run Code Online (Sandbox Code Playgroud)
所以,我开始理解的是客户端和服务器需要同意是否使用:
PKCS #1或X.509对 key 进行编码。 …
我有大小为 2048 位的 RSA 公钥(如下所示):
-----开始公钥----- MIIBIjANBgkqhkiG9w0BAQEFAOCAQ8AMIIBCgKCAQEAjAc8U25mMDj93zGs6lEm 5HUbb22tLpWF8z13Lc4tRqNZ1WCGemI6fOhN1r1dkYpfMWakRqiCDX72gKi37zRX XJhYz9F8qUX CzGPdCWhr2Eywyl5YKsCV+wnHjRPL++aqBEMBTrKsxrPByGjDxpYW I/DgPinUWkZbSeIOZ4JX7Ze3SPNKDbDvJ5Ls2qGuFymtnpxWHbvWbHW1JuT4oHAd 1AhYOIRhVTRN+AGIgwvM0kposNH4P8KwhVe 2CD6Pz6+54ealf1SctrE/X2EohigO aG4O2QtGGc/FxnzhdHpLpcXiYhA6EFll+D3DdU6Hb4iBMYiQQBlFnf/A6Evuix+L dQIDAQAB -----结束公钥- ----
有没有办法通过使用.net core来获取密钥的模数和指数(无需编写任何自定义函数)?
rsa ×6
openssl ×4
c# ×3
cryptography ×2
encryption ×2
pem ×2
.net-core ×1
bouncycastle ×1
cer ×1
dnssec ×1
java ×1
jwk ×1
key-pair ×1
php ×1
php-openssl ×1
pseudocode ×1
public-key ×1
ssh-keys ×1
swift ×1