сообщение c в nodejs и c# симметри - PullRequest
0 голосов
/ 14 апреля 2020

Я хочу отправлять и получать сообщения от сервера и клиента, которые будут симметричны 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

кто-нибудь может мне помочь?

...