- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个由 cryptojs 加密的文本文件(可能还有一些自定义 js 函数来迭代密码的哈希值),我想通过 openssl.exe 在 Windows 中解密它,而不是使用浏览器(当我提供密码)。看起来 cryptojs 使用了一些自定义的东西,比如使用 sha512 派生 key 并将其迭代 11512 次,如下面的 js 解密器所示,然后使用 evpkdf 迭代 484 次(我不知道这些东西是什么意思)。从 cryptojs 解密文件的代码片段如下,我需要 openssl exe -cli params 来执行此操作,而无需在浏览器中使用该 js 库。
function hex2a(t) { //hex to ascii
for (var e = t.toString(), i = "", n = 0; n < e.length && "00" !== e.substr(n, 2); n += 2) i += String.fromCharCode(parseInt(e.substr(n, 2), 16));
return i; }
function decoder(secret, passwrd) {
for (var i = CryptoJS.SHA512(passwrd), n = 0; n < 11512; n++)
i = CryptoJS.SHA512(i);
(CryptoJS.algo.AES.keySize = 32),
(CryptoJS.algo.EvpKDF.cfg.iterations = 1e4),
(CryptoJS.algo.EvpKDF.cfg.keySize = 32);
var r = CryptoJS.AES.decrypt(secret, i.toString());
return (out = hex2a(r)), out;
}
这是它调用函数并在文件成功解密时返回文件的时间。
var msg="base64 of the salted encrypted file via cryptojs"
function proceed() {
var pass=document.getElementById('textfield2').value;
a=decoder(msg, pass);
if (a.search('{version')>-1) {
document.getElementById('status').innerHTML="SUCCESS";
download("result.json",a);
} else {
document.getElementById('status').innerHTML="FAILED";
}
我已经尝试过这个(windows openssl.exe cli 1.1)并且得到了关于 -iter 和其他参数的错误。不知道如何给它 key 大小 32 和迭代和 evpkdf 以及 js 文件解密的任何内容。
OpenSSL.exe enc -aes-256-cbc -md md5 -d -pass pass:"simpletext" -in "tiny.bin" -out "result.txt"
最佳答案
由于以下几个原因,原则上不可能使用 OpenSSL 进行解密:
指定的 key 大小 AES.keySize = 32
定义了一个 128 字节的 key (这里没有直接传递,而是从密码派生的)。大概是打算使用 32 字节的 key ,但 CryptoJS 以字为单位指定 key 大小,其中一个字由 4 个字节组成。
AES 仅为 16/24/32 字节 key 定义,即。 e.不适用于所使用的 128 字节 key 。尽管该 key 对于 AES 无效,但 CryptoJS 会由于错误 (Issue #293) 处理此 key 。
从 key 大小直接得出轮数,结果为 38 ( source code )。但是,AES 仅为轮数 10 (AES-128)、12 (AES-192) 和 14 (AES-256) (AES, Security) 定义。因此,生成的密文与 AES 不兼容,即通常不可能使用 AES 兼容工具(尤其是 OpenSSL)进行解密。
要使用 OpenSSL 进行解密,AES.keySize
需要具有值 4/6/8 之一,对应于允许的轮数 10/12/14 或 AES-128/192/256。因此,配置 AES.keySize = 32
是所有 AES 兼容工具(如 OpenSSL)的 KO 标准。
CryptoJS 使用 OpenSSL 函数 EVP_BytesToKey()
进行 key 派生。但是,OpenSSL 不支持指定的迭代计数 EvpKDF.cfg.iterations = 1e4
用于使用 EVP_BytesToKey()
进行 key 派生,只有值 1
( here, last part )。
更现代的 OpenSSL 版本(从 1.1.1 开始)具有选项 -iter ,但这仅与 key 派生 PBKDF2 结合使用,即如果指定了 -iter , 自动使用 PBKDF2 而不是 EVP_BytesToKey()
,后者与 CryptoJS 不兼容。
要使用 OpenSSL 进行解密,EvpKDF.cfg.iterations
将需要具有值 1
。因此,配置 EvpKDF.cfg.iterations = 1e4
是 OpenSSL 的 KO 标准。
传递给 CryptoJS 的密码是通过使用 SHA512 进行多次散列从原始密码派生出来的。正如 Artjom B. 的评论中已经解释的那样,这不能单独使用 OpenSSL 来实现,但它至少可以作为脚本的一部分。
EvpKDF.cfg.keySize
参数对加解密没有影响,可以忽略。
如果在发布的代码中使用兼容值而不是不兼容值,例如CryptoJS.algo.AES.keySize = 8
和 CryptoJS.algo.EvpKDF.cfg.iterations = 1
,可以使用 OpenSSL 解密。以下示例使用具有兼容值的发布代码并执行加密和解密。密文可以用OpenSSL解密:
//
// Your code
//
function hex2a(t) {
for (var e = t.toString(), i = "", n = 0; n < e.length && "00" !== e.substr(n, 2); n += 2) i += String.fromCharCode(parseInt(e.substr(n, 2), 16));
return i;
}
function decoder(secret, passwrd) {
for (var i = CryptoJS.SHA512(passwrd), n = 0; n < 11512; n++) i = CryptoJS.SHA512(i);
CryptoJS.algo.AES.keySize = 8; // compatible with OpenSSL: 4/6/8, corresponds to AES-128/192/265
CryptoJS.algo.EvpKDF.cfg.iterations = 1; // compatible with OpenSSL: 1
CryptoJS.algo.EvpKDF.cfg.keySize = 123; // ignored
var r = CryptoJS.AES.decrypt(secret, i.toString());
return (out = hex2a(r)), out;
}
//
// The encryption counterpart
//
function encrypt(secret, passwrd) {
for (var i = CryptoJS.SHA512(passwrd), n = 0; n < 11512; n++) i = CryptoJS.SHA512(i);
CryptoJS.algo.AES.keySize = 8;
CryptoJS.algo.EvpKDF.cfg.iterations = 1;
CryptoJS.algo.EvpKDF.cfg.keySize = 456;
console.log("CryptoJS input passphrase:\n", i.toString().replace(/(.{56})/g,'$1\n'));
var ciphertext = CryptoJS.AES.encrypt(secret, i.toString());
return ciphertext;
}
//
// Encryption, decryption
//
var ciphertext = encrypt('The quick brown fox jumps over the lazy dog', 'my initial passphrase');
var decryptedData = decoder(ciphertext, 'my initial passphrase');
console.log("Ciphertext:\n", ciphertext.toString().replace(/(.{56})/g,'$1\n'));
console.log("Plaintext:\n", decryptedData.replace(/(.{56})/g,'$1\n'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>
可能的输出:
CryptoJS input passphrase: 7bff3331f9dcfbb2e1c5b6cb4170689db91fe5b12258d59672fe0e9ce61780c61f3e6dc324e58cc2170c6a8010083aafe07930708ee63c0022a7e9bce784c4c5
Ciphertext: U2FsdGVkX1/3SLTOsvc6CoWfg53rR+l//pHiWstJibl5D5OopIFWVmhUDhEpj7zBZRjA1vQiIoU2F5qR1v8NEw==
Plaintext: The quick brown fox jumps over the lazy dog
密文可以用下面的OpenSSL语句解密(直接使用派生密码):
openssl enc -aes-256-cbc -d -a -A -in <path to ciphertext file> -md md5 -pass pass:7bff3331f9dcfbb2e1c5b6cb4170689db91fe5b12258d59672fe0e9ce61780c61f3e6dc324e58cc2170c6a8010083aafe07930708ee63c0022a7e9bce784c4c5
当使用与这些参数不同的参数时(例如 AES.keySize = 32
或 EvpKDF.cfg.iterations = 1e4
),解密通常会失败并显示解密错误(即使使用 -iter 10000
)。
关于javascript - 如何在 openssl 中解密使用自定义迭代和 key 大小的 CryptoJs3+ 库加密的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66657689/
我有一个 C# 应用程序调用 Java 网络服务来验证用户密码。我想让 C# 应用程序加密密码,然后让 Java Web 服务解密密码。我已经完成了 Java 端的代码(解密代码),但我无法找出 C#
我正在使用以下代码在使用 openssl 的 Windows 中使用 C 加密和解密二进制数据。如您所见,在这两个函数中,我都知道纯文本的大小。有什么方法可以在不知道纯文本大小的情况下解密消息? #i
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我有一个非常恼人的问题,Java中使用RSA算法对字符串进行不可靠的加密和解密。它似乎只能在大约 35% 的时间内工作,而且我不明白为什么它有时能工作,有时却不能。这是我写的一些测试代码,试图验证加密
我已经设法编写了用于文件加密/解密的函数。但它非常慢,尤其是随着文件大小的增加。例如几MB长的音频/视频文件 我几乎浏览了所有帖子来改进它,并尝试更改算法。如果有任何更改可以帮助我提高性能,请帮助我。
我正在尝试让我的转置密码发挥作用。 每当我将加密方法得到的密文输入解密方法时,我应该得到原始的明文......但事实并非如此...... 我做错了什么? 感谢您的帮助! public String E
我正在使用密码来加密和解密消息: public String encrypt(String string) throws InvalidKeyException, IllegalBlockSizeEx
我有一个在 MySQL 中存储数据的 spring-mvc 堆栈。其中一些数据需要保护,所以我想我应该加密它。由于我以后可能需要使用这些数据(信用卡、SSN 等),所以我需要对其进行解密。我认为这排除
作为一名SEOER,都想了解百度算法,通过算法原理来找到捷径的优化方案,那么今天我把研究多年的百度算法原理解密给大家,可能不是最好的,但是我可以给大家保证,这些都是非常实际的。希望给SEOER带来一
我试图找到一种技术来加密和解密程序中的文件,而无需将密码硬编码到程序中,也无需向用户询问密码。 如果我也可以从我正在编写的另一个程序中解密文件,那就太好了。 到目前为止,我还没有多少运气找到一种看起来
有没有一种方法可以使用作为字符串参数传递给程序的私钥而不是使用存储在机器上的证书来解密 PowerShell 中的 RSA?欢迎任何帮助,我的代码如下。 Function Decrypt-Asymme
通过问题Is it possible to use the Grails Jasypt plugin outside the GORM layer for simple String encrypti
我需要解密/加密我的域类中的几列,并且正在寻找有关如何做的信息。我已经找到了jasypt加密插件,但不幸的是它似乎与Grails 2.4不兼容。 我可能可以将一些东西拼凑在一起,但是想要确保Im遵循最
我需要有关声音文件加密/解密的帮助。我想在存储这个声音文件时加密一个声音文件,并在播放这个文件时解密它。我阅读了有关 java 中的加密/解密以及 java 中可用于此的大量示例代码。但这些程序不适用
我很感兴趣是否可以使用 Excel Visual Basic 和某些加密服务提供程序进行字符串加密/解密。 我找到了一个演练 Encrypting and Decrypting Strings in
我们正在使用加密/解密和UIIMAGE。如果我们在不保存到iphone画廊的情况下进行加密和解密以及UIIMAge,则可以正常工作,但是,如果我们进行加密,保存到画廊,将(加密的图像)加载到应用程序中
我正在做一个像这样的简单程序: package rsaexample; import java.io.*; import java.math.BigInteger; import java.secur
我发现这段代码返回给定字符串的校验和。 public static String getChecksum(String md5) { int counter = 0; while (c
我在 Java SE 和 Android 项目上使用相同的代码。在 Java 和 Android 中运行的应用程序连接到相同的 MQTT 代理并交换消息。消息使用 AES 进行加密/解密。我对 Jav
我想在 openssl/libcrypto 中使用 RSA 加密/解密一个长文件(我知道 AES 更好,但这只是为了比较)。我将输入文件分成大小为 numBlocks = inputFileLengt
我是一名优秀的程序员,十分优秀!