【发布时间】:2017-05-11 15:07:33
【问题描述】:
我正在尝试解密使用 OpenSSL 命令行界面创建的文件。此文件是使用以下内容创建的:
openssl aes-256-cbc -a -in file.txt -out file_encrypted.txt
并且可以通过以下方式解密:
openssl aes-256-cbc -d -a -in file_encrypted.txt
通过使用 -p 标志,我可以检索 WebCrypto API 所需的实际值、盐和 IV:
> openssl aes-256-cbc -d -a -p -in file_encrypted.txt
salt=F57F1CC0CD384326
key=0E971326890959386F1CFB91F185CFE109203DCEBC81DCAD4EE642F34C538E5B
iv=A884549B66400EB198879F8A09148D4E
secret text
我目前的尝试是这样的:
function getKey (password) {
return crypto.subtle.digest({name: "SHA-256"}, convertStringToArrayBufferView(password)).then(function(result){
return crypto.subtle.importKey("raw", result, {name: "AES-CBC"}, false, ["encrypt", "decrypt"]);
});
}
function decrypt(key, data, iv) {
return crypto.subtle.decrypt({ name: "AES-CBC", iv: iv }, key, data).then(function(result){
var decrypted_data = new Uint8Array(result);
return convertArrayBufferViewtoString(decrypted_data);
}, fail);
}
var encrypted = Uint8Array.from('0E971326890959386F1CFB91F185CFE109203DCEBC81DCAD4EE642F34C538E5B'.match(/\w\w/g));
var IV = Uint8Array.from('A884549B66400EB198879F8A09148D4E'.match(/\w\w/g));
getKey(prompt('Enter decryption password:')).then(function (key) {
decrypt(key, encrypted, IV).then(result => {
console.log(`password: ${result}`)
});
}, fail);
(为简洁起见省略了数组到缓冲区的方法 - 取自http://qnimate.com/passphrase-based-encryption-using-web-cryptography-api/)
虽然没有指定DOMException,但我不知道下一步该做什么。
【问题讨论】:
-
好问题。 WebCrypto 准备好使用了吗? WbCrypto Working Group 似乎已经停滞不前了。
-
自两年前以来,所有现代浏览器桌面和移动设备都或多或少地实现了 WebCrypto。见caniuse.com/#feat=cryptography。我可以看到该小组本月发布了提议的建议。下一步应该是 Key Discovery Api,但在电子邮件组中查看活动我想我可能会死
标签: javascript openssl cryptography webcrypto-api