3 回答

TA貢獻1818條經(jīng)驗 獲得超7個贊
我遇到過同樣的問題。經(jīng)過更多調(diào)試后,我意識到 C# 使用 DeriveKeyMaterial 生成的密鑰然后使用 SHA-256 進行哈希處理。
我的解決方案是在 javascript 上導(dǎo)出派生密鑰,對其進行哈希處理,然后將其作為新密鑰導(dǎo)入。
cryptoApi().deriveKey(
{
name: "ECDH",
namedCurve: "P-256", //can be "P-256", "P-384", or "P-521"
public: ServerKey, //an ECDH public key from generateKey or importKey
},
ECkey.privateKey, //your ECDH private key from generateKey or importKey
{ //the key type you want to create based on the derived bits
name: "AES-CBC", //can be any AES algorithm ("AES-CTR", "AES-CBC", "AES-CMAC", "AES-GCM", "AES-CFB", "AES-KW", "ECDH", "DH", or "HMAC")
//the generateKey parameters for that type of algorithm
length: 256, //can be 128, 192, or 256
},
true, //whether the derived key is extractable (i.e. can be used in exportKey)
["encrypt", "decrypt"] //limited to the options in that algorithm's importKey
)
.then(function(AESKeyData){
//returns the exported key data
console.log(AESKeyData);
cryptoApi().exportKey('raw',
AESKeyData
).then(function (exportedAESKeyData) {
cryptoApi().digest('SHA-256', exportedAESKeyData).then(function (HashedAESKeyValue) {
console.log(HashedAESKeyValue);
cryptoApi().importKey(
'raw',
HashedAESKeyValue,
{ //the key type you want to create based on the derived bits
name: "AES-CBC", //can be any AES algorithm ("AES-CTR", "AES-CBC", "AES-CMAC", "AES-GCM", "AES-CFB", "AES-KW", "ECDH", "DH", or "HMAC")
//the generateKey parameters for that type of algorithm
length: 256, //can be 128, 192, or 256
},
false,
["encrypt", "decrypt"]
).then(function (TrueAESKey) {
cryptoApi().decrypt(
{
name: 'AES-CBC',
length: 256,
iv: base64ToArrayBuffer(IV)
},
TrueAESKey,
base64ToArrayBuffer(EncryptedData)
).then(function (decrypted) {
console.log(buf2hex(decrypted));
});
})
});
});
})

TA貢獻1831條經(jīng)驗 獲得超9個贊
你見過PKI.js嗎?在那里您可以找到 CMS Enveloped/Encrypted Data 的所有可能的密鑰加密模式的完整實現(xiàn)。還有現(xiàn)場示例,這里是所有示例的源代碼。請注意存在的wiki頁面關(guān)于PKI.js.與CMS EnvelopedData工作

TA貢獻1797條經(jīng)驗 獲得超6個贊
嘗試這樣做
要點中的完整示例
class Protector {
ab2str(buffer) {
return new TextDecoder().decode(buffer);
}
str2ab(text) {
return new TextEncoder().encode(text);
}
generateIv() {
return crypto.getRandomValues(new Uint8Array(16));
}
/**
* @see https://github.com/mdn/dom-examples/blob/master/web-crypto/derive-bits/ecdh.js
*/
async generateKey() {
this.key = await window.crypto.subtle.generateKey(
{ name: 'ECDH', namedCurve: 'P-256' },
false,
['deriveBits']
);
}
async encrypt(plaintext) {
const counter = this.generateIv();
const buffer = await crypto.subtle.decrypt({
name: 'aes-ctr',
counter: counter,
length: 128
}, this.importedKey, this.str2ab(plaintext));
return { buffer, counter };
}
async decrypt(data) {
const buffer = await crypto.subtle.decrypt({
name: 'aes-ctr',
counter: data.counter,
length: 128
}, this.importedKey, data.buffer);
return this.ab2str(buffer);
}
getPublicKey() {
return {publicKey: this.key.publicKey};
}
async setRemotePublicKey(key) {
this.clientKey = key;
this.sharedSecret = await window.crypto.subtle.deriveBits(
{ name: 'ECDH', namedCurve: 'P-256', public: this.clientKey.publicKey },
this.key.privateKey,
256
);
this.importedKey = await crypto.subtle.importKey(
'raw',
this.sharedSecret,
'aes-ctr',
false,
['encrypt', 'decrypt']
);
}
}
如何使用:
(async () => {
// Generate Keys
const pro1 = new Protector();
await pro1.generateKey();
const pub1 = pro1.getPublicKey();
const pro2 = new Protector();
await pro2.generateKey();
const pub2 = pro2.getPublicKey();
// Exchange Keys
await pro1.setRemotePublicKey(pub2);
await pro2.setRemotePublicKey(pub1);
// Let`s Encrypt
const crypted = await pro1.encrypt('Hello World');
const descrypted = await pro2.decrypt(crypted);
})();
- 3 回答
- 0 關(guān)注
- 380 瀏覽
添加回答
舉報