系列目录:

  • 程序员之网络安全系列(一):为什么要关注网络安全?
  • 程序员之网络安全系列(二):如何安全保存用户密码及哈希算法
  • 程序员之网络安全系列(三):数据加密之对称加密算法
  • 程序员之网络安全系列(四):数据加密之非对称秘钥
  • 程序员之网络安全系列(五):数字证书以及12306的证书问题
  • 程序员之网络安全系列(六):动态密码

前文回顾

假如,明明和丽丽相互不认识,明明想给丽丽写一封情书,让隔壁老王送去

  1. 如何保证隔壁老王不能看到情书内容?(保密性)
  2. 如何保证隔壁老王不修改情书的内容?(完整性)
  3. 如何保证隔壁老王不冒充明明?(身份认证)
  4. 如何保证明明不能否认情书是自己写的?(来源的不可否认)

上一节,我们使用了Hash算法保证了情书的完整性,也就是确保“隔壁王叔叔”没有修改明明的情书,那么这一节我们来看看如何保证“隔壁王叔叔”不能看到情书的内容,也就是保密性。

数据加密

要想不让别人看到数据,那么我们就们就需要对数据加密。

加密技术 是最常用的安全保密手段,利用技术手段把重要的数据变为乱码(加密)传送,到达目的地后再用相同或不同的手段还原(解密)。
加密包括两个元素:算法和密钥。一个加密算法是将普通的文本(或者可以理解的信息)与一窜数字(密钥)的结合,产生不可理解的密文的步骤,密钥是用来对数据进行编码和解码的一种算法。

举个例子:

假设我们要对LOVE加密,我们可以先定义字母的顺序ABCDEFGHIJKLMNOPQRSTUVWXYZ,然后我们让每个字母向后移动两位,那么LOVE就变为了NQXG

L------>N
O------>Q
V------>X
E------>
LOVE--->NQXG

我想这就是最简单的加密方式。

密钥加密技术的密码体制分为对称密钥体制和非对称密钥体制两种。

对数据加密的技术分为两类,即对称加密(私人密钥加密)和非对称加密(公开密钥加密)。对称加密以数据加密标准(DES,Data Encryption Standard)算法为典型代表,非对称加密通常以RSA(Rivest Shamir Ad1eman)算法为代表。对称加密的加密密钥和解密密钥相同,而非对称加密的加密密钥和解密密钥不同,加密密钥可以公开而解密密钥需要保密。

对称加密

对称加密采用了对称密码编码技术,它的特点是文件加密和解密使用相同的密钥,即加密密钥也可以用作解密密钥。
比如,我们给WORD文档设置密码1234, 那么其他人想要打开文档也必须输入1234才能打开。

常用加密算法:

  • DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合。
  • 3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高。
  • AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高;
  • RC4,也是为 RSA Data Security, Inc. 开发的密码系统的商标名称。

传统的DES由于只有56位的密钥,从1997年开始,RSA公司发起了一个称作“向DES挑战”的竞技赛。在首届挑战赛上,罗克·维瑟用了96天时间破解了用DES加密的一段信息。1999年12月22日,RSA公司发起“第三届DES挑战赛(DES Challenge III)”。2000年1月19日,由电子边疆基金会组织研制的25万美元的DES解密机以22.5小时的战绩,成功地破解了 DES加密算法。DES已逐渐完成了它的历史使命。

高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

对称加密算法的优点:

  • 算法公开
  • 计算量小
  • 加密速度快,加密效率高

对称加密算法的缺点

  • 加解密双方需要使用相同的秘钥
  • 秘钥管理很不方便,如果用户很多,那么秘钥的管理成几何性增长
  • 任何一方秘钥泄露,数据都不安全了

最后

通过本节,我们知道当明明给丽丽情书时,可以用DES或者AES对数据进行加密,即使“隔壁王叔叔”拿到信件也看不懂内容,同时使用上一节的Hash算法保证了情书的内容完整,但是这就需要明明和丽丽提前设置一个秘钥。

代码示例

下面的代码输出如下结果

    I Love You, Li LiEncrypeted: 0t9glwGMmwtGs8B4QCotyZkKf091WElCwG659QiVVw0=Decrypeted: I Love You, Li Li

.NET 源码:

    using System;using System.Security.Cryptography;using System.IO;using System.Text;namespace AES{class MainClass{public static void Main (string[] args){string password = "Don't believe wang shu shu";string orginTextToSent = "I Love You, Li Li";Console.WriteLine (orginTextToSent);string encryptedText=EncryptText(orginTextToSent, password);Console.WriteLine ("Encrypeted: " + encryptedText);string DecryptedText = DecryptText (encryptedText, password);Console.WriteLine ("Decrypeted: " + DecryptedText);}public static byte[] AES_Encrypt(byte[] bytesToBeEncrypted, byte[] passwordBytes){byte[] encryptedBytes = null;// Set your salt here, change it to meet your flavor:// The salt bytes must be at least 8 bytes.byte[] saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };using (MemoryStream ms = new MemoryStream()){using (RijndaelManaged AES = new RijndaelManaged()){AES.KeySize = 256;AES.BlockSize = 128;var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);AES.Key = key.GetBytes(AES.KeySize / 8);AES.IV = key.GetBytes(AES.BlockSize / 8);AES.Mode = CipherMode.CBC;using (var cs = new CryptoStream(ms, AES.CreateEncryptor(), CryptoStreamMode.Write)){cs.Write(bytesToBeEncrypted, 0, bytesToBeEncrypted.Length);cs.Close();}encryptedBytes = ms.ToArray();}}return encryptedBytes;}public static byte[] AES_Decrypt(byte[] bytesToBeDecrypted, byte[] passwordBytes){byte[] decryptedBytes = null;// Set your salt here, change it to meet your flavor:// The salt bytes must be at least 8 bytes.byte[] saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };using (MemoryStream ms = new MemoryStream()){using (RijndaelManaged AES = new RijndaelManaged()){AES.KeySize = 256;AES.BlockSize = 128;var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);AES.Key = key.GetBytes(AES.KeySize / 8);AES.IV = key.GetBytes(AES.BlockSize / 8);AES.Mode = CipherMode.CBC;using (var cs = new CryptoStream(ms, AES.CreateDecryptor(), CryptoStreamMode.Write)){cs.Write(bytesToBeDecrypted, 0, bytesToBeDecrypted.Length);cs.Close();}decryptedBytes = ms.ToArray();}}return decryptedBytes;}public static string EncryptText(string input, string password){// Get the bytes of the stringbyte[] bytesToBeEncrypted = Encoding.UTF8.GetBytes(input);byte[] passwordBytes = Encoding.UTF8.GetBytes(password);// Hash the password with SHA256passwordBytes = SHA256.Create().ComputeHash(passwordBytes);byte[] bytesEncrypted = AES_Encrypt(bytesToBeEncrypted, passwordBytes);string result = Convert.ToBase64String(bytesEncrypted);return result;}public static string DecryptText(string input, string password){// Get the bytes of the stringbyte[] bytesToBeDecrypted = Convert.FromBase64String(input);byte[] passwordBytes = Encoding.UTF8.GetBytes(password);passwordBytes = SHA256.Create().ComputeHash(passwordBytes);byte[] bytesDecrypted = AES_Decrypt(bytesToBeDecrypted, passwordBytes);string result = Encoding.UTF8.GetString(bytesDecrypted);return result;}}}

程序员之网络安全系列(三):数据加密之对称加密算法相关推荐

  1. 程序员之网络安全系列(六):动态密码

    系列目录 程序员之网络安全系列(一):为什么要关注网络安全? 程序员之网络安全系列(二):如何安全保存用户密码及哈希算法 程序员之网络安全系列(三):数据加密之对称加密算法 程序员之网络安全系列(四) ...

  2. vue函数如何调用其他函数?_好程序员Python教程系列之递归函数与匿名函数调用...

    好程序员Python教程系列递归函数与匿名函数调用,函数是Python技术学习中重要的一个环节,深入掌握该阶段的知识内容,对于Python技术能力的提升非常有帮助,这里就针对递归函数与匿名函数两种函数 ...

  3. cuda默认函数与c++冲突_好程序员Python教程系列-第8讲:函数和模块

    好程序员Python教程系列-第8讲:函数和模块,在讲解本章节的内容之前,我们先来研究一道数学题,请说出下面的方程有多少组正整数解. 事实上,上面的问题等同于将8个苹果分成四组每组至少一个苹果有多少种 ...

  4. 程序员编程艺术第一~三十八章集锦与总结,及Github地址、PDF下载

    程序员编程艺术第1~38章集锦与总结,及Github.PDF下载 前言 熟悉本blog的朋友大都知道,在2010年刚开始写本博客之际,我整理过一个微软面试100题,后来我为这100题开始发帖讨论,写答 ...

  5. 程序员的奋斗史(三十七)——大学断代史(一)——开篇

    文/温国兵 想了很久,还是决定写一系列文章来祭奠下逝去的青春.至于怎么组织,还是决定以话题的形式.如果你要问我为什么取名<大学断代史>,这可得益于高中语文老师.可敬的语文老师写了一本书,名 ...

  6. 程序员真实故事系列 ---阅读书籍计划

     [转帖][程序员真实故事系列@个人特别推荐阅读@] 标 题: 一个人的奋斗历程 这些日子我一直在写一个实时操作系统内核,已有小成了,等写完我会全部公 开,希望能够为国内IT的发展尽自己一份微薄的力量 ...

  7. 程序员编程艺术第一 三十八章集锦与总结,及Github地址 PDF下载

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 程序员编 ...

  8. 雷军:《我十年的程序员生涯》系列之三(失败的大学创业经历)

    // 转载自雷军2008年11月10日写的博客.以下内容为博客原文: 不少人想白手起家.空手套狼,在今天的商业社会里这是非常不现实的一件事情.我特别想问:你为什么不能先做能力及资源上的积累后再创业呢? ...

  9. 雷军:《我十年的程序员生涯》系列之二(我赚的第一桶金)

    // 转载自雷军2008年11月5日写的博客.以下内容为博客原文: <我十年的程序员生涯>系列之二:我写BITLOK的这七年 1989年8月,大二暑假,我和王全国合作写了我的第一个正式作品 ...

最新文章

  1. 0308-标签的用法(a,ul/ol,table)
  2. 802.11 帧格式及类型
  3. 重复 桂林电子科技大学第三届ACM程序设计竞赛
  4. 第十九期:程序员节,女朋友偷偷送了我这个...
  5. android:layout 冒号,android-json解析及简单例子(补汉6个汉字字).pdf
  6. Head First Python学习笔记4——处理数据
  7. 【多线程】CountDownLatch 和 CyclicBarrier:如何让多线程步调一致?
  8. 20191026(补):(leetcode习题)最长的斐波那契子序列的长度
  9. ResultSet用法集锦
  10. 分布式系统必读中文版-分布式系统模式-分享
  11. 教你从零开始画echarts地图
  12. LeetCode 中文刷题手册:LeetCode Cookbook下载
  13. 如何备份光猫html文件夹,华为光猫备份jffs2及HG8321R-RMS切换HG8321版本教程
  14. H7000 DTU 问与答
  15. LeetCode 罗马数字
  16. vim 怎么显示空格_vi查看空格、制表符等特殊符号
  17. 洛达AirPods鉴别检测工具AB153x_UT,支持1562a 1562f
  18. php 条形码在线怎么生成,php实现在线生成条形码示例分享(条形码生成器)
  19. 新年拍照好伙伴,vivo S12 Pro前后都精彩
  20. 程序员基础的硬件知识(cpu、主板、显卡、内存条等)

热门文章

  1. Visual C++ 2011-6-6
  2. MySQL中的共享锁与排他锁
  3. 信息系统开发平台OpenExpressApp:【OpenTest】 之 如何实现自动化测试框架
  4. JavaScript对象
  5. 软考中项学习之路--在路上
  6. Windows Store App JavaScript 开发:获取文件和文件夹列表
  7. Oracle alter table详解
  8. Java深度历险:Java注解
  9. Google 选择 Jetty 放弃 Tomcat
  10. 深入浅出ShellExecute