簡體   English   中英

將公共 RSA 密鑰導入 nodejs

[英]Imported a public RSA key into nodejs

我正在嘗試將 swift 中生成的公共 RSA 密鑰傳輸到我的 Nodejs 服務器中。 我使用以下代碼生成了 RSA 密鑰。

private var clientPriv: SecKey?
private var clientPub: SecKey?
private init(){
    let params: [String: Any] = [
        String(kSecAttrKeyType): kSecAttrKeyTypeRSA,
        String(kSecAttrKeySizeInBits): 4096
    ]
    SecKeyGeneratePair(params as CFDictionary, &clientPub, &clientPriv)
}

我使用此代碼將密鑰發送到我的服務器

...
guard let clientPub = clientPub else { return }

let key = SecKeyCopyExternalRepresentation(clientPub, nil)! as Data
let pem = exportToPEM(data: key, withLabel: "PUBLIC KEY")
let data = ["clientPub": pem]
var urlRequest = URLRequest(url: url)
do {
    try urlRequest.httpBody = JSONSerialization.data(withJSONObject: data)
    urlRequest.httpMethod = "POST"
    urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
}catch let err {
    print(err)
}

let task = URLSession.shared.dataTask(with: urlRequest){ data, response, error in
    guard let data = data, error == nil else {
        return
    }
...

exportToPem 助手看起來像這樣。

public func exportToPEM(data: Data, withLabel label: String) -> String {
    let key = data.base64EncodedString(options: [.lineLength64Characters])
    var pem = "-----BEGIN \(label)-----\n"
    pem += key
    pem += "\n-----END \(label)-----\n"
    return pem
}

在我的 Nodejs 端,我使用 express 來處理我的請求,並使用 body-parser 來解析請求中的 json 發布數據。 這是我的 Nodejs 接收代碼的樣子。

app.post('/api/init', jsonParser, function (req, res) {
    console.log(req.body.clientPub);
    CLIENTPUB = crypto.createPublicKey({ key: req.body.clientPub, format: 'pem', type: 'pkcs1' });
    console.log(CLIENTPUB);
    res.write(JSON.stringify({'server-pub': SERVERPUB.toString()}));
    res.end()
});

問題是 function crypto.createPublicKey 不斷拋出錯誤, error:0D0680A8:asn1 encoding routines:asn1_check_tlen:wrong tag 我已經嘗試了許多不同的方法來編寫我的密鑰字符串,但無論看起來如何,加密 createPublicKey 只是拒絕接受它。 我曾嘗試將格式保留為每 64 個字節使用 \n 或根本不使用 \n,完全刪除頁眉/頁腳,以及許多其他不同的組合。 我不明白為什么它一直拒絕接受我發送的任何格式。 我也試過只使用 der 格式,但也被拒絕了。

誰能給我任何關於如何讓這個 function 接受我的密鑰格式的建議?

SecKeyCopyExternalRepresentation()以 PKCS#1 格式導出公鑰,該格式在type參數為'pkcs1'createPublicKey()調用中在 NodeJS 端正確指定。
但是,PKCS#1 格式的 PEM 編碼密鑰的 header 和頁腳文本是BEGIN RSA PUBLIC KEYEND RSA PUBLIC KEY ,因此在調用exportToPEM()時,必須在第二個參數中傳遞"RSA PUBLIC KEY"而不是"PUBLIC KEY"

let pem = exportToPEM(data: key, withLabel: "RSA PUBLIC KEY")

BEGIN PUBLIC KEYEND PUBLIC KEY用於 X.509/SPKI 格式的 PEM 編碼公鑰。 這就是錯誤消息wrong tag的意思。

暫無
暫無

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

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