理解加密:常见算法及其应用

在信息安全领域,加密技术被广泛用于保护数据的机密性。加密的核心目的是将明文信息转化为密文,以防止未经授权的访问和数据泄露。本文将介绍几种常见的加密算法,包括对称加密、非对称加密和哈希算法,并提供 C# 代码示例,以帮助理解这些技术。

1. 加密算法的分类
1.1 对称加密

对称加密使用相同的密钥进行加密和解密。这种方法的优点是速度快,适合加密大数据量。但其缺点在于,密钥的安全传输是一个挑战,因为任何知道密钥的人都能解密信息。

常见的对称加密算法:

  • AES (Advanced Encryption Standard): 广泛使用的加密标准,支持128、192和256位的密钥长度。
  • DES (Data Encryption Standard): 一种较旧的加密标准,密钥长度为56位,不再安全。
  • 3DES (Triple DES): 对 DES 的改进,通过对数据进行三次加密来增强安全性。

C# 示例代码 (AES 加密):

using System;  
using System.IO;  
using System.Security.Cryptography;  
using System.Text;  class AesEncryption  
{  public static string Encrypt(string plainText, string key)  {  using (Aes aes = Aes.Create())  {  aes.Key = Encoding.UTF8.GetBytes(key); // 必须为 16, 24 或 32 字节长  aes.GenerateIV(); // 生成随机初始向量  using (MemoryStream ms = new MemoryStream())  {  ms.Write(aes.IV, 0, aes.IV.Length); // 将IV写入流  using (CryptoStream cs = new CryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write))  {  using (StreamWriter sw = new StreamWriter(cs))  {  sw.Write(plainText);  }  }  return Convert.ToBase64String(ms.ToArray());  }  }  }  public static string Decrypt(string cipherText, string key)  {  byte[] fullCipher = Convert.FromBase64String(cipherText);  using (Aes aes = Aes.Create())  {  aes.Key = Encoding.UTF8.GetBytes(key);  byte[] iv = new byte[aes.BlockSize / 8];  Array.Copy(fullCipher, iv, iv.Length); // 取得 IV  using (MemoryStream ms = new MemoryStream(fullCipher, iv.Length, fullCipher.Length - iv.Length))  {  using (CryptoStream cs = new CryptoStream(ms, aes.CreateDecryptor(aes.Key, iv), CryptoStreamMode.Read))  {  using (StreamReader sr = new StreamReader(cs))  {  return sr.ReadToEnd();  }  }  }  }  }  
}  // 用法示例  
public class Program  
{  public static void Main()  {  string key = "1234567890123456"; // AES 密钥 (16 字节)  string original = "Hello, World!";  string encrypted = AesEncryption.Encrypt(original, key);  Console.WriteLine($"Encrypted: {encrypted}");  string decrypted = AesEncryption.Decrypt(encrypted, key);  Console.WriteLine($"Decrypted: {decrypted}");  }  
}
1.2 非对称加密

非对称加密使用一对密钥:公钥和私钥。公钥用于加密,私钥用于解密。这种方式的优点在于公钥可以公开而不影响安全性,但加密的速度通常比对称加密慢。

常见的非对称加密算法:

  • RSA (Rivest-Shamir-Adleman): 常用于安全数据传输,密钥长度通常为2048位或更长。
  • DSA (Digital Signature Algorithm): 主要用于数字签名而非加密。

C# 示例代码 (RSA 加密):

using System;  
using System.Security.Cryptography;  
using System.Text;  class RsaEncryption  
{  public static (string publicKey, string privateKey) GenerateKeys()  {  using (RSA rsa = RSA.Create())  {  return (Convert.ToBase64String(rsa.ExportRSAPublicKey()), Convert.ToBase64String(rsa.ExportRSAPrivateKey()));  }  }  public static string Encrypt(string plainText, string publicKey)  {  using (RSA rsa = RSA.Create())  {  rsa.ImportRSAPublicKey(Convert.FromBase64String(publicKey), out _);  byte[] data to encrypt = Encoding.UTF8.GetBytes(plainText);  return Convert.ToBase64String(rsa.Encrypt(data, RSAEncryptionPadding.OaepSHA256));  }  }  public static string Decrypt(string cipherText, string privateKey)  {  using (RSA rsa = RSA.Create())  {  rsa.ImportRSAPrivateKey(Convert.FromBase64String(privateKey), out _);  byte[] data to decrypt = Convert.FromBase64String(cipherText);  return Encoding.UTF8.GetString(rsa.Decrypt(dataToDecrypt, RSAEncryptionPadding.OaepSHA256));  }  }  
}  // 用法示例  
public class Program  
{  public static void Main()  {  var (publicKey, privateKey) = RsaEncryption.GenerateKeys();  Console.WriteLine($"Public Key: {publicKey}");  Console.WriteLine($"Private Key: {privateKey}");  string original = "Hello, World!";  string encrypted = RsaEncryption.Encrypt(original, publicKey);  Console.WriteLine($"Encrypted: {encrypted}");  string decrypted = RsaEncryption.Decrypt(encrypted, privateKey);  Console.WriteLine($"Decrypted: {decrypted}");  }  
}
1.3 哈希算法

哈希算法是一种将数据转换为固定大小字符串的方式,通常用于数据完整性校验,而不仅仅是保护机密性。哈希过程是不可逆的,但攻击者可以尝试暴力破解或者用彩虹表来获得原始数据。

常见的哈希算法:

  • MD5: 已被认为不再安全,容易受到碰撞攻击。
  • SHA-1: 也被认为不再安全,建议用更强的 SHA-256 或 SHA-512。
  • SHA-256: 当前推荐的哈希算法之一,安全性强。

C# 示例代码 (SHA-256 哈希):

using System;  
using System.Security.Cryptography;  
using System.Text;  class Hashing  
{  public static string ComputeSha256Hash(string rawData)  {  using (SHA256 sha256Hash = SHA256.Create())  {  byte[] bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(rawData));  StringBuilder builder = new StringBuilder();  foreach (byte b in bytes)  {  builder.Append(b.ToString("x2")); // 转换为十六进制字符串  }  return builder.ToString();  }  }  
}  // 用法示例  
public class Program  
{  public static void Main()  {  string original = "Hello, World!";  string hash = Hashing.ComputeSha256Hash(original);  Console.WriteLine($"SHA-256 Hash: {hash}");  }  
}

总结

加密技术在现代信息安全中扮演着重要角色。对称加密和非对称加密各有优缺点,适用于不同的场景,而哈希算法则主要用于确保数据的完整性。在选择加密算法时,应考虑安全性、性能和数据的性质。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/60262.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习】- 模型复杂度vs模型误差

目录 0.引言1.模型复杂度vs模型误差1.1. 模型误差的分类1.2 模型复杂度与误差的关系1.3 偏差-方差权衡(Bias-Variance Tradeoff)1.4 可视化:误差与复杂度1.5 如何选择模型复杂度?1.6 总结 2.方差描述含义:2.1 方差的定…

大数据调度组件之Apache DolphinScheduler

Apache DolphinScheduler 是一个分布式易扩展的可视化 DAG 工作流任务调度系统。致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用。 主要特性 易于部署,提供四种部署方式,包括Standalone、Cluster、Docker和…

什么是SEO中的博客评论?

博客评论通过为其他网站提供价值来帮助你建立反向链接。 例如,你在你的网站上发布烘焙技巧。你可以在一个很受欢迎的食谱博客上评论巧克力饼干的帖子: “多么美味的食谱啊!”为了防止饼干在烤箱里散开,试着在烘烤前将面团冷却至…

插件元器件焊接错了该怎么处理指南!!!

前言:编写不易,请勿搬运,仅供学习!!! 目录 插件引脚焊接标准 ​编辑 板子不平如何焊接插件 电烙铁快速焊接插件 焊接把过孔封住怎么办 焊接插件元器件焊错了怎么处理 电烙铁焊接贴片 插件引脚焊接标准…

高级java每日一道面试题-2024年11月18日-基本篇-Java创建对象有几种方法?

如果有遗漏,评论区告诉我进行补充 面试官: Java创建对象有几种方法? 我回答: 在 Java 中,创建对象有多种方法。以下是常见的几种方法及其详细解释: 1. 使用 new 关键字 这是最常见的创建对象的方法。通过调用类的构造方法来创建对象。 MyClass ob…

【软考】系统架构设计师-信息安全技术基础

信息安全核心知识点 信息安全5要素:机密性、完整性、可用性、可控性、审查性 信息安全范围:设备安全、数据安全、内容安全、行为安全 网络安全 网络安全的隐患体现在:物理安全性、软件安全漏洞、不兼容使用安全漏洞、选择合适的安全哲理 …

【Node.js】Node.js 和浏览器之间的差异

Node.js 是一个强大的运行时环境,它在现代 JavaScript 开发中扮演着重要角色。然而,许多开发者在使用 Node.js 时常常会感到困惑,尤其是与浏览器环境的对比。本文将深入探讨 Node.js 和浏览器之间的差异,帮助你全面理解两者的设计…

用Python爬虫“偷窥”1688搜索词推荐:一场数据的奇妙冒险

在这个信息爆炸的时代,数据就像是藏在深海里的宝藏,等待着勇敢的探险家去发掘。今天,我们将化身为数据海盗,用Python作为我们的船只,航向1688的海域,去“偷窥”那些神秘的搜索词推荐。准备好了吗&#xff1…

【Redis】redis缓存击穿,缓存雪崩,缓存穿透

一、什么是缓存? 缓存就是与数据交互中的缓冲区,它一般存储在内存中且读写效率高,提高响应时间提高并发性能,如果访问数据的话可以先访问缓存,避免数据查询直接操作数据库,造成后端压力过大。 但是可能会面…

全面解析:HTML页面的加载全过程(一)--输入URL地址,与服务器建立连接

用户输入URL地址,与服务器建立连接 用户在浏览器地址栏输入一个URL 浏览器开始执行以下三步操作操作:url解析、DNS查询、TCP连接 第一步:URL解析 什么是URL? URL(Uniform Resource Locator,统一资源定位符)是互联网…

uni-ui自动化导入

2024年8月6日 https://uniapp.dcloud.net.cn/component/uniui/uni-ui.html 安装 https://www.npmjs.com/package/dcloudio/uni-ui npm i dcloudio/uni-ui配置自动导入功能 在pages.json文件里添加easycom节点: "easycom": {"autoscan": true,"custom…

实验三:构建园区网(静态路由)

目录 一、实验简介 二、实验目的 三、实验需求 四、实验拓扑 五、实验任务及要求 1、任务 1:完成网络部署 2、任务 2:设计全网 IP 地址 3、任务 3:实现全网各主机之间的互访 六、实验步骤 1、在 eNSP 中部署网络 2、配置各主机 IP …

电脑超频是什么意思?超频的好处和坏处

嗨,亲爱的小伙伴!你是否曾经听说过电脑超频?在电脑爱好者的圈子里,这个词似乎非常熟悉,但对很多普通用户来说,它可能还是一个神秘而陌生的存在。 今天,我将带你揭开超频的神秘面纱,…

android 如何获取当前 Activity 的类名和包名

其一:getClass().getSimpleName() public static String getTopActivity(Context context){ ActivityManager am (ActivityManager) context.getSystemService(context.ACTIVITY_SERVICE); ComponentName cn am.getRunningTasks(1).get(0).topAct…

【YOLOv8】安卓端部署-2-项目实战

文章目录 1 准备Android项目文件1.1 解压文件1.2 放置ncnn模型文件1.3 放置ncnn和opencv的android文件1.4 修改CMakeLists.txt文件 2 手机连接电脑并编译软件2.1 编译软件2.2 更新配置及布局2.3 编译2.4 连接手机 3 自己数据集训练模型的部署4 参考 1 准备Android项目文件 1.1…

三十九、Python(pytest框架-中)

一、执行用例的方式 1.工具执行 2.在终端使用命令行运行 命令:pytest -s 用例代码文件 -s 的作用是输出显示代码中的 print。 3.在主函数main中执行 if __name__ "__main__": # 主函数pytest.main([-s, 用例代码文件]) import pytestclass TestDemo…

mybatis的动态sql用法之排序

概括 在最近的开发任务中,涉及到了一些页面的排序,其中最为常见的就是时间的降序和升序。这个有的前端控件就可以完成,但是对于一些无法用前端控件的,只能通过后端来进行解决。 后端的解决方法就是使用mybatis的动态sql拼接。 …

在AndroidStudio中新建项目时遇到的Gradle下载慢问题,配置错的按我的来,镜像地址不知道哪个网页找的,最主要下载要快

android-studio-2024.2.1.11-windows Android 移动应用开发者工具 – Android 开发者 | Android Developers https://r4---sn-j5o76n7z.gvt1-cn.com/edgedl/android/studio/install/2024.2.1.11/android-studio-2024.2.1.11-windows.exe?cms_redirectyes&met1731775…

项目配置文件选择(Json,xml,Yaml, INI)

选择使用哪种类型的配置文件(如 JSON、XML 或其他格式)取决于多个因素,包括项目的需求、团队的熟悉程度、数据结构的复杂性以及可读性和可维护性等。以下是对常见配置文件格式的比较,以及在不同情况下的推荐: 1. JSON&…

Vue学习记录07

列表渲染 v-for 可以使用v-for指令基于一个数组来渲染一个列表。v-for指令的值需要使用 item in items 形式的特殊语法,其中 items 是源数据的数组, 而 item 是迭代项的别名: const items ref([{ message: Foo }, { message: Bar }]) &l…