【问题标题】:Encryption and Decryption in javascript and c# add password filed in c# codejavascript和c#中的加密和解密在c#代码中添加密码字段
【发布时间】:2018-11-24 21:42:12
【问题描述】:

我在 c# 中找到了这段代码。这是一个愚蠢的问题,但我对加密一无所知。此代码加密和解密,但没有密码字段我应该放在哪里。这是我发现的与 java-script 代码兼容的代码,所以我真的希望它最终能够工作。谢谢:

using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using System.Security.Cryptography;
using System.Diagnostics;

using System.IO;
namespace Rextester
{
    class Program
    {
        public static void Main(string[] args)
        {
            string s = "Please enter UserName";

            var encry = EncryptStringAES(s);
            var dec = DecryptStringAES(encry);


            Console.WriteLine(encry);
            Console.WriteLine(dec);

            Console.Write("Press any key to continue . . . ");
            Console.ReadKey(true);
        }







  public static string DecryptStringAES(string cipherText)
        {
            var keybytes = Encoding.UTF8.GetBytes("8080808080808080");
            var iv = Encoding.UTF8.GetBytes("8080808080808080");

            var encrypted = Convert.FromBase64String(cipherText);
            var decriptedFromJavascript = DecryptStringFromBytes(encrypted, keybytes, iv);
            return string.Format(decriptedFromJavascript);
        } 
        private static string DecryptStringFromBytes(byte[] cipherText, byte[] key, byte[] iv)
        {
            // Check arguments.  
            if (cipherText == null || cipherText.Length <= 0)
            {
                throw new ArgumentNullException("cipherText");
            }
            if (key == null || key.Length <= 0)
            {
                throw new ArgumentNullException("key");
            }
            if (iv == null || iv.Length <= 0)
            {
                throw new ArgumentNullException("key");
            }

            // Declare the string used to hold  
            // the decrypted text.  
            string plaintext = null;

            // Create an RijndaelManaged object  
            // with the specified key and IV.  
            using (var rijAlg = new RijndaelManaged())
            {
                //Settings  
                rijAlg.Mode = CipherMode.CBC;
                rijAlg.Padding = PaddingMode.PKCS7;
                rijAlg.FeedbackSize = 128;

                rijAlg.Key = key;
                rijAlg.IV = iv;

                // Create a decrytor to perform the stream transform.  
                var decryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.IV);

                try
                {
                    // Create the streams used for decryption.  
                    using (var msDecrypt = new MemoryStream(cipherText))
                    {
                        using (var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                        {

                            using (var srDecrypt = new StreamReader(csDecrypt))
                            {
                                // Read the decrypted bytes from the decrypting stream  
                                // and place them in a string.  
                                plaintext = srDecrypt.ReadToEnd();

                            }

                        }
                    }
                }
                catch
                {
                    plaintext = "keyError";
                }
            }

            return plaintext;
        }

        public static string EncryptStringAES(string plainText)
        {
            var keybytes = Encoding.UTF8.GetBytes("8080808080808080");
            var iv = Encoding.UTF8.GetBytes("8080808080808080");

            var encryoFromJavascript = EncryptStringToBytes(plainText, keybytes, iv);
            return Convert.ToBase64String(encryoFromJavascript);
        }  


        private static byte[] EncryptStringToBytes(string plainText, byte[] key, byte[] iv)
        {
            // Check arguments.  
            if (plainText == null || plainText.Length <= 0)
            {
                throw new ArgumentNullException("plainText");
            }
            if (key == null || key.Length <= 0)
            {
                throw new ArgumentNullException("key");
            }
            if (iv == null || iv.Length <= 0)
            {
                throw new ArgumentNullException("key");
            }
            byte[] encrypted;
            // Create a RijndaelManaged object  
            // with the specified key and IV.  
            using (var rijAlg = new RijndaelManaged())
            {
                rijAlg.Mode = CipherMode.CBC;
                rijAlg.Padding = PaddingMode.PKCS7;
                rijAlg.FeedbackSize = 128;

                rijAlg.Key = key;
                rijAlg.IV = iv;

                // Create a decrytor to perform the stream transform.  
                var encryptor = rijAlg.CreateEncryptor(rijAlg.Key, rijAlg.IV);

                // Create the streams used for encryption.  
                using (var msEncrypt = new MemoryStream())
                {
                    using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                    {
                        using (var swEncrypt = new StreamWriter(csEncrypt))
                        {
                            //Write all data to the stream.  
                            swEncrypt.Write(plainText);
                        }
                        encrypted = msEncrypt.ToArray();
                    }
                }
            }
            // Return the encrypted bytes from the memory stream.  
            return encrypted;
        }

}


}

java-script 我知道把密码放在哪里,但在 c# 中我不知道:

<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js "></script>
    <script type="text/javascript">

        function SubmitsEncry() {

        debugger;
        var txtUserName = "Please enter UserName";

        var key = CryptoJS.enc.Utf8.parse('8080808080808080');
        var iv = CryptoJS.enc.Utf8.parse('8080808080808080');

        var encrypted = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(txtUserName),'1', key,
        {
            keySize: 128 / 8,
            iv: iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        });
        var decrypted = CryptoJS.AES.decrypt(encrypted,'1', key,
           {
               keySize: 128 / 8,
               iv: iv,
               mode: CryptoJS.mode.CBC,
               padding: CryptoJS.pad.Pkcs7
           });
        alert(encrypted);
    }
    SubmitsEncry();


    </script>

【问题讨论】:

  • 您认为,如果您对加密和密码学一无所知,那么实施和使用它对您来说是个好主意吗?此外,如果您使用此代码来加密 Javascript 应用程序/网站和 C# 服务器之间的通信,那么您做的事情非常非常错误。请改用 TLS/HTTPS。另请注意,如果您将它用于我上面所说的内容,那么您拥有的代码非常不安全并且容易被破坏。
  • 我需要客户端加密我找到了像 staticrypt 这样的工具,但我需要像我想要的那样进行自定义,所以我想在 c# 中创建程序来加密多个 HTML 文件的一部分,然后通过 java-script 使用加密对其进行解密-js 我知道我有很多 ststic html 文件,我需要其中的一部分仅通过加密进行保护
  • 让我这样表述,因为我无法准确理解您所说的您需要什么:为什么不能使用 HTTPS?
  • 如果您的意思是在线保护,我希望离线保护生成编译的 HTML 书籍 .. 不使用网络
  • 好的...那么 HTML 文件中的 Javascript 是否将用于解密 HTML 的加密部分?是“自给自足”的吗? Javascript代码在哪里?

标签: javascript encryption passwords


【解决方案1】:

我不确定我是否完全理解你的问题,但如果它看起来很简单,你总是可以 Ctrl-F 在 C# 代码中找到关键。是以var keybytes = Encoding.UTF8.GetBytes("80...开头的那一行

但是,您拥有的代码并不能满足您的需求。它不安全且容易被破坏(因为密钥实际上是代码中)。总体而言,您对密码学缺乏了解也会限制您创建我认为您所设想的解决方案的能力。

一些建议:

  • 如果您想使用密码,您需要了解这与密钥有根本的不同。使用 KDF 从密码中派生密钥。 PBKDF2 不错。
  • 不要使用固定的 IV。如果 IV 保持不变,那么您就破坏了加密。每次加密都应该不同。它根本不需要保密,只是不同。
  • 如果可以,请使用身份验证模式 (GCM),否则使用 HMAC 来验证您的密文。如果您不这样做,任何人都可以更改文件的内容(即使它是加密的),而您将不知道发生了这种情况。

我建议您查看this repository 中的示例。 C# 和浏览器 JavaScript 都有示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    相关资源
    最近更新 更多