gpt4 book ai didi

javascript - Node JS 和 C# 中的 AES 加密给出了不同的结果

转载 作者:行者123 更新时间:2023-12-01 15:16:28 25 4
gpt4 key购买 nike

我有一个用例,必须使用 AES 256 算法对文本进行编码和发送。客户端代码在 C# 中,它将解密代码。

JS中的加密代码:

const crypto = require('crypto');
algorithm = 'aes-256-cbc',
secret = '1234567890123456',
keystring = crypto.createHash('sha256').update(String(secret)).digest('base64').substr(0, 16);
iv = crypto.createHash('sha256').update(String(secret)).digest('base64').substr(0, 16);
inputEncoding = 'utf8',
outputEncoding = 'base64';


function encrypt(text) {
let cipher = crypto.createCipheriv('aes-256-cbc', keystring, iv);
let encrypted = cipher.update(text, inputEncoding, outputEncoding)
encrypted += cipher.final(outputEncoding);
return encrypted;
}

客户端使用的更新代码:
var keybytes = Encoding.UTF8.GetBytes(passwordKey);
var iv = Encoding.UTF8.GetBytes(passwordKey);

private byte[] EncryptStringToBytes(string plainText, byte[] key, byte[] iv)
{
try
{
// Check arguments.
if (plainText == null || plainText.Length <= 0)
{
throw new ArgumentNullException("plainText");
}
if (key == null || key.Length <= 0)
{
throw new ArgumentNullException("key");
}
if (iv == null || iv.Length <= 0)
{
throw new ArgumentNullException("key");
}
byte[] encrypted;
// Create a RijndaelManaged object
// with the specified key and IV.
using (var rijAlg = new RijndaelManaged())
{
rijAlg.Mode = CipherMode.CBC;
rijAlg.Padding = PaddingMode.PKCS7;
rijAlg.FeedbackSize = 128;

rijAlg.Key = key;
rijAlg.IV = iv;

// Create a decrytor to perform the stream transform.
var encryptor = rijAlg.CreateEncryptor(rijAlg.Key, rijAlg.IV);

// Create the streams used for encryption.
using (var msEncrypt = new MemoryStream())
{
using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (var swEncrypt = new StreamWriter(csEncrypt))
{
//Write all data to the stream.
swEncrypt.Write(plainText);
}
encrypted = msEncrypt.ToArray();
}
}
}
// Return the encrypted bytes from the memory stream.
return encrypted;
}
catch (Exception ex)
{
throw ex;
//LoggerCS.logError("Utility", "EncryptStringToBytes", JsonConvert.SerializeObject(null), ex.ToString(), ex.StackTrace);
}
return null;
}

使用的 keyString 和 IV 值在 C# 中相同,并且使用 Utf8 加密。在 Node JS 中寻找等效的操作。

最佳答案

TLDR;

您使用的是不同的 IV 和算法(AES-128 与 AES-256),因此您将得到不同的结果......

如果您想获得相同的结果,您将需要使用相同的 IV 以及相同的 key 和算法。 这将是一种反模式(即不要这样做)! 检查约翰关于您如何忽略代码中的算法变量的评论,因为快速浏览一下,不同的 IV 负责为什么您会得到不同的结果。

更长的答案;

1)您实际上想要它,以便使用相同 key 加密的相同消息(纯文本)并不总是产生相同的加密结果(密文)。否则,任何窃听方将始终知道何时再次发送了重复消息。

2) 初始化向量 (IV) 用于提供随机性,以便在使用给定 key 时,相同的纯文本不会总是产生相同的密文。

3)这意味着要解密消息,您不仅需要知道 key ,还需要知道 IV。

4) IV 应该是随机的,并且不是从 key 确定性地派生的,否则每次使用相同的 key 都将具有相同的 IV,因此每次加密相同的纯文本时都会产生相同的密文。 (让您容易受到窃听者观察收到的给定消息的结果并开始确定消息的含义)。

看看这个问题的答案AES Encryption - Key versus IV还有这个维基百科条目http://en.wikipedia.org/wiki/Initialization_vector了解更多信息。

关于javascript - Node JS 和 C# 中的 AES 加密给出了不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62447098/

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