【问题标题】:Encrypting in Unity, decrypting in Node.js在 Unity 中加密,在 Node.js 中解密
【发布时间】:2014-01-21 11:04:20
【问题描述】:

我正在尝试将一些数据从 Unity 发送到 Node.js Express 服务器,反之亦然。

这是我用 C# 编写的 Unity 代码:

public string Encrypt(string toEncrypt, string key, bool useHashing) 
{     

    byte[] keyArray;     
    byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);      

    if (useHashing){               
        MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
        keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));     
    }     
    else {
        keyArray = UTF8Encoding.UTF8.GetBytes(key);      
    }

    var tdes = new TripleDESCryptoServiceProvider();
    tdes.Key = keyArray;
    //tdes.Mode = CipherMode.CBC;  // which is default     
    //tdes.Padding = PaddingMode.PKCS7;  // which is default

    ICryptoTransform cTransform = tdes.CreateEncryptor();     
    byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
    tdes.Clear();
    return Convert.ToBase64String(resultArray, 0, resultArray.Length); 

}

    Dictionary<string, string> data = new Dictionary<string, string>();
    data.Add("Test01", "Tanmoy");
    data.Add("Test02", "Mitra");
    string json = Json.Serialize(data);

    byte[] postData = Encoding.UTF8.GetBytes(Encrypt(json, "12345", true));

    StartCoroutine(HttpPost("test", postData, delegate(string requestError, IDictionary rData) {
        cb(null,rData);
    }));

这是我的 Node.js 代码:

var alg = 'des-ede3-cbc';
var key = new Buffer('123456789012345678901234', 'utf-8');
var iv = new Buffer(m_strApiPass, 'base64');

var encrypted = new Buffer(reqString, 'base64');

var decipher = crypto.createDecipheriv(alg, key, iv);
var decoded = decipher.update(encrypted, 'binary', 'ascii');
decoded += decipher.final('ascii');

我收到此错误:

TypeError:错误:0606506D:数字信封例程:EVP_DecryptFinal_ex:最终块长度错误

我注意到,在 C# 中,我得到了以下字符串,

pySqIdAiJpDOW7XkOQDoblLOtZ382J1G1F1UE16W0Ulg+x5X0Bocjg==

但是当我将此字符串发送到 Node.js 时,它变成:

pySqIdAiJpDOW7XkOQDoblLOtZ382J1G1F1UE16W0Ulg x5X0Bocjg  

可能是什么问题?

【问题讨论】:

  • 我猜对 Unity3D 本身没有太大影响。记录默认值很好,但我只是设置它们。它不太可能让你失去任何性能,并且依赖加密中的默认值是一种危险的游戏。不要忘记添加 MAC,因为这很容易受到 padding oracle 攻击。

标签: c# javascript node.js encryption unity3d


【解决方案1】:

原因很简单:返回的密文由任何观察者随机查找的字节组成。这意味着那里有不映射到字符的字节。这些字节中的信息丢失了。

如果您在传输过程中需要一个字符串,则改为使用 base 64 编码您的密文,然后在接收端再次对其进行解码。

【讨论】:

    猜你喜欢
    • 2012-12-11
    • 1970-01-01
    • 2012-02-03
    • 2013-06-22
    • 2013-11-24
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多