有人知道如何从编码的字节数组中用C ++创建RSA密钥吗?
我的问题是我尝试开发一个与用Java编码的服务器交互的C ++客户端。 在Java中,客户端接收编码为字节数组的rsa密钥,将其解码为RSA RSAPublicKey并使用此密钥加密消息。
java服务器/客户端代码:
public static PublicKey decodePublicKey(byte[] p_75896_0_)
{
try
{
X509EncodedKeySpec var1 = new X509EncodedKeySpec(p_75896_0_);
KeyFactory var2 = KeyFactory.getInstance("RSA");
return var2.generatePublic(var1);
}
catch (NoSuchAlgorithmException var3)
{
;
}
catch (InvalidKeySpecException var4)
{
;
}
field_180198_a.error("Public key reconstitute failed!");
return null;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
this.publicKey = CryptManager.decodePublicKey(data.readByteArray());
之后,客户端正在使用他的密钥进行一些加密。
密钥的发送方式如下:
public static final KeyPair keys;
static
{
try
{
KeyPairGenerator generator = KeyPairGenerator.getInstance( "RSA" );
generator.initialize( 1024 );
keys = generator.generateKeyPair();
} catch ( NoSuchAlgorithmException ex )
{
throw new ExceptionInInitializerError( ex );
}
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
byte[] pubKey = keys.getPublic().getEncoded();
writeBytes(pubKey);
我的问题是如何从C ++中的字节数组中获取密钥。
更新 我目前正在编写此代码:
char* publicKey = ...
int publicKeyLength = 162;
EVP_PKEY* key = EVP_PKEY_new();
if(d2i_PUBKEY(&key, (const unsigned char**) &publicKey, publicKeyLength) != 0){
logError("Problem!");
}
logMessage("Key: "+to_string((uint64_t) (void*) key));
我现在的问题是我在第三行有一个SIGSEGV错误,不知道这个课程是什么。那么关键应该是有效的。
答案 0 :(得分:0)
Java返回的公钥是SubjectPublicKeyInfo结构,它不仅包含公钥的(PKCS#1编码)值,还包含密钥标识符等。
所以要解码这个,你必须在你最喜欢的搜索引擎中键入“decode SubjectPublicKeyInfo openssl”。然后你会发现(在一些滚动之后)来自here的以下信息:
d2i_PUBKEY() and i2d_PUBKEY() decode and encode an EVP_PKEY structure using SubjectPublicKeyInfo format. They otherwise follow the conventions of other ASN.1 functions such as d2i_X509().
显然你需要解码算法。
请注意,openssl是C,因此在解码内容时要注意缓冲区溢出。我宁愿使用1024位RSA密钥,与安全软件一起使用,而不是2048位密钥,软件充满缓冲区溢出。
毋庸置疑,您需要在导入之前信任公钥。有一个原因,它被称为公钥基础设施(PKI)。