C#加密文本输出我创建了一些小程序,使用StreamWriter将数据导出到文本文件,然后我使用StreamReader读取它们。这工作正常,我做了我需要做的,但我想知道是否有一种方法可以在用户不访问或修改它的情况下保存这些信息,无论是有意还是无意。我会在一个文本文件中有一个例子,如果勾选了一个复选框,当你勾选它时它会输出“Ticked”到一个文本文件,当程序重新打开时我知道表单处于关闭状态。我显然不想继续使用文本文件。有没有人对如何在用户不修改的情况下轻松存储这些信息有任何想法?非常感谢。最简单的方法是使用Base-64编码/解码此文本。这不安全,但可以防止临时用户修改数据。staticpublicstringEncodeTo64(stringtoEncode){byte[]toEncodeAsBytes=System.Text.ASCIIEncoding.ASCII.GetBytes(toEncode);字符串returnValue=System.Convert.ToBase64String(toEncodeAsBytes);返回返回值;}staticpublicstringDecodeFrom64(stringencodedData){byte[]encodedDataAsBytes=System.Convert.FromBase64String(encodedData);字符串returnValue=System.Text.ASCIIEncoding.ASCII.GetString(encodedDataAsBytes);返回返回值;}编辑:真正的加密#region加密字符串passPhrase="密码";//可以是任何字符串stringsaltValue="sALtValue";//可以是任何字符串stringhashAlgorithm="SHA1";//可以是“MD5”intpasswordIterations=7;//可以是任意数字stringinitVector="~1B2c3D4e5F6g7H8";//必须是16字节intkeySize=256;//可以是192或128privatestringEncrypt(stringdata){byte[]bytes=Encoding.ASCII.GetBytes(this.initVector);byte[]rgbSalt=Encoding.ASCII.GetBytes(this.saltValue);字节[]缓冲区=Encoding.UTF8.GetBytes(数据);byte[]rgbKey=newPasswordDeriveBytes(this.passPhrase,rgbSalt,this.hashAlgorithm,this.passwordIterations).GetBytes(this.keySize/8);RijndaelManagedmanaged=newRijndaelManaged();managed.Mode=CipherMode.CBC;ICryptoTransform转换=managed.CreateEncryptor(rgbKey,bytes);MemoryStream流=新的MemoryStream();CryptoStreamstream2=newCryptoStream(stream,transform,CryptoStreamMode.Write);stream2.Write(缓冲区,0,缓冲区。长度);stream2.FlushFinalBlock();byte[]inArray=stream.ToArray();stream.Close();stream2.关闭();返回Convert.ToBase64String(inArray);}privatestringDecrypt(stringdata){byte[]bytes=Encoding.ASCII.GetBytes(this.initVector);byte[]rgbSalt=Encoding.ASCII.GetBytes(this.saltValue);byte[]buffer=Convert.FromBase64String(数据);byte[]rgbKey=newPasswordDeriveBytes(this.passPhrase,rgbSalt,this.hashAlgorithm,this.passwordIterations).GetBytes(this.keySize/8);RijndaelManagedmanaged=newRijndaelManaged();管理。模式=密码模式。加拿大广播公司;ICryptoTransform转换=托管。CreateDecryptor(rgbKey,字节);MemoryStreamstream=newMemoryStream(缓冲区);CryptoStreamstream2=新的CryptoMode。);byte[]buffer5=newbyte[buffer.Length];intcount=stream2.Read(buffer5,0,buffer5.Length);stream.Close();stream2.关闭();返回Encoding.UTF8.GetString(buffer5,0,count);}#endregion您可以向文件添加校验和或散列-如果文件内容与校验和不匹配,您就知道它已被篡改如果重要的是用户无法读取文件内容,您可以加密它。我不相信你可以制作一个不能被篡改的文件(例如,精明的用户可以使用十六进制编辑器进行更改)-你能做的最好的事情就是检测这种篡改。您应该使用每个用户的密钥调用ProtectedData.Protect来加密数据。请注意,熟练的用户解密和修改数据并不是很困难。您的程序在用户机器上所做的任何事情,用户也可以完成。您可以使用Ioniczip库来压缩这些文本文件。如有必要,您还可以使用Ioniczip功能,例如密码保护和加密。您仍然可以使用与创建文件相同的设置自己手动打开文件(使用7zip等压缩应用程序)。如果程序可以访问该信息,则用户通常也可以访问它。但是,您可以生成用户无法立即理解的数据。我首先创建一个包含所有要保存的状态信息的类,然后隔离问题。巧合的是,BinaryFormatter类将允许您轻松地将此类保存到文件或从文件加载此类。我不知道它的结果是否“足够难以辨认”——如果不是,请像Leon提到的那样使用Base64编码。虽然您可以像已经建议的那样对配置数据进行base64编码甚至完全加密(使用SHA1或MD5),但我认为使用处理配置数据的框架类(System.Configuration命名空间下的Configuration)并将其构建为能够加密数据(通过ConfigurationSection类的ProtectSection方法)。首先,您应该声明并初始化一个实例:usingSystem.Configuration;...staticvoidMain(string[]args){配置配置;config=ConfigurationManager.OpenExeConfiguration(/*配置文件路径*/);//UseConfigurationManager.OpenMachineConfiguration(/*pathtoconfigfile*/)whenopeningmachineconfiguration...之后,你需要定义一个定义配置的自定义配置部分(msdn示例)之后,你只需初始化实例自定义配置部分,并将其添加到配置文件中:isTicked=config.Sections.Add("isTicked",customSection);要加密您刚刚添加的部分,请使用此代码(此处包含在VB.NET和C#更多示例中):config.Sections["isTicked"].SectionInformation.ProtectSection("protectionprovider");默认内置“DPAPIProtectedConfigurationProvider”和“RSAProtectedConfigurationProvider”。一旦您想解密该部分,请使用以下代码:config.Sections["isTicked"].SectionInformation.UnprotectSection();只是强调——加密和解密只有在保存配置文件后才会生效。要保存文件,请使用以下代码:config.Save();//config.SaveAs("string")也可以在MSDN中找到有关相关类和方法的更多信息,从上面链接的配置类页面开始。试试这个代码来加密和解密您的文本!我认为它非常简单和强大......publicstaticclassCrypto{privatestaticreadonlybyte[]IVa=newbyte[]{0x0b,0x0c,0x0d,0x0e,0x0f,0x11,0x11,0x12,0x13,0x14,0x15,0x16,0x17};publicstaticstringEncrypt(thisstringtext,stringsalt){try{using(Aesaes=newAesManaged()){Rfc2898DeriveBytesderiveBytes=newRfc2898DeriveBytes(Encoding.UTF8.GetString(IVa,0,IVa.Length),编码.UTF8.GetBytes(盐));aes.Key=deriveBytes.GetBytes(128/8);aes.IV=aes.Key;使用(MemoryStreamencryptionStream=newMemoryStream()){使用(CryptoStreamencrypt=newCryptoStream(encryptionStream,aes.CreateEncryptor(),CryptoStreamMode.Write)){byte[]cleanText=Encoding.UTF8.GetBytes(text);System.Diagnostics.Debug.WriteLine(String.Concat("加密前文本数据大小:",text.Length.ToString()));System.Diagnostics.Debug.WriteLine(String.Concat("加密前字节数据大小:",cleanText.Length.ToString()));恩crypt.Write(cleanText,0,cleanText.Length);加密.FlushFinalBlock();}byte[]encryptedData=encryptionStream.ToArray();字符串encryptedText=Convert.ToBase64String(encryptedData);System.Diagnostics.Debug.WriteLine(String.Concat("加密文本数据大小:",encryptedText.Length.ToString()));System.Diagnostics.Debug.WriteLine(String.Concat("加密字节数据大小:",encryptedData.Length.ToString()));返回加密文本;}}}catch(Exceptione){返回String.Empty;}}publicstaticstringDecrypt(thisstringtext,stringsalt){try{using(Aesaes=newAesManaged()){Rfc2898DeriveBytesderiveBytes=newRfc2898DeriveBytes(Encoding.UTF8.GetString(IVa,0,IVa.Length),编码.UTF8.GetBytes(盐));aes.Key=deriveBytes.GetBytes(128/8);aes.IV=aes.Key;使用(MemoryStreamdecryptionStream=newMemoryStream()){使用(CryptoStreamdecrypt=newCryptoStream(decryptionStream,aes.CreateDecryptor(),CryptoStreamMode.Write)){byte[]encryptedData=Convert.FromBase64String(文本);System.Diagnostics.Debug.WriteLine(String.Concat("加密文本数据大小:",text.Length.ToString()));System.Diagnostics.Debug.WriteLine(String.Concat("加密字节数据大小:",encryptedData.Length.ToString()));decrypt.Write(encryptedData,0,encryptedData.Length);解密。冲洗();}byte[]decryptedData=decryptionStream.ToArray();字符串decryptedText=Encoding.UTF8.GetString(decryptedData,0,decryptedData.Length);System.Diagnostics.Debug.WriteLine(String.Concat("解密后文本数据大小:",decryptedText.Length.ToString()));System.Diagnostics.Debug.WriteLine(String.Concat("解密后字节数据大小:",decryptedData.Length.ToString()));返回解密文本;}}}catch(Exceptione){返回String.Empty;}}}只是为了添加Leon的答案的另一个实现,这里遵循Microsoft文档是一个加密和解密字符串的类的示例publicstaticclassEncryptionExample{#regioninternalconstsinternalconststringpassPhrase=“经过”;内部常量字符串saltValue="salt";内部常量字符串hashAlgorithm="MD5";内部constintpasswordIterations=3;//可以是任何数字internalconststringinitVector="0123456789abcdf";//必须是16字节internalconstintkeySize=64;//可以是192或256#endregion#regionpublicstaticMethodspublicstaticstringEncrypt(stringdata){stringres=string.Empty;尝试{byte[]bytes=Encoding.ASCII.GetBytes(initVector);byte[]rgbSalt=Encoding.ASCII.GetBytes(saltValue);byte[]buffer=Encoding.UTF8.GetBytes(数据);byte[]rgbKey=newPasswordDeriveBytes(passPhrase,rgbSalt,hashAlgorithm,passwordIterations).GetBytes(keySize/8);RijndaelManagedmanaged=newRijndaelManaged();managed.Mode=CipherMode.CBC;ICryptoTransform转换=managed.CreateEncryptor(rgbKey,bytes);byte[]inArray=null;使用(MemoryStreammsEncrypt=newMemoryStream()){使用(CryptoStreamcsEncrypt=newCryptoStream(msEncrypt,转换,CryptoStreamMode.Write)){csEncrypt.Write(buffer,0,buffer.Length);csEncrypt.FlushFinalBlock();inArray=msEncrypt.ToArray();res=Convert.ToBase64String(inArray);}}}catch(Exceptionex){Console.WriteLine("Encrypt"+ex);}返回资源;}publicstaticstringDecrypt(stringdata){stringres=string.Empty;尝试{byte[]bytes=Encoding.ASCII.GetBytes(initVector);byte[]rgbSalt=Encoding.ASCII.GetBytes(saltValue);byte[]buffer=Convert.FromBase64String(数据);byte[]rgbKey=newPasswordDeriveBytes(passPhrase,rgbSalt,hashAlgorithm,passwordIterations).GetBytes(keySize/8);RijndaelManagedmanaged=newRijndaelManaged();managed.Mode=CipherMode.CBC;ICryptoTransform转换=managed.CreateDecryptor(rgbKey,bytes);使用(MemoryStreammsEncrypt=newMemoryStream(缓冲区)){使用(CryptoStreamcsDecrypt=newCryptoStream(msEncrypt,transform,CryptoStreamMode.Read)){使用(StreamReadersrDecrypt=newStream读者(csDecrypt)){res=srDecrypt.ReadToEnd();}}}}catch(Exceptionex){Console.WriteLine("Decrypt"+ex);}返回资源;搜索“盐”的定义,找出它是什么盐。因此,使用一位盐(0或1),这使得加密更难以这种方式破解两次。正如此答案中所指出的,校验和可用于防止无意的字符串修改。然而,生成这样的校验和非常容易,因为它们没有那么多广泛使用的算法。所以这不会保护你免受故意修改。为了防止这种情况,人们使用数字签名。这允许任何人验证您的数据未被篡改,但只有您(私人秘密的所有者)才能生成签名。这是C#中的示例。然而,正如其他人指出的那样,您需要将私钥嵌入二进制文件中的某个位置,并且(不是那么)熟练的程序员将能够检索它,即使您混淆了.netdll或者您正在处理单独的本机。尽管如此,这对于大多数问题来说已经足够了。如果您真的很关心安全性,那么您需要迁移到云端,并在您拥有的计算机上执行代码。以上就是C#学习教程:C#密文输出分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
