Я хочу отправлять и получать сообщения от сервера и клиента, которые будут симметричны c. это мой серверный код
// Nodejs encryption with CTR
const crypto = require('crypto');
const algorithm = 'aes-256-cbc';
const key = 'b14ca5898a4e4133bbce2ea2315a1916'; //crypto.randomBytes(32);
const iv = crypto.randomBytes(16);
function encrypt(text) {
let cipher = crypto.createCipheriv('aes-256-cbc', Buffer.from(key), iv);
let encrypted = cipher.update(text);
encrypted = Buffer.concat([encrypted, cipher.final()]);
return { iv: iv.toString('hex'), encryptedData: encrypted.toString('hex') };
}
function decrypt(text) {
let iv = Buffer.from(text.iv, 'hex');
let encryptedText = Buffer.from(text.encryptedData, 'hex');
let decipher = crypto.createDecipheriv('aes-256-cbc', Buffer.from(key), iv);
let decrypted = decipher.update(encryptedText);
decrypted = Buffer.concat([decrypted, decipher.final()]);
return decrypted.toString();
}
var hw =encrypt("hello")
console.log(hw)
console.log(decrypt(hw))
я использую buffer.allac(16)
, чтобы заполнить мой iv
также нулем.
и мой c# код
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using UnityEngine;
public class AESManager
{
public static string EncryptString(string key, string plainText)
{
byte[] iv = new byte[16];
for (int i = 0; i < iv.Length; i++)
{
iv[i] = 00;
Debug.Log(iv[i]);
}
byte[] array;
using (Aes aes = Aes.Create())
{
aes.Key = Encoding.UTF8.GetBytes(key);
aes.IV = iv;
Debug.Log(aes.IV.ToString());
ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);
using (MemoryStream memoryStream = new MemoryStream())
{
using (CryptoStream cryptoStream = new CryptoStream((Stream)memoryStream, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter streamWriter = new StreamWriter((Stream)cryptoStream))
{
streamWriter.Write(plainText);
}
array = memoryStream.ToArray();
}
}
}
return Convert.ToBase64String(array);
}
public static string DecryptString(string key, string cipherText)
{
byte[] iv = new byte[16];
byte[] buffer = Convert.FromBase64String(cipherText);
using (Aes aes = Aes.Create())
{
aes.Key = Encoding.UTF8.GetBytes(key);
aes.IV = iv;
ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
using (MemoryStream memoryStream = new MemoryStream(buffer))
{
using (CryptoStream cryptoStream = new CryptoStream((Stream)memoryStream, decryptor, CryptoStreamMode.Read))
{
using (StreamReader streamReader = new StreamReader((Stream)cryptoStream))
{
return streamReader.ReadToEnd();
}
}
}
}
}
}
также
var key = "b14ca5898a4e4133bbce2ea2315a1916";
var str = "hello";
var encryptedString = AESManager.EncryptString(key, str);
Debug.Log($"encrypted string = {encryptedString}");
var decryptedString = AESManager.DecryptString(key, encryptedString);
Debug.Log($"decrypted string = {decryptedString}");
но когда я использую зашифрованный текст с сервера и пытаюсь расшифровать его на c#, я получил ошибку.
это мое зашифрованное сообщение на c#
AGgmltmcfUesIsJeKKY9VA==
and this i my encrypted message on nodejs
a852cd599eaea863c0565ee6013f9bfd
кто-нибудь может мне помочь?