加密解密-DES算法和RSA算法

简介: 昨天忽然对加密解密有了兴趣,今天上班查找了一些资料,现在就整理一下吧:) 一.DES算法 这种算法如图所示,这里将描述它的每一个步骤。这个算法进行了16次迭代(圈),把各块明文交织起来与 从密钥中获得的值混合。
昨天忽然对加密解密有了兴趣,今天上班查找了一些资料,现在就整理一下吧:)

一.DES算法

这种算法如图所示,这里将描述它的每一个步骤。这个算法进行了16次迭代(圈),把各块明文交织起来与
从密钥中获得的值混合。这个算法就像织线的织布机一样。明文被分成两根线,密钥就像染料一样在每一圈中
改变线的颜色。结果是一个五颜六色织好的图案。

********** **********
*原始消息 * * 密钥 *
**********
********** || ||
|| || ||
|| ******** ********
********** ********** ********** 3 28位左* *28位右*
* * * * * * *半边 * *半边 *
******** ********
* * * * * * || ||
********** ********** ********** || ||
|| ******** ********
|| *循环移* *循环移*
********** 4 位左边* *位右边*
1 *初始排列* ******** ********
********** || ||
|| || || ||
|| || ******************
2 ********* ********** *排列并扩展到48位*
*左边32位* *右边32位* ******************
********* **********
||
||
**********
*扩展/排列* 5
**********
||
**********
* XOR * 6
**********
||
************
*转换到32位* 7
************
||
**********
* XOR * 8
**********
9
********** **********
*新的左边* *新的右边*
********** **********
||
|| 10 重复超过15次迭代
**************
*翻转初始排列* 11
**************
||
64位明文

下面的例子介绍有关如何把明文和密钥织到一起的一些概念。这里略去复杂的细节(偷懒了吖,俺打字很累的
),有需要的各位大虾可再查询相关资料。
(1)对64位的明文进行修改(排列)以改变位的次序。
(2)接下来,把明文分成两个32位的块左右各32次。
(3)在上图中的密钥一边,原始密钥被分成两半。
(4)密钥的每一半向左循环移位,然后重新合并、排列并扩展到48位。分开的密钥仍然保存起来供以后的
迭代使用。
(5)在上图的明文一边,右侧的32位块被扩展到48为,以便与48位的密钥进行XOR的操作,在这一步还要
进行另一次排列。
(6)把第3步和第5步的结果(明文与密钥)进行XOR操作。
(7)使用置换函数把第6步的结果转换成32位。
(8)把第2步创建的64位值得左边一半与第7步的结果进行XOR操作。
(9)第8步的结果和第2步创建的右半部分共同组成一个新块,前者在右边,后者在左边。
(10)从第4步开始重复着一过程,共迭代15次。
(11)完成最后一次迭代后,对这个64位块进行1此翻转,得到三个64位的密文。
对原始的明文中下一个64位块重复整个过程。注意,为了简洁起见,省略了整个过程的许多复杂细节。
对于DES一直有许多争论。最大的问题是它可能与一个未知的弱点,或者只为NSA所知的弱点。另外还存在
暴力攻击的可能性。所谓暴力攻击是指花费大量钱财,使用很多处理能力以破译密码。有些人认为NSA早已具备
这种潜力。原来DES建议的密钥大小为64为,只是在它被批准成为标准前被减少到56为。有人认为减少密钥的长
度使得美国政府可以使用RSA功能强大的计算机系统破译密码。
DES是第一个公开使用的算法,之后还有许多种块密码的方法。如IDEA等,有兴趣的朋友可自行参阅其他资
料。

用C#实现Des加密和解密

img_a6339ee3e57d1d52bc7d02b338e15a60.gif using  System;
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
using  System.IO;
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
using  System.Security.Cryptography;
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
namespace  Vavic
img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gif
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif {
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif 
/**//// <summary>
img_33d02437d135341f0800e3d415312ae8.gif 
///用C#实现Des加密和解密
img_33d02437d135341f0800e3d415312ae8.gif 
/// Security 的摘要说明。
img_105a1e124122b2abcee4ea8e9f5108f3.gif 
/// </summary>

img_33d02437d135341f0800e3d415312ae8.gif public class Security
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif 
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
img_33d02437d135341f0800e3d415312ae8.gif  
const string KEY_64 = "VavicApp";
img_33d02437d135341f0800e3d415312ae8.gif  
const string IV_64 = "VavicApp"//注意了,是8个字符,64位
img_33d02437d135341f0800e3d415312ae8.gif

img_33d02437d135341f0800e3d415312ae8.gif  
public Security()
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif  
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
img_33d02437d135341f0800e3d415312ae8.gif   
//
img_33d02437d135341f0800e3d415312ae8.gif   
// TODO: 在此处添加构造函数逻辑
img_33d02437d135341f0800e3d415312ae8.gif   
//
img_105a1e124122b2abcee4ea8e9f5108f3.gif
  }

img_33d02437d135341f0800e3d415312ae8.gif
img_33d02437d135341f0800e3d415312ae8.gif  
public static string Encode(string data)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif  
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
img_33d02437d135341f0800e3d415312ae8.gif   
byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(KEY_64);
img_33d02437d135341f0800e3d415312ae8.gif   
byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV_64);
img_33d02437d135341f0800e3d415312ae8.gif
img_33d02437d135341f0800e3d415312ae8.gif   DESCryptoServiceProvider cryptoProvider 
= new DESCryptoServiceProvider();
img_33d02437d135341f0800e3d415312ae8.gif   
int i = cryptoProvider.KeySize;
img_33d02437d135341f0800e3d415312ae8.gif   MemoryStream ms 
= new MemoryStream();
img_33d02437d135341f0800e3d415312ae8.gif   CryptoStream cst 
= new CryptoStream(ms,cryptoProvider.CreateEncryptor(byKey,byIV),CryptoStreamMode.Write);
img_33d02437d135341f0800e3d415312ae8.gif   
img_33d02437d135341f0800e3d415312ae8.gif   StreamWriter sw 
= new StreamWriter(cst);
img_33d02437d135341f0800e3d415312ae8.gif   sw.Write(data);
img_33d02437d135341f0800e3d415312ae8.gif   sw.Flush();
img_33d02437d135341f0800e3d415312ae8.gif   cst.FlushFinalBlock();
img_33d02437d135341f0800e3d415312ae8.gif   sw.Flush();
img_33d02437d135341f0800e3d415312ae8.gif   
return Convert.ToBase64String(ms.GetBuffer(),0,(int)ms.Length);
img_33d02437d135341f0800e3d415312ae8.gif   
img_105a1e124122b2abcee4ea8e9f5108f3.gif  }

img_33d02437d135341f0800e3d415312ae8.gif
img_33d02437d135341f0800e3d415312ae8.gif  
public static string Decode(string data)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif  
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{   
img_33d02437d135341f0800e3d415312ae8.gif   
byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(KEY_64);
img_33d02437d135341f0800e3d415312ae8.gif   
byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV_64);
img_33d02437d135341f0800e3d415312ae8.gif
img_33d02437d135341f0800e3d415312ae8.gif   
byte[] byEnc;
img_33d02437d135341f0800e3d415312ae8.gif   
try
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif   
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
img_33d02437d135341f0800e3d415312ae8.gif    byEnc 
= Convert.FromBase64String(data);
img_105a1e124122b2abcee4ea8e9f5108f3.gif   }

img_33d02437d135341f0800e3d415312ae8.gif   
catch
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif   
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
img_33d02437d135341f0800e3d415312ae8.gif    
return null;
img_105a1e124122b2abcee4ea8e9f5108f3.gif   }

img_33d02437d135341f0800e3d415312ae8.gif
img_33d02437d135341f0800e3d415312ae8.gif   DESCryptoServiceProvider cryptoProvider 
= new DESCryptoServiceProvider();
img_33d02437d135341f0800e3d415312ae8.gif   MemoryStream ms 
= new MemoryStream(byEnc);
img_33d02437d135341f0800e3d415312ae8.gif   CryptoStream cst 
= new CryptoStream(ms,cryptoProvider.CreateDecryptor(byKey,byIV),CryptoStreamMode.Read);
img_33d02437d135341f0800e3d415312ae8.gif   StreamReader sr 
= new StreamReader(cst);
img_33d02437d135341f0800e3d415312ae8.gif   
return sr.ReadToEnd();
img_105a1e124122b2abcee4ea8e9f5108f3.gif  }

img_105a1e124122b2abcee4ea8e9f5108f3.gif }

img_05dd8d549cff04457a6366b0a7c9352a.gif}



二.RSA算法

DES算法在加密解密过程中需要一个key,解码时如果key不对是不行的,因此,对于des算法加密的程序来
说,只要key不泄漏,即使在传输过程中有人监听,也不怕资料曝光。但是这同时又产生一个问题,加密解密
双方都需要同一个key,那么这个key又要怎样才能比较安全的由加密方传送到解密方呢?如果同样是通过网络传
送,那么泄漏的可能性也是非常大的。
使用rsa算法,可以解决上述des算法的问题。rsa模式已经得到全世界的支持,它也是把明文转换成密文的
一种块密码,不同之处是它有两个密钥。创建两个协同工作的密钥时rsa的最重要的特性。这种模式的要点在于
,它可以产生一对密钥,一个人可以用这对密钥中的一个加密消息,而令一个人可以用这对密钥解密消息。同
时任何人都无法通过公钥确定私钥,也没有人能使用加密消息的密钥解密。只有密钥对中的另一把可以解密消
息。
rsa算法的整个流程基本上可以看作是这样的:
假设数据要从甲到乙,于是由乙随机产生一个数据来作为key,我们称之为private key(私钥),这个key自
始至终都只留在乙的机器里不送出来。然后,由这个private key计算出另一个key,我们称之为public key。
这个public key的特性是几乎不可能反演算出private key来。之后再将这个public key通过网络传送给甲机器
,而甲机器将数据用这个public key编码,这个编码过的数据一定得使用private key才解的开,然后甲机器将
编码过的数据通过网络传送给乙,乙再用private key将数据解码。
在整个传送过程中,如果有第三者监听数据时,他只能得到乙传给甲的public key,以及甲用这个public
key编码后的数据,而没有private key,监听者是无法解码的。
接下来让我们步入正题,看看rsa的具体算法是怎样实现的。
首先找出三个数:p,q,r,其中p,q是两个相异的质数,r是与(p-1)(q-1)互质的数,p,q,r这三个数便是
private key。接着,找出一个数m,使得rm==1 mod(p-1)(q-1)。这个m一定存在。因为r与(p-1)(q-1)互质,
所以用辗转相除法就可以得到了m这个数。
接下来再计算n=pq。m、n这两个数便是最后的public key。之后便是编码,其过程是这样的:若资料为a,
将看成是一个大整数,假设a 那么要怎样选取质数才合适呢,上面我们提到选择的质数要越大越好,但事实上质数的选取也有着相同的困难。因为就目前而言,根本没有一个所谓的质数产生公式可以用。
解析数论上有一个定理,当p很大时,质数的分布密度与1/log p成正比,也就是说一个质数和下一个质数的差平均而言与log p成正比,还好log p的成长并不会很快,所以就采用一个方法:一个数接着一个数得找,直到找到质数为止!!!!即使n大到2的512次方,所要花的时间也不会大到天文数字,用486的话,大概在数秒钟至十秒之内会找到(包括判定的时间) 你们谁还用486?我想没有人吧!即使有也是极个别的。那又怎么样去判别一个数是不是质数呢?到目前为止,我所知道的还没有一个很有效的方法来判定。当然我们也可以用试除法,但是要用这个方法的话,2的512次方这么大的数,大概要除个大于10的30次方 年的时间。:)显然是除法是不现实的。还有一个方法,可以利用费马小定理来做判定:假设一个数p,如果p是质数,a的p次方= =a mod p,如果p不是质数,那么a的p次方= = a mod p虽然也有可能成立,但成立的机率非常小,而且p越大时几率越小。用这种方法,我们就找一些质数来测定,比如验证2的p次方= =2 mod p,
3的p次方= = 3 mod p, 5的p次方= =5 mod p ……等式是否成立。如此一来,p是质数的几率就变得非常非常高了。

目录
相关文章
|
6月前
|
存储 搜索推荐 算法
加密算法、排序算法、字符串处理及搜索算法详解
本文涵盖四大类核心技术知识。加密算法部分介绍了对称加密(如 AES)、非对称加密(如 RSA)、哈希摘要(如 SHA-2)、签名算法的特点及密码存储方案(加盐、BCrypt 等)。 排序算法部分分类讲解了比较排序(冒泡、选择、插入、归并、快排、堆排序)和非比较排序(计数、桶、基数排序)的时间复杂度、适用场景及实现思路,强调混合排序的工业应用。 字符串处理部分包括字符串反转的双指针法,及项目中用正则进行表单校验、网页爬取、日志处理的实例。 搜索算法部分详解了二分查找的实现(双指针与中间索引计算)和回溯算法的概念(递归 + 剪枝),以 N 皇后问题为例说明回溯应用。内容全面覆盖算法原理与实践
218 0
|
7月前
|
算法 数据安全/隐私保护
基于混沌加密的遥感图像加密算法matlab仿真
本项目实现了一种基于混沌加密的遥感图像加密算法MATLAB仿真(测试版本:MATLAB2022A)。通过Logistic映射与Baker映射生成混沌序列,对遥感图像进行加密和解密处理。程序分析了加解密后图像的直方图、像素相关性、信息熵及解密图像质量等指标。结果显示,加密图像具有良好的随机性和安全性,能有效保护遥感图像中的敏感信息。该算法适用于军事、环境监测等领域,具备加密速度快、密钥空间大、安全性高的特点。
|
11月前
|
弹性计算 算法 Linux
使用SM4算法加密LUKS格式磁盘
本文介绍了在Anolis 8操作系统使用cryptsetup对磁盘进行分区、加密和挂载的过程。采用SM4加密算法。具体步骤包括:初始化加密卷、解锁加密分区、格式化并挂载设备。最后,展示了如何取消挂载并关闭加密卷以确保数据安全。整个过程确保了磁盘数据的安全性和隐私保护。
885 2
使用SM4算法加密LUKS格式磁盘
|
算法 网络安全 区块链
2023/11/10学习记录-C/C++对称分组加密DES
本文介绍了对称分组加密的常见算法(如DES、3DES、AES和国密SM4)及其应用场景,包括文件和视频加密、比特币私钥加密、消息和配置项加密及SSL通信加密。文章还详细展示了如何使用异或实现一个简易的对称加密算法,并通过示例代码演示了DES算法在ECB和CBC模式下的加密和解密过程,以及如何封装DES实现CBC和ECB的PKCS7Padding分块填充。
305 4
2023/11/10学习记录-C/C++对称分组加密DES
|
算法 数据安全/隐私保护 Python
DES加密初探
本文介绍了Python中常用的DES和3DES加解密方法,包括ECB和CBC模式。通过示例代码展示了如何使用`Crypto`和`pyDes`库实现加解密,并讨论了不同的填充方式。最后,通过一道CTF例题,详细解析了从图像中提取密文、进行ASCII转换、Base64解码、凯撒解码和最终的DES解密过程。
526 4
DES加密初探
|
算法 安全 Go
Go 语言中实现 RSA 加解密、签名验证算法
随着互联网的发展,安全需求日益增长。非对称加密算法RSA成为密码学中的重要代表。本文介绍如何使用Go语言和[forgoer/openssl](https://github.com/forgoer/openssl)库简化RSA加解密操作,包括秘钥生成、加解密及签名验证。该库还支持AES、DES等常用算法,安装简便,代码示例清晰易懂。
348 12
|
算法 安全 Go
RSA加密算法详解与Python和Go实现
RSA加密算法详解与Python和Go实现
1582 1
|
算法 安全 网络安全
使用 Python 实现 RSA 加密
使用 Python 实现 RSA 加密
497 2
|
3月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
382 0