Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RSA-OAEP SHA-512从Javascriptwebcrypt api加密/解密到PHP openssl?_Javascript_Php_Encryption_Public Key Encryption_Webcrypto Api - Fatal编程技术网

RSA-OAEP SHA-512从Javascriptwebcrypt api加密/解密到PHP openssl?

RSA-OAEP SHA-512从Javascriptwebcrypt api加密/解密到PHP openssl?,javascript,php,encryption,public-key-encryption,webcrypto-api,Javascript,Php,Encryption,Public Key Encryption,Webcrypto Api,我一直在忙着使用WebCryptoAPI在browserclient和使用openssl的PHP服务器之间建立安全的交换。我已经尽我所能把事情分解了。我编写了一些javascript来生成一个密钥对,打印出private和public的值,加密一个简单的字符串并打印出来 我已经将这些值直接复制到一个简单的php脚本中。试图用javascipt中的值对其进行解码 编码和解码在javascript中可以正常工作(如下所示),而在php中解码不能正常工作(也在javascript下面)。我似乎也找不到

我一直在忙着使用WebCryptoAPI在browserclient和使用openssl的PHP服务器之间建立安全的交换。我已经尽我所能把事情分解了。我编写了一些javascript来生成一个密钥对,打印出private和public的值,加密一个简单的字符串并打印出来

我已经将这些值直接复制到一个简单的php脚本中。试图用javascipt中的值对其进行解码

编码和解码在javascript中可以正常工作(如下所示),而在php中解码不能正常工作(也在javascript下面)。我似乎也找不到在PHP中设置SHA-512声明的位置。有没有人有过这种交流的经验,也许能为我指明正确的方向。选择RSA-OAEP是因为它受chrome、mozilla、IE11和Safari以及PHP的支持

亲切问候,, 基甸

//JavaScript文档
var密钥对;
var-pemPublicKey;
var pemPrivateKey;
var_spki;
Varu pkcs8;
window.crypto.minute.generateKey({
名称:“RSA-OAEP”,
模长:2048,
publicExponent:new Uint8Array([1,0,1]),//65537的24位表示形式
哈希:{name:“SHA-512”}
},true,[“加密”、“解密”])
.then(函数(新密钥对){
keyPair=newKeyPair;
返回键对;
})
.then(功能(钥匙对){
window.crypto.division.exportKey('spki',keyPair.publicKey)
.then(功能(spki){
_spki=spki;
var pemPublicKey=convertBinaryToPem(spki,公钥);
书面文件(pemPublicKey);
sendToPhp();
});
window.crypto.division.exportKey('pkcs8',keyPair.privateKey)
.then(函数(pkcs8){
_pkcs8=pkcs8;
var pemPrivateKey=convertBinaryToPem(pkcs8,“私钥”);
书面文件(pemPrivateKey);
})
});
函数sendToPhp(){
window.crypto.division.importKey('spki',spki,{name:“RSA-OAEP”,散列:{name:“SHA-512”}},false,[“encrypt”])
.then(函数(加密密钥){
加密({name:“RSA-OAEP”},加密密钥,str2ab('mijn geheimpje'))
.then(函数(加密){
//返回包含加密数据的ArrayBuffer
document.writeln(arrayBufferToBase64String(加密));
从PHP接收(ArrayBufferToBase64字符串(加密));
});
});
}
函数receivedFromPhp(加密){
window.crypto.division.importKey('pkcs8',pkcs8,{name:“RSA-OAEP”,散列:{name:“SHA-512”}},false,[“decrypt”])
.then(函数(加密密钥){
decrypt({name:“RSA-OAEP”},加密密钥,base64StringToArrayBuffer(加密))
.then(函数(已解密){
//返回包含加密数据的ArrayBuffer
var decryp=ab2str(已解密);
调试器;
});
});
}
功能ab2str(buf){
返回字符串.fromCharCode.apply(null,新的Uint16Array(buf));
}
功能str2ab(str){
var buf=new ArrayBuffer(str.length*2);//每个字符2个字节
var bufView=新UINT16阵列(buf);

对于(var i=0,strLen=str.length;我想我解决了我自己的问题。我尝试了phpseclib,得到了散列错误的提示。在用SHA-1替换SHA-512后,它终于起作用了。在PHP文档中,它说crypt libe默认为SHA-1。phpseclib应该可以正常工作,完全独立于t他打开了_sslphp lib。但它没有。仍然不知道为什么会发生这种情况。但至少我有一个可行的解决方案……希望这能帮助其他从事同样工作的人

基甸

基甸

很高兴您找到了答案。您的问题不在于PHP,而在于Safari,它不支持除SHA1之外的任何OAEP,至少目前是这样

如果要使用WebCrypto,您可能需要查看:它列出了每个浏览器支持的组合

我们这样做是为了作为一个测试套件来帮助我们构建,这使得构建可互操作的WebCrypto应用程序更加容易