簡體   English   中英

C ++ / Openssl從編碼字節中獲取RSA密鑰(由java編碼)

[英]C++/Openssl Get RSA key from encoded bytes (encoded by java)

有人知道如何從編碼的字節數組中用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錯誤,不知道這個課程是什么。 那么關鍵應該是有效的。

Java為公鑰返回的是SubjectPublicKeyInfo結構,它不僅包含公鑰的(PKCS#1編碼)值,還包含密鑰標識符等。

所以要解碼這個,你必須在你最喜歡的搜索引擎中鍵入“decode SubjectPublicKeyInfo openssl”。 然后你會發現(后一些滾動)從下面的信息在這里

 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)是有原因的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM