Я ищу способ зашифровать массив байтов в единстве С# и расшифровать на сервере node.js.
Я открыт для любой реализации любого из них, но в настоящее время я использую приведенный ниже код, который отлично шифрует/дешифрует в единстве, но я получаю сообщение об ошибке:
TypeError: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length
При расшифровке файла, зашифрованного в единстве, с помощью RijndaelManaged 128
Найдите код шифрования и дешифрования ниже:
Шифрование Unity C#
private void GenerateEncryptionKey(string userID)
{
//Generate the Salt, with any custom logic and using the user's ID
StringBuilder salt = new StringBuilder();
for (int i = 0; i < 8; i++)
{
salt.Append("," + userID.Length.ToString());
}
Rfc2898DeriveBytes pwdGen = new Rfc2898DeriveBytes (Encoding.UTF8.GetBytes(userID), Encoding.UTF8.GetBytes(salt.ToString()), 100);
m_cryptoKey = pwdGen.GetBytes(KEY_SIZE / 8);
m_cryptoIV = pwdGen.GetBytes(KEY_SIZE / 8);
}
public void Save(string path)
{
string json = MiniJSON.Json.Serialize(m_saveData);
using (RijndaelManaged crypto = new RijndaelManaged())
{
crypto.BlockSize = KEY_SIZE;
crypto.Padding = PaddingMode.PKCS7;
crypto.Key = m_cryptoKey;
crypto.IV = m_cryptoIV;
crypto.Mode = CipherMode.CBC;
ICryptoTransform encryptor = crypto.CreateEncryptor(crypto.Key, crypto.IV);
byte[] compressed = null;
using (MemoryStream compMemStream = new MemoryStream())
{
using (StreamWriter writer = new StreamWriter(compMemStream, Encoding.UTF8))
{
writer.Write(json);
writer.Close();
compressed = compMemStream.ToArray();
}
}
if (compressed != null)
{
using (MemoryStream encMemStream = new MemoryStream(compressed))
{
using (CryptoStream cryptoStream = new CryptoStream(encMemStream, encryptor, CryptoStreamMode.Write))
{
using (FileStream fs = File.Create(GetSavePath(path)))
{
byte[] encrypted = encMemStream.ToArray();
fs.Write(encrypted, 0, encrypted.Length);
fs.Close();
}
}
}
}
}
}
игнорируйте сжатый бит, я в конечном итоге буду сжимать данные для шифрования, но я удалил его в этом примере.
Расшифровка Node.JS
var sUserID = "hello-me";
var sSalt = "";
for (var i = 0; i < 8; i++)
{
sSalt += "," + sUserID.length;
}
var KEY_SIZE = 128;
crypto.pbkdf2(sUserID, sSalt, 100, KEY_SIZE / 4, function(cErr, cBuffer){
var cKey = cBuffer.slice(0, cBuffer.length / 2);
var cIV = cBuffer.slice(cBuffer.length / 2, cBuffer.length);
fs.readFile("save.sav", function (cErr, cData){
try
{
var cDecipher = crypto.createDecipheriv("AES-128-CBC", cKey, cIV);
var sDecoded = cDecipher.update(cData, null, "utf8");
sDecoded += cDecipher.final("utf8");
console.log(sDecoded);
}
catch(e)
{
console.log(e.message);
console.log(e.stack);
}
});
});
Я считаю, что проблема как-то связана с прокладкой! Я не использую:
cryptoStream.FlushFinalBlock();
при сохранении файла в земле С#, потому что по какой-то причине после этого С# больше не может его расшифровать, и это также не влияет на способность узла расшифровать его, но, может быть, я просто что-то упустил в расшифровка его с дополнением?
Любая помощь приветствуется
byte[] encrypted = encMemStream.ToArray();
читает не из того потока. Должно бытьbyte[] encrypted = cryptoStream .ToArray();
- person Rudolfwm   schedule 14.08.2014