gpt4 book ai didi

javascript - 如何使用CryptoJS进行加密以及如何使用Rust Magic Crypt进行解密

转载 作者:行者123 更新时间:2023-12-03 11:33:43 25 4
gpt4 key购买 nike

我正在尝试使用Javascript的CryptoJS加密消息,如下所示:

const encrypted_payload = CryptoJS.AES.encrypt("Hello, world!", "magickey");
console.log(enrypted_payload.toString());
...然后使用Rust的 Magic Crypt库解密,如下所示:
#[macro_use] extern crate magic_crypt;
use magic_crypt::MagicCryptTrait;

fn main() {
let message = r#"U2FsdGVkX1+anrxRX8UNTJ8ur9LIf6n2YcmbmDqPSls="#;

let mc = new_magic_crypt!("magickey", 256);

let result = mc.decrypt_base64_to_string(&message)
.expect("Could not decrypt base64 to string");

println!("{}", result)
}
Rust的 Cargo.toml文件包括:
[dependencies]
magic-crypt = "3.1.6"
这无法编译。错误语句是 DecryptError(BlockModeError)

最佳答案

如果在CryptoJS中将 key 作为字符串传递,则将其解释为密码,并使用特殊的派生函数(EVP_BytesToKey)派生 key /IV。要将键直接作为键处理,必须将其作为WordArray传递。
在Rust代码中,密码似乎只是简单地经过哈希处理(例如,对于AES-128为MD5,对于AES-256为SHA256),这令人惊讶地是不安全的(尽管我不是Rust专家并且可能会忽略某些东西)。
无论如何,这会导致 key 不兼容。一种可能是将Rust键的哈希值用作CryptoJS中的WordArray:
示例:从magic_crypt文档中,here:

use magic_crypt::MagicCryptTrait;
let mc = new_magic_crypt!("magickey", 256);
let base64 = mc.encrypt_str_to_base64("http://magiclen.org");
assert_eq!("DS/2U8royDnJDiNY2ps3f6ZoTbpZo8ZtUGYLGEjwLDQ=", base64);
assert_eq!("http://magiclen.org", mc.decrypt_base64_to_string(&base64).unwrap());
magic_crypt在内部从密码派生一个32字节的 key 作为SHA256哈希。然后,使用CryptoJS进行的加密是:

var key = CryptoJS.SHA256("magickey");
var ciphertext = "DS/2U8royDnJDiNY2ps3f6ZoTbpZo8ZtUGYLGEjwLDQ=";
var iv = CryptoJS.enc.Base64.parse("AAAAAAAAAAAAAAAAAAAAAA==")
var decrypted = CryptoJS.AES.decrypt(ciphertext, key, {iv: iv});

console.log(decrypted.toString(CryptoJS.enc.Utf8));
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>

两种代码都将CBC模式应用于IV填充为零且PKCS7填充为零的情况。请注意,静态IV是不安全的,只能用于测试。
另一个方向是类似的,例如。使用CryptoJS加密从Rust示例生成密文(假设使用相同的 key ,IV和明文):

var key = CryptoJS.SHA256("magickey");
var plaintext = "http://magiclen.org";
var iv = CryptoJS.enc.Base64.parse("AAAAAAAAAAAAAAAAAAAAAA==")
var ciphertext = CryptoJS.AES.encrypt(plaintext, key, {iv: iv});

console.log(ciphertext.toString());
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>

关于javascript - 如何使用CryptoJS进行加密以及如何使用Rust Magic Crypt进行解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65332716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com