- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想要做的是在 javascript 中生成一个 key 对,并在 PHP 中使用这些加密,然后用 JS 解密。
我在附加的代码中有两个问题
<?php
use phpseclib3\Crypt\PublicKeyLoader;
use phpseclib3\Crypt\RSA;
if ($_POST) {
$public=$_POST['public'];
$data='some text to encrypt';
$key = PublicKeyLoader::load($public);
$key = $key->withPadding(RSA::ENCRYPTION_OAEP);
$encoded=base64_encode($key->encrypt($data));
header('Content-Type: application/json');
echo json_encode(array('encrypted'=>$encoded));
exit;
}
?>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.js"></script>
<script>
jQuery(document).ready(function($) {
function ab2str(buf) {
return String.fromCharCode.apply(null, new Uint8Array(buf));
}
function str2ab(str) {
var buf = new ArrayBuffer(str.length*2); // 2 bytes for each char
var bufView = new Uint16Array(buf);
for (var i=0, strLen=str.length; i < strLen; i++) {
bufView[i] = str.charCodeAt(i);
}
return buf;
}
function importPrivateKey(pem) {
// fetch the part of the PEM string between header and footer
const pemHeader = "-----BEGIN PRIVATE KEY-----\n";
const pemFooter = "\n-----END PRIVATE KEY-----";
const pemContents = pem.substring(pemHeader.length, pem.length - pemFooter.length);
// base64 decode the string to get the binary data
const binaryDerString = window.atob(pemContents);
// convert from a binary string to an ArrayBuffer
const binaryDer = str2ab(binaryDerString);
return window.crypto.subtle.importKey(
"pkcs8",
binaryDer,
{
name: "RSA-OAEP",
modulusLength: 1024,
publicExponent: new Uint8Array([1, 0, 1]),
hash: {name: "SHA-256"}
},
true,
["decrypt"]
);
}
(async() => {
let keyPair = await window.crypto.subtle.generateKey(
{
name: "RSA-OAEP",
modulusLength: 1024,
publicExponent: new Uint8Array([1, 0, 1]),
hash: {name: "SHA-256"}
},
true,
["encrypt", "decrypt"]
);
var exported=await window.crypto.subtle.exportKey("pkcs8",keyPair.privateKey);
var exportedAsString = ab2str(exported);
var exportedAsBase64 = window.btoa(exportedAsString);
var private = `-----BEGIN PRIVATE KEY-----\n${exportedAsBase64}\n-----END PRIVATE KEY-----`;
var exported = await window.crypto.subtle.exportKey(
"spki",
keyPair.publicKey
);
var exportedAsString = ab2str(exported);
var exportedAsBase64 = window.btoa(exportedAsString);
var public = `-----BEGIN PUBLIC KEY-----\n${exportedAsBase64}\n-----END PUBLIC KEY-----`;
console.log(public);
console.log(private);
$.ajax({
url:window.location,
type:'POST',
data:{
public:public
},
success:function(data) {
(async() => {
console.log('*ENCRYPTED BY PHP*',data.encrypted);
// HELP!!! NEED TO BE ABLE TO RELOAD THE KEY FROM ARMORED STRING
var key=await importPrivateKey(private); // Error - Uncaught (in promise) DOMException
var buffer=str2ab(window.atob(data.encrypted));
// HELP!!! WONT DECRYPT WHAT PHP ENCODED USING THE PUBLIC KEY
var decrypted=await window.crypto.subtle.decrypt({name:"RSA-OAEP"},key,buffer);
console.log('DECRYPTED',decrypted);
})();
}
});
})();
});
</script>
最佳答案
该错误位于 str2ab()
函数,它使用 Uint16Array
而不是 Uint8Array
.
如果解决了这个问题,就可以导入私钥,解密用PHP代码生成的密文:
function ab2str(buf) {
return String.fromCharCode.apply(null, new Uint8Array(buf));
}
function str2ab(str) {
// Fix: Don't double the size
var buf = new ArrayBuffer(str.length);
// Fix: Apply a Uint8Array!
var bufView = new Uint8Array(buf);
for (var i=0, strLen=str.length; i < strLen; i++) {
bufView[i] = str.charCodeAt(i);
}
return buf;
}
function importPrivateKey(pem) {
const pemHeader = "-----BEGIN PRIVATE KEY-----\n";
const pemFooter = "\n-----END PRIVATE KEY-----";
const pemContents = pem.substring(pemHeader.length, pem.length - pemFooter.length);
const binaryDerString = window.atob(pemContents);
const binaryDer = str2ab(binaryDerString);
return window.crypto.subtle.importKey(
"pkcs8",
binaryDer,
{
name: "RSA-OAEP",
modulusLength: 1024,
publicExponent: new Uint8Array([1, 0, 1]),
hash: {name: "SHA-256"}
},
true,
["decrypt"]
);
}
(async function() {
// Apply the private key from key pair generated with the posted JavaScript code
var privateKey =
`-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKeQUdBu3zTX6QyfGfRWYxWWOnxd2xssTOIu6XczDByQEMfBbpQO9iM3u/Mn84zZFPFNvOKUNxcnftmrPiqUO9fBI2aAh77d2m65FBGsm4k/oUPzMNORGaDdBY4gg8FPMKo60kqBaMXAwzF8I4EUS/ot2fkBzSL0BGXT9o1NaO8bAgMBAAECgYAO2OPW8ywF86ervaFAHDN1YzVVdb+HXdqGJB/9tuE42q8R9BrHNbgrkLGvrveOoGGRrBCzhuyGubIsuVat0SqoI6qEnB9uahaIBfF5FZ7+bNW5OfkgerUUYP1S1MGFxUqINnUY1YHITmo6pUKHsiJtP7sihnCT6uEx8LqVNf1quQJBANs+VCZVUDq6eMy3E/u03HiAB8cyqLVMVQ4cLyoiWmFlnEFzZwMd20ZMjtcxICiizW3dlDvyxWYKH93irL0JyM0CQQDDp/VFsh83vKICVvM9IZHwE/Z8vZA3eTkGbWmgnr6qaxqge3FU02kUvIHHlvLmXYIt30lTq0Rn+Lz+TGV/jDeHAkBHYSaSiGojhLx5og1+gKbbEIv3vbWRuTVj76cnZ6HXXfaelIzwRdMzMw+6XgMjV8XcRCzTy7ma/Cbd3cPxk/LtAkEAwkehMVexz/KrHI+icG1JMI9iDnNdJPhmO4+hdzCqOyanBfwNiSF0Encslze4ci8f+NTjRwWlo2hGomzRzFk7OQJAPPd/o0azkg9nF+JxLiz7hF+/6MLVZgIfw04u05ANtOSVVQP4UTmJ/tNAe3OBUQVlRQAJ1m3jzUlir0ACPypC1Q==
-----END PRIVATE KEY-----`;
// Use the ciphertext generated with the PHP code
var ciphertext = 'a8gEZ6/DymB8dTGPytQPNS8QiYFuUULK+/c0vtie1l722isC0Z/jSeC2ytA6MjVUuTdq7sPuNW850gEZ2XvKujLQzl9sjJ8pcsxznBzMK8v03YJCTBr2lbfHpEEtuSLaAR2UbovXDoCyIIvOnMjqlIS3Ug2PG4hALThn/aAUwE0=';
var key = await importPrivateKey(privateKey);
var decryptedBuffer = str2ab(window.atob(ciphertext));
var decrypted = await window.crypto.subtle.decrypt(
{name:"RSA-OAEP"},
key,
decryptedBuffer
);
console.log(ab2str(decrypted)); // some text to encrypt
})();
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnkFHQbt801+kMnxn0VmMVljp8XdsbLEziLul3MwwckBDHwW6UDvYjN7vzJ/OM2RTxTbzilDcXJ37Zqz4qlDvXwSNmgIe+3dpuuRQRrJuJP6FD8zDTkRmg3QWOIIPBTzCqOtJKgWjFwMMxfCOBFEv6Ldn5Ac0i9ARl0/aNTWjvGwIDAQAB
-----END PUBLIC KEY-----
用于使用发布的 PHP 代码执行加密,私钥应用于上面的代码进行解密。
关于javascript - RSA 加密、PHP 加密 (phpseclib) 和 JavaScript 解密 (crypto.subtle),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67346549/
我想知道如何实现类似于 Epiphany(又名 Gnome Web)正在使用的进度条/加载器指示器。请参阅提供的屏幕截图: 最佳答案 如果我正确阅读 Epiphany 源代码,它只是一个样式化的 Gt
我正在尝试在golang中实现以下JS代码,但在golang的加密软件包中找不到任何导出 key 方法: JS代码: return Crypto.subtle.generateKey({
在 javascript 中,是否可以在同步函数中使用浏览器内置的 sha256 哈希( https://developer.mozilla.org/en-US/docs/Web/API/Subtle
我正在使用 Node v17.4 并想使用 webcrypto API。基于 this example我正在尝试导入 subtle进入我的项目,但 TypeScript 出现错误 Property '
我已经运行了来自 MDN doc 的这个例子 const text = 'An obscure body in the S-K System, your majesty. The inhabitant
根据 bip39 standard ,我想从 javascript 中的mnemonic words 中获取seed。 我使用这段代码: function mnemonicToSeed(mnemoni
在an answer on another question ,据称当使用带有 QSerialPort 的主 Qt 事件循环时,QSerialPort::waitForBytesWritten 会导致
在 Chrome 60 中,他们添加了一项针对非 TLS 连接禁用 crypto.subtle 的功能。出于安全原因,我们的产品需要运行本地服务器并将一些安全远程连接转发到 localhost。因为
我使用 python 生成了 RSA key 对,我想在 javascript 中导入它。我成功导入了公钥,但在导入私钥时遇到了困难。 Python: from Cryptodome.PublicKe
我正在制作一个带有主干的 Cordova 应用程序,我的目标是使用 JSON Web token (JWT) 实现套接字身份验证。 为了签署我的 JWT,我使用了 webcrypto-jwt在浏览器中
我正在尝试使用相应的私钥对使用公钥编码的 RSA 2048 位消息进行解码。环境是 google chrome,我使用的是 window.crypto.subtle API。 我生成了 key 对并使
我正在使用 window.crypto.subtle.importKey() 作为我的应用程序中的身份验证过程之一。当我在节点服务器上运行它时它可以工作,但当我将它托管在 IIS 上时它不工作。 Er
我正在开发 React Native 应用程序,并且有一个如下所示的配置文件组件: 容器有 backgroundColor: '#fff',铅笔图标有 borderColor: '#fff'。 但是,
当我尝试在 Firefox 上使用 Crypto API 时遇到了问题。 (doc)当我尝试使用此函数加密明文时,出现类型错误: window.crypto.subtle.encrypt(algo_e
我目前在 Javascript 中使用 window.crypto.subtle.encrypt 中的网络加密 API。我的问题是,这默认使用什么填充?我已经搜索了一段时间,但找不到任何答案。 最佳答
这真的很尴尬 几乎在互联网上的任何网站上, window.crypto.subtle 返回 SubtleCrypto {} __proto__: SubtleCrypto 在 chrome 控制台
我编写了一个使用 CryptoJS 实现的系统。 在编写代码后,我发现了 crypto.subtle.encrypt,它是浏览器中内置的 AES 实现。 我想将我的代码从使用 CryptoJs 改为使
我正在使用 Cordova 和 forge library和浏览器的 Web Crypto API执行 sign和 importKey操作。尽管如此,Android 设备上的 Web Crypto A
我想要做的是在 javascript 中生成一个 key 对,并在 PHP 中使用这些加密,然后用 JS 解密。 我在附加的代码中有两个问题 它不会从装甲文本块重新加载私钥 并且它不会解密 PHP 加
我正尝试按如下方式导入 ECDSA 公钥: ua8 = new Uint8Array( [48, 86, 48, 16, 6, 4, 43, 129, 4, 112, 6, 8, 42, 134, 7
我是一名优秀的程序员,十分优秀!