- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要使用公钥使用 PHP 来编码消息,并使用私钥使用 JavaScript 来解码该消息。
这是测试代码:
<?php
$message = 'sevenflash';
$public_key = openssl_get_publickey(file_get_contents('pubkey.pem'));
$encrypted = $e = NULL;
openssl_seal($message, $encrypted, $e, array($public_key));
$sealed_data = base64_encode($encrypted);
$envelope = base64_encode($e[0]);
$unsealed = null;
openssl_open(base64_decode($sealed_data), $unsealed, base64_decode($envelope), file_get_contents('privatekey.pem'));
echo $unsealed; // This is sevenflash
$embed = "<script>var encrypted = '$sealed_data'; var envelope = '$envelope'; </script>";
?>
<html>
<head>
<script type="text/javascript" src="rc4.js"></script>
<script type="text/javascript" src="enc-base64.js"></script>
<script type="text/javascript" src="jsencrypt/bin/jsencrypt.js"></script>
<?php echo $embed; ?>
<script>
var private_key = `...`;
var crypt = new JSEncrypt();
crypt.setPrivateKey(private_key);
var theKey = crypt.decrypt(envelope);
var decrypted = CryptoJS.RC4.decrypt(encrypted, theKey);
console.log(decrypted.toString()); // This must be sevenflash, but this is 696a2b0440220d69e8c3
</script>
</head>
<body>
</body>
</html>
但这行不通。为什么?
最佳答案
CryptoJS 解密需要使用 CipherParams
对象代替密文,并使用 WordArray
代替 key 。如果您将 key 作为字符串传递,那么它将假定它是密码,并尝试使用 MD5 和不存在的盐从中派生 key 。
尝试解析所有内容:
var decrypted = CryptoJS.RC4.decrypt({
ciphertext: CryptoJS.enc.Base64.parse(encrypted)
}, CryptoJS.enc.Latin1.parse(theKey));
JSEncrypt 从 crypt.decrypt()
函数返回一个“纯字符串”,这意味着必须使用 Latin1 或 UTF-8 编码对其进行解析。
但我无法让它与 JSEncrypt 一起使用,所以我使用了 forge相反:
var privateKey = forge.pki.privateKeyFromPem(private_key);
var theKey = privateKey.decrypt(forge.util.decode64(envelope), 'RSAES-PKCS1-V1_5');
CrypoJS 的 .toString()
默认返回十六进制编码版本。您可以覆盖它以获取文本数据:
console.log(decrypted.toString(CryptoJS.enc.Utf8));
var private_key = `-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAx1u1OPc+KT1vmLea4ro0VtdiQa9Pj7oFMF04uIPKb5BEuN6w
rHj3dQkdoeT3vWZaR/eAOnxSIgl4PwNm9C6AeW5vHAq/4XFp4FZbtbHfqCm3h6tT
m8FxmuTZQVr+Kgrkgiob/C5+bWHhD+rfUnaW8CGnvmhHD4AtxCVimMUhYLCSklkX
YOWng9aRO5kAvDx0KXyZ60YsJJwUouPat/vBdoHljRZhzOb7KHSek4yd//0zBmBW
3y9z+KG8WrpGEoCutGE14QBGh/EghRP9QAhfGV4a9kfD77S0Spu7uzmfzBuyyit5
Dhtcact4SJuJz2617I1gujGe51j5Oyex70hoEQIDAQABAoIBACJl5IMLxiH/g73q
EEOGtXk2eLG0uhmmkzahHyRXORq+3dy4L+vSg4AiLoa8pzJ68qDwR6PPx6wvzhux
TpZbX7eUIn/IKwuPMiGPRQu4wUqWyCAUo7yASEXdrs7kEG7Yqkz7TxDYROBCvz6r
3BSyeaC9beAgxgIar8rkWHrbqMKx5koX+3nopn2vrEQWTsP5PebMnC/2u3k3BfIW
5ucgaYlbrzfYULx2DZdBEuBtourE0yQePxNvTDd6tjcSnH/G/pZdy9GXamvgbIRH
5YCzO9gaiEzRgbddX96AHNXK7LmmSOvX4mdzjmkNb4yKud8+/fpX9fa4sIzKBMuB
15rdfzECgYEA/58+QBu2rjmE5qA6uMQYtzF7AvLK2ZfhfBs6lt/ItnlQ283sKaHS
vkzjmvVVq7hjbvjvFJ6aUAwzZ9XhOjbdpvkwVhGZfNdx7ia6ctH9q0Cq8ksmhVbD
SSEklWK5k5OcXbd8DiVClX8hRR13WbhK+L9Ct4/4+/2kA9bnsJKi92cCgYEAx6cr
A8faHUdIHSo01S8bRijCOVLKNXuOsgqVxe05RrcqJI/QpaHTFPvVm1rUb97sq9pW
eQANrWoONmoGVWzmKzK3Hk6mLSKfbPEhclQgVTsrlp4Mil9e06pqqw6FmuxFrk/5
FCws84vyijzt4/qvh1tXJoX7+xSSa82v86wJ0ccCgYEA0FhSvJ3Z/5cSI4dlVUM/
gdDqmjSZ8VBBkI4A6wfq6A9pQD5OxoAG7ORuftaHxTa8lK6A7yV2UNgg7fj9Yh1l
+7oPE5e0qnRPf/RA82UEhJhovKNT+koFUY2Z68hTyVz+jcQHcOAdrQu5akPiC1aS
hLwe/M5z+a96B0caAGkEOvECgYEAkOM3zB6Uovq/0qp2fN8ao+egS4lRRU7NV1dn
KaPmFPOHmdDkUc8GKAw6D+vyjtzwVCa26kinpFl6xvJadlP5FRBQ46Wf4tFlcOHs
q9NxQ2kVUNCRuTlMz760ej6npq4gQ0e2MnV8iaHd+YQN/4xFJa2bqVFCdAuR1roG
HoeS+LECgYAsJhCTNQUCeqvXO2cdJTQ1da3ug/P3c0Eg5DyrB7w7Fwtq/eeSsZOf
R1et6S+aRaEfclx2vEF9Ck4hcTESRNZrZJ4i5hB4y//B1og777H/jrT7H1NZfU11
Iwly+S/SlgTR9BrXCJsfenslolp/rMgiD2G8sky5yFRmrDB7qj8/Nw==
-----END RSA PRIVATE KEY-----`;
var encrypted = 'E+moZJOeVuxgsg=='; var envelope = 'LMJqdAu+FVPxVpVkLgBOrqLWkY/S/56KHETnt528k2D0lUDzl7nymsgycrto5BD4w17oH6THyC+0yg/Ws+gqpIIWimcQze1KKQy+1+uvH4gR1Olt22cgEUDid09dDqvSXi0VcYYYQXyxWzIQVd2Jun1A0h1qhWc4LinzkJSP6HuhH+D52eEcXep5H4cjjy62rgGIR5YyQO/RBXuYYBBRSgmeniFjY9FbR8AaBkhcCVYeBH28uBi0dx27hPQ0yVlVWrG3KuR2i441Ruhb4J+AOnr+K1uIMT+rnk8Th8eTTc/E1CSrZo9GASfEyYK8mJdwfq2/FJ5Qnp9uHl1aN/1RSg==';
var privateKey = forge.pki.privateKeyFromPem(private_key);
var theKey = privateKey.decrypt(forge.util.decode64(envelope), 'RSAES-PKCS1-V1_5');
var decrypted = CryptoJS.RC4.decrypt({
ciphertext: CryptoJS.enc.Base64.parse(encrypted)
}, CryptoJS.enc.Latin1.parse(theKey));
console.log(decrypted.toString(CryptoJS.enc.Utf8));
<script type="text/javascript" src="https://cdn.rawgit.com/CryptoStore/crypto-js/3.1.2/build/rollups/rc4.js"></script>
<script type="text/javascript" src="https://cdn.rawgit.com/CryptoStore/crypto-js/3.1.2/build/components/enc-base64-min.js"></script>
<script type="text/javascript" src="https://rawgit.com/artjomb/96b970358e20410fa64daa2e844aeb0f/raw/5375e7171ef297d436d65b962149dcc0e1960b2b/forge_v0.6.39.min.js"></script>
关于javascript - 使用 CryptoJS 解密 openssl_seal 中的密文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37833257/
我的 SEAL v2.3.1 中有这些 SEAL 设置: seal::EncryptionParameters parms; parms.set_poly_modulus("1x^2048 + 1")
我有一些使用 Perl 的 Crypt::CBC 加密的密文我希望在其他地方解密的模块。 密文是使用 Crypt::CBC 的“简单”版本生成的。构造函数,即: use Crypt::CBC; $ci
我在使用 CryptoPP 时遇到问题。我正在使用 AES,并且想通过将其编码为 base64 来表示二进制密文。 我的问题是我在运行以下代码时随机出现断言错误: std::string encode
据我所知,RSA 加密的输出将等于 key 模数的长度(在本例中为 128 字节)。我的 RSA 加密代码是: public byte [] RSAEncrypter () throws Except
情况: 我正在尝试从我的谷歌云存储桶中下载和解密一些数据。 对于加密和解密,我使用: https://cloud.google.com/kms/docs/quickstart#decrypt_data
我使用此 openssl 命令创建了一条加密消息: openssl enc -aes-256-cbc -salt -in plaintext.txt -out cipher.enc 我尝试过 Cryp
我正在尝试将 AES 加密的 Java 代码复制到 Golang 中。但是我在 golang 中没有得到相同的输出 我试过下面的代码: Java 代码: package EncryptionTest;
我通过 java 、 BouncyCaSTLe Provider 实现这个使用 block 模式 = ECB 和填充模式 = PKCS7Padding 我注意到,如果我加密32字节长度的数据(例如61
我看过类似的主题,但我找不到与我正在努力实现的目标完全相符的解决方案。 我有一个密文,需要根据每个字母在文本中出现的频率进行简单的字母替换。我已经有一个规范化文本的功能(小写,没有非字母字符,没有,计
我是一名优秀的程序员,十分优秀!