C ++ / Openssl从编码字节中获取RSA密钥(由java编码)

时间:2017-02-19 13:20:44

标签: java c++ encryption cryptography

有人知道如何从编码的字节数组中用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错误,不知道这个课程是什么。那么关键应该是有效的。

1 个答案:

答案 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)。