将C#rijndael加密代码实现为javascript

问题描述 投票:0回答:1

我正在从事解密项目。我有一个C#后端代码。基本上我会尝试将此代码转换为javascript。

我正在使用CryptoJS进行加密。顺便说一句,我意识到我指定的是PKCS#7而不是PKCS#5,但是我没有在CryptoJS中找到PKCS#5的库。但是,当我研究此主题时,有人说相同,而有人不同。我花了足够的时间在密码学上,以了解是否是base64,因为我不知道“ c#”,因此可以给您一个很好的答案。我相信是因为我编写的JavaScript代码块几乎可以产生正确的结果。还差几个字符。我将继续比较两者,以查看我的c#代码在做什么,而javascript不是。

这里是c#代码:

 public string GenerateKey () {
        string EncodeAes (string key, string input) {
            var aes = GetCryptoParams (key);
            var plainBytes = Encoding.UTF8.GetBytes (input);
            return Convert.ToBase64String (AesEncrypt (plainBytes, aes));
        }
        RijndaelManaged GetCryptoParams (string key) {
            var keyBytes = new byte[16];
            var secretKeyBytes = Encoding.UTF8.GetBytes (key);
            Array.Copy (secretKeyBytes, keyBytes, Math.Min (keyBytes.Length, secretKeyBytes.Length));
            var aes = new RijndaelManaged {
                Mode = CipherMode.CBC,
                Padding = PaddingMode.PKCS7,
                KeySize = 128,
                BlockSize = 128,
                Key = keyBytes,
                IV = keyBytes
            };

            return aes;
        }
        byte[] AesEncrypt (byte[] plainBytes, RijndaelManaged rijndaelManaged) {
            return rijndaelManaged.CreateEncryptor ()
                .TransformFinalBlock (plainBytes, 0, plainBytes.Length);
        }
        return EncodeAes ("qwertyasdfghzxcv", RandomPassword.Generate (16));
    }

    // POST api/values
    [HttpPost]
    public HttpResponseMessage GetEncDecText ([FromBody] encRequest req) {
        string EncodeAes (string key, string input) {
            var aes = GetCryptoParams (key);
            var plainBytes = Encoding.UTF8.GetBytes (input);
            return Convert.ToBase64String (AesEncrypt (plainBytes, aes));
        }
        string DecodeAes (string key, string thisDecode) {
            var aes = GetCryptoParams (key);
            try {
                var encryptedBytes = Convert.FromBase64String (thisDecode);
                return Encoding.UTF8.GetString (AesDecrypt (encryptedBytes, aes));
            } catch {
                return null;

            }

        }
        RijndaelManaged GetCryptoParams (string key) {
            var keyBytes = new byte[16];
            var secretKeyBytes = Encoding.UTF8.GetBytes (key);
            Array.Copy (secretKeyBytes, keyBytes, Math.Min (keyBytes.Length, secretKeyBytes.Length));
            var aes = new RijndaelManaged {
                Mode = CipherMode.CBC,
                Padding = PaddingMode.PKCS7,
                KeySize = 128,
                BlockSize = 128,
                Key = keyBytes,
                IV = keyBytes
            };

            return aes;
        }
        byte[] AesDecrypt (byte[] encryptedData, RijndaelManaged rijndaelManaged) {
            return rijndaelManaged.CreateDecryptor ()
                .TransformFinalBlock (encryptedData, 0, encryptedData.Length);
        }
        if (req.type == "dec") {
            return Request.CreateResponse (HttpStatusCode.OK, new response () { encText = DecodeAes (req.key, req.text) });
        } else {
            return Request.CreateResponse (HttpStatusCode.BadRequest);
        }

    }

我的JavaScript结果始终是空字符串

这是我的JavaScript代码小提琴。 Key和sampleEncryptedText使用c#代码转换对象。但是在此javascript代码中,它总是返回空字符串。

https://jsfiddle.net/ryoshpa/hj3oewty/21/

所以我如何将c#加密的代码转换为Javascript?

(将我的后端代码java编辑为c#)

javascript c# cryptography aes rijndael
1个回答
1
投票

我会解密使用该代码加密的所有内容,然后将其扔到可能的范围内。然后查找一个好的JS库并重新加密。

问题是:getRawKey将来必定会失败,由于要使用JS "SHA1PRNG",因此需要大量的工作才能使废话在JS中起作用。否则,您必须获取SHA1PRNG的代码并在JS中重新实现。

您已经被警告。

© www.soinside.com 2019 - 2024. All rights reserved.